0

我正在使用 Borland C++Builder 6。

我有两种形式的方法:

void __fastcall FDisplay::PaintBox1Paint(TObject *Sender)
void __fastcall FDisplay::TimerLabelsViewTimer(TObject *Sender)

在第一种方法中,我绘制坐标系。

在第二种方法中,我做了:

    PaintBox1->Canvas->MoveTo(693,201);
    PaintBox1->Canvas->LineTo(770,187);

并且该线不出现在坐标系上。

我的第二个问题,我怎样才能擦除线条并返回基础油漆?我应该这样做吗?

PaintBox1->Invalidate();
PaintBox1->Update();
4

1 回答 1

0

您必须在事件处理程序内完成所有绘图。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();
于 2015-12-08T23:09:45.750 回答