Как сделать двойную буферизацию в C ++ Builder 2010?

У меня есть код, который непрерывно рисует линии. Проблема в том, что линии постоянно мерцают при каждом обновлении формы. Я слышал, что я должен использовать двойную буферизацию, но как это сделать? Я использую C ++ Builder 2010. Вот мой код:

void __fastcall TForm2::PaintBox1Paint(TObject *Sender)
{
Form2->Refresh();
TPoint P;
::GetCursorPos( &P );
P = ScreenToClient( P );
int XX;
int YY;
if (P.x<240)
{
XX=15;
YY= ((445-P.y)*(XX-P.x)/(240-P.x)+P.y);
}
else if(P.x==240)
{
XX=240;YY=-5;
}
else
{
XX=465;
YY= ((445-P.y)*(XX-P.x)/(240-P.x)+P.y);
}
int delta=2*(445-YY);
this->Canvas->MoveTo(241,445);
this->Canvas->LineTo(XX,YY);
while(0<YY&&YY<480&&YY!=445)
{
XX=abs(480-XX);
YY-=delta;
this->Canvas->LineTo(XX,YY);
}
}

0

Решение

Конечно, вам нужно удалить звонок Form2->Refresh, Это просит форму перекрасить себя немедленно. Это не может помочь.

Во-вторых, ваш код обрабатывает OnPaint событие TPaintBox контроль. Вы должны рисовать на холсте TPaintBox а не холст формы. Изменить все ссылки на this->Canvas вместо того, чтобы ссылаться на PaintBox1->Canvas, Вам также может понадобиться исправить координаты, используемые при рисовании.

В качестве альтернативы вы могли бы сохранить свой существующий код и вообще удалить ящик для рисования. В этом случае возьмите свой текущий код и приложите его к форме OnPaint обработчик вместо.

Что касается двойной буферизации, вы можете позволить VCL сделать это за вас. Установите форму DoubleBuffered собственность на true, Это все, что вам нужно сделать, хотя имейте в виду, что это может иметь нежелательные последствия для внешнего вида определенного элемента управления в определенных темах. Будьте внимательны при любых проблемах.

Если вы хотите сделать двойную буферизацию, это достаточно просто. Создать TBitmap, Установите его размер соответствующим образом. Нарисуйте свои линии к Canvas растрового изображения. Затем нарисуйте растровое изображение на холсте или на холсте формы.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]