Paintbox не рисует из таймера методом C++ Builder Borland

Я использую 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();

1 ответ

Вы должны сделать ВСЕ рисование внутри 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();
Другие вопросы по тегам