destroyComponents() 和重绘 c++builder 时闪烁

flicker when destroyComponents() and redraw c++builder

在c++Builder中,我有一个带有TPageControl的窗体,它有几个TTabSheet,里面有ScrollBox alClient。在每一个 ScrollBox 中都动态绘制了几个 TStringGrid,它们的信息是根据 OpenDialog 读取的二进制文件填充的。

为了动态创建组件,我写了函数


    void __fastcall TForm1::DynamicDraw()
    </pre>
它获取文件并绘制所有 TTabSheet(具有依赖项)。

出现问题是因为用户可以 delete/add TStringGrid 在所有其他 TTabSheet 中生成依赖性问题。

为了解决这个问题,我决定调用函数


    ScrollBox->DestroyComponents();
    DynamicDraw();
    </pre>

对于每个 TTabsheet。但是,即使激活了 DoubleBuffered,这也会在当前选项卡中创建一个 "flicker"。

有什么想法或信息可以避免这个问题吗?

发送 ScrollBox WM_SETREDRAW 消息以在您进行更新时临时禁用屏幕绘制:

SendMessage(ScrollBox->Handle, WM_SETREDRAW, FALSE, 0);
try {
    ScrollBox->DestroyComponents();
    DynamicDraw();
}
__finally {
    SendMessage(ScrollBox->Handle, WM_SETREDRAW, TRUE, 0);
    ScrollBox->Update();
}