我有一个不断绘制线条的代码。问题是每次刷新表单时线条都会闪烁。我听说我应该使用双缓冲,但是怎么做呢?我正在使用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 :(得分:2)
当然,您需要移除对Form2->Refresh
的通话。这要求表格立即重绘自己。这无济于事。
其次,您的代码会处理OnPaint
控件的TPaintBox
事件。您应该在TPaintBox
的画布上绘画,而不是在画布的画布上绘画。将所有对this->Canvas
的引用更改为PaintBox1->Canvas
。您可能还需要更正绘画时使用的坐标。
或者,您可以保留现有代码,并完全删除绘图框。在这种情况下,请将当前代码添加到表单的OnPaint
处理程序中。
至于双缓冲,你可以让VCL为你做。将表单的DoubleBuffered
属性设置为true
。这就是你需要做的所有事情,但要注意它会对某些主题中某些控件的视觉外观产生不良后果。对任何问题保持警惕。
如果你想对自己进行双重缓冲,这很容易。创建TBitmap
。适当设置其大小。将您的线条绘制到位图的Canvas
。然后将位图绘制到绘画框画布或表单的画布上。