您必须在事件处理程序内完成所有绘图。OnPaint
这包括你的线条图。您的OnTimer
事件处理程序不能直接在 PaintBox 上绘制,下次绘制时无论出于何种原因,绘制都将丢失PaintBox
。
您可以做的是让OnTimer
处理程序存储所需的线图坐标,然后Invalidate()
让 PaintBox 发出重新绘制的信号。然后该OnPaint
事件可以在存储的坐标处绘制线。要擦除线,Invalidate()
PaintBox 并根本不画线。
例如:
private:
TPoint lineStartPos;
TPoint lineEndPos;
...
void __fastcall FDisplay::PaintBox1Paint(TObject *Sender)
{
//...
if (!lineStartPos.IsEmpty() && !lineEndPos.IsEmpty())
{
PaintBox1->Canvas->MoveTo(lineStartPos.x, lineStartPos.y);
PaintBox1->Canvas->LineTo(lineEndPos.x, lineEndPos.y);
}
//...
}
void __fastcall FDisplay::TimerLabelsViewTimer(TObject *Sender)
{
//...
PaintBox1->Invalidate();
}
画线:
lineStartPos = Point(693,201);
lineEndPos = Point(770, 187);
PaintBox1->Invalidate();
要擦除该行:
lineStartPos = TPoint();
lineEndPos = TPoint();
PaintBox1->Invalidate();