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();