2015-08-12 1 views
0

Я использую Borland C++ Builder 6.Paintbox оленья кожа краска из метода таймера C++ Builder Борланд

У меня есть два метода вида:

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

PaintBox не имеет возможности Undo/Redo так вам нужно 1. реализовать его самостоятельно, копируя базовый gfx в некоторый растровый рисунок, а затем использовать это как начальную точку для каждого перерисовки 2. перерисовать все в однократной рутине (как правило, одна процедура рисования лучше, а также более безопасна) 3. Если ваша строка не пересекает ничего, вы можете просто нарисуйте одну и ту же строку с цветом фона перед тем, как рисовать следующий. – Spektre

+0

Нарушения недействительности и обновления обычно не используются напрямую. Они используются VCL для обработки собственных вещей. Они используются, чтобы планировать/принудить событие «OnPaint» и, возможно, больше. – Spektre

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^