如何减少 Delphi 中的 PageControl 闪烁?

Posted

技术标签:

【中文标题】如何减少 Delphi 中的 PageControl 闪烁?【英文标题】:How can I reduce PageControl flicker in Delphi? 【发布时间】:2011-05-01 04:14:18 【问题描述】:

在 Delphi 2009 中,我发现 PageControl 的闪烁(在调整表单大小期间发生)可以通过将其 DoubleBuffered 属性设置为 true 来减少。

但是,如果我将控件添加到 PageControl 选项卡表中,无论其 DoubleBuffered 属性设置如何,它们都会闪烁。我也尝试过启用和不启用运行时主题。

【问题讨论】:

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

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

  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 会如此棘手:) 当您混合了 Windows 通用控件库代码和非 Windows 控件的东西时,没有比这更简单的事情了。这只是冰山一角。【参考方案2】:

为 PageControl 上的组件设置 ParentBackgroundFalse 有很大帮助。但是,这会导致这些面板组件的颜色不同,它们现在都具有较暗的背景。也许这可以很容易地修复(不会失去主题支持)。

我还安装了VCL Fix Pack,它修复了QC 56252(TPageControl 在活动主题时闪烁很多)。

【讨论】:

以上是关于如何减少 Delphi 中的 PageControl 闪烁?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 中的 BDE 与 ADO

delphi VCL组件同名继承

delphi中的第三方控件如何安装

delphi 中运行后窗口会被人为的拉大或者缩小,问题是,如何获取变化后的窗口大小的值?

你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?

delphi中,如何读取一个目录中的所有文件?在线等……