0

我有一个连续画线的代码。问题是每次刷新表单时线条都会闪烁。我听说我应该使用双缓冲,但是怎么做呢?我正在使用 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);
}
}
4

1 回答 1

2

当然,您需要删除对Form2->Refresh. 这要求表单立即重新绘制自己。那无济于事。

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

或者,您可以保留现有代码,并完全删除油漆框。在这种情况下,获取您当前的代码并将其附加到表单的OnPaint处理程序。

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

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

于 2014-03-23T14:30:58.277 回答