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 的颜色每 100 毫秒更改一次。

在这个循环中,我看到一条闪烁的白色水平线,因为在接收到另一个 TShape 的颜色之前,每个 TShape 都无效并变为白色。

有没有办法避免这种行为?也许,我必须重写一些方法?

4

2 回答 2

0

我认为双缓冲是解决问题的关键。如果您使用的是 C++Builder 2009 或更新版本,则可能为当前帧设置属性 Controls::TWinControl::DoubleBuffered 就足够了。

于 2010-10-27T09:35:07.550 回答
0

每次更改其 Brush 和 Pen 属性时 TShape 都会使其自身失效,因此您的循环会使每个 TShape 双重失效。作为一种解决方法,尝试暂时删除 TShape 在内部分配的 OnChange 事件处理程序,然后在完成更新后仅对 TShape 进行一次 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 回答