0

Borland C++Builder 6 を使用しています。

次の形式のメソッドが 2 つあります。

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

最初の方法では、座標系を描画します。

そして2番目の方法で私がした:

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

線は座標系に表示されません。

2 つ目の質問ですが、線を消してベース ペイントに戻すにはどうすればよいですか? これを行う必要がありますか?

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

1 に答える 1

0

イベント ハンドラ内ですべての描画を行う必要があります。OnPaintそれにはあなたの線画も含まれます。イベント ハンドラーはPaintBoxOnTimerに直接描画することはできません。描画はPaintBox、何らかの理由で次に描画されるときに失われます。

代わりにできることは、OnTimerハンドラーに線画の目的の座標を格納させInvalidate()てから、ペイントボックスに再描画の信号を送ることです。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 に答える