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();
}
在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();
}