0

連続して線を引くコードがあります。問題は、フォームが更新されるたびに線がちらつき続けることです。ダブルバッファリングを使うべきだと聞きましたが、どうすればいいですか? 私はc++ビルダー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イベントを処理しますTPaintBoxTPaintBoxフォームのキャンバスではなく、のキャンバスにペイントすることが期待されています。すべての参照をthis->Canvasに変更し、代わりに を参照してくださいPaintBox1->Canvas。ペイント時に使用した座標を修正する必要がある場合もあります。

または、既存のコードを保持し、ペイント ボックスを完全に削除することもできます。OnPaintその場合、現在のコードを取得して、代わりにフォームのハンドラーにアタッチします。

ダブル バッファリングに関しては、VCL に任せることができます。フォームのDoubleBufferedプロパティを に設定しtrueます。必要な作業はこれだけですが、特定のテーマの特定のコントロールの外観に望ましくない結果が生じる可能性があることに注意してください。あらゆる問題に注意してください。

自分自身をダブルバッファリングしたい場合は、簡単です。を作成しますTBitmap。そのサイズを適切に設定します。Canvasビットマップの に線を引きます。次に、ビットマップをペイント ボックス キャンバスまたはフォームのキャンバスに描画します。

于 2014-03-23T14:30:58.277 に答える