如何在Delphi中减少PageControl的闪烁?

8
在Delphi 2009中,我发现在调整窗体大小时,可以通过将PageControl的DoubleBuffered属性设置为true来减少闪烁。但是,如果我向PageControl的选项卡页添加控件,则无论它们的DoubleBuffered属性设置如何,它们都会闪烁。我已经尝试启用和禁用运行时主题,仍然无法解决问题。

1
是的,在使用可调整大小的页面控件时很痛苦。在我的经验中,大多数情况下将每个控件(页面控件和每个子控件)的双缓冲属性设置为true可以解决大部分问题,但在某些情况下,会引起其他渲染问题,尤其是对于某些子控件。由于我非常关注视觉质量,我倾向于 1) 在调整大小时启用双缓冲,并使用计时器在最后一个调整大小事件之后的1/5秒内禁用它,2)在调整大小期间隐藏整个页面控件(并替换为一些“窗口大小指示器”),或3)开发自己的自定义控件。 - Andreas Rejbrand
你是否正在使用数据库控件?那么在更新/添加时使用TDataSet.DisableControls可能会有所帮助。 - The_Fox
如果您告诉我们闪烁发生的时间和地点,那将会很有帮助。 - Andreas Rejbrand
@Andreas:每当我调整窗体大小时,闪烁就会发生。 - mjn
是的,正如我当时想的那样!(我假设页面控件的锚点至少包括alRightalBottom中的一个?) - Andreas Rejbrand
@Andreas 是的,所有锚点都设置为true,对齐属性是alClient。 - mjn
2个回答

5
将页面控件上的组件设置ParentBackgroundFalse有很大的帮助。然而,这导致这些面板组件的颜色不同,它们现在都有一个较暗的背景。也许可以轻松解决这个问题(而不失去主题支持)。
我还安装了VCL Fix Pack,它修复了QC 56252(TPageControl在使用活动主题时闪烁很多)的问题。

0

这远非完美,但你可能想使用它:

  protected
    procedure WMExitSize(var Message: TMessage); message WM_EXITSIZEMOVE;
    procedure WMEnterSize(var Message: TMessage); message WM_ENTERSIZEMOVE;

procedure TFormMain.WMEnterSize(var Message: TMessage);
begin
  if Assigned(PageControlView.ActivePage) then
    PageControlView.Align := alNone;
end;

procedure TFormMain.WMExitSize(var Message: TMessage);
begin
  if Assigned(PageControlView.ActivePage) then
    PageControlView.Align := alClient;
end;

这是我迄今为止找到的最好的,可以减少页面控件的Windows更新。虽然可能不太好看,但这只是一个观点问题...


谢谢您提供这个想法。不过现在我认为已经有一个解决方案了——将PageControl上的组件的ParentBackground设置为False。我从来没有想到创建一个简单的RAD GUI会如此棘手 :) - mjn
当你有Windows公共控件库代码和不是Windows控件的东西混合在一起时,就没有所谓的简单了。这只是冰山一角。 - Warren P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接