如何在C ++ Builder 2010中进行双缓冲?

时间:2014-03-23 14:24:35

标签: c++ doublebuffered 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);
}
}

1 个答案:

答案 0 :(得分:2)

当然,您需要移除对Form2->Refresh的通话。这要求表格立即重绘自己。这无济于事。

其次,您的代码会处理OnPaint控件的TPaintBox事件。您应该在TPaintBox的画布上绘画,而不是在画布的画布上绘画。将所有对this->Canvas的引用更改为PaintBox1->Canvas。您可能还需要更正绘画时使用的坐标。

或者,您可以保留现有代码,并完全删除绘图框。在这种情况下,请将当前代码添加到表单的OnPaint处理程序中。

至于双缓冲,你可以让VCL为你做。将表单的DoubleBuffered属性设置为true。这就是你需要做的所有事情,但要注意它会对某些主题中某些控件的视觉外观产生不良后果。对任何问题保持警惕。

如果你想对自己进行双重缓冲,这很容易。创建TBitmap。适当设置其大小。将您的线条绘制到位图的Canvas。然后将位图绘制到绘画框画布或表单的画布上。