0

私はこのコードを持っています:

TShape* T[256];

/* Other code ... */

for (int i = 255; i > 0; i--) {
     T[i]->Brush->Color = T[i - 1]->Brush->Color;
     T[i]->Pen->Color = T[i - 1]->Pen->Color;
};

サイクルは TTimer によって 100 ミリ秒ごとに実行され、最初の TShape の Color は 100 ミリ秒ごとに変化します。

このサイクルの間、白い水平線が点滅しているように見えます。これは、他の TShape の色を受け取る前に、各 TShape が無効になり、白になるためです。

この動作を回避する方法はありますか? たぶん、いくつかのメソッドをオーバーライドする必要がありますか?

4

2 に答える 2

0

TShapeは、BrushプロパティとPenプロパティを変更するたびにそれ自体を無効にするため、ループは各TShapeを二重に無効にします。回避策として、TShapeが内部で割り当てるOnChangeイベントハンドラーを一時的に削除し、更新が完了した後でTShapeを1回だけInvalidate()してみてください。例えば:

for (int i = 255; i > 0; i--)
{ 
    TNotifyEvent OldBrushChange = T[i]->Brush->OnChange;
    T[i]->Brush->OnChange = NULL;

    TNotifyEvent OldPenChange = T[i]->Pen->OnChange;
    T[i]->Pen->OnChange = NULL;

    T[i]->Brush->Color = T[i - 1]->Brush->Color; 
    T[i]->Pen->Color = T[i - 1]->Pen->Color; 

    T[i]->Brush->OnChange = OldBrushChange;
    T[i]->Pen->OnChange = OldPenChange;
    T[i]->Invalidate();
}; 
于 2010-10-29T01:24:11.817 に答える
0

ダブルバッファリングが問題の鍵だと思います。C++Builder 2009 以降を使用している場合は、おそらく現在のフレームにプロパティ Controls::TWinControl::DoubleBuffered を設定するだけで十分です。

于 2010-10-27T09:35:07.550 に答える