C++ Builder - TShape 组件的问题

Posted

技术标签:

【中文标题】C++ Builder - TShape 组件的问题【英文标题】:C++ Builder - Problem with TShape component 【发布时间】:2010-10-27 08:51:15 【问题描述】:

我有这段代码:

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 都无效并变成白色。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

TWinControl 在 BCB 6 中具有 DoubleBuffered 属性。jszpilewski 指的是您在放置 TShape 对象的任何父控件上设置 DoubleBuffered=true。 在 TForm 应用了 DoubleBuffered = true 我已经解决了这个问题!非常感谢! 请接受这个答案,这样其他人试图通过回答未回答的问题来帮助人们就不必浪费时间了。【参考方案2】:

每次您更改其 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();
; 

【讨论】:

我严重怀疑这一点,因为发生的失效较少。但是无所谓。另一种解决方法是在每次循环迭代结束时根本不调用 TShape::Invalidate()。继续禁用 OnChange 事件,以便 TShape 不会自动对其自身调用 Invalidate(),然后在循环退出后调用父 TForm(或其他父 TForm,如果所有 TShape 都有一个公共容器)上的 Update()。这将执行 TShapes 的单一绘制操作,而不是在循环时绘制。

以上是关于C++ Builder - TShape 组件的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Delphi & C++ Builder 中安装 VCL 组件

我应该在 Delphi 而不是 C++ Builder 中编写组件吗?如何向组件添加事件?

C++ Builder托盘控件

Controls 属性与继承 TShape 类的小练习(使用TShape可以解决很多图形问题)

C++ Builder6.0中的GroupBox与RadioButton使用问题

将 C++ Builder 移植到 Qt [关闭]