加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi TSplitter闪烁问题

发布时间:2020-12-15 04:13:39 所属栏目:大数据 来源:网络整理
导读:我正在使用启用了VCL样式的Delphi,我想为我的表单更改TSplitter的颜色.我在内插器类中覆盖TSplitter.Paint以绘制比默认VCL样式cBtnFace颜色更暗的颜色,但是在调整大小时窗体上会出现明显的闪烁.有没有办法消除这种闪烁? 我试过这些东西来尝试减少闪烁,但没
我正在使用启用了VCL样式的Delphi,我想为我的表单更改TSplitter的颜色.我在内插器类中覆盖TSplitter.Paint以绘制比默认VCL样式cBtnFace颜色更暗的颜色,但是在调整大小时窗体上会出现明显的闪烁.有没有办法消除这种闪烁?

我试过这些东西来尝试减少闪烁,但没有一个有效:

>禁用VCL样式(TSplitter.StyleElements:= []).
>更改VCL样式位图样式设计器的“分割器”对象元素,但修改此对象元素不会更改分割器的外观.
>尝试在TControl对象上处理WM_ERASEBKGND消息,但是我无法在我的插入器类中调用该过程.

procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
...
procedure TSplitter.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
    // this is never invoked by the TSplitter
    Msg.Result := 1;
end;

什么其他想法摆脱TSplitter上的闪烁?对于TSplitter来说,没有DoubleBuffer属性,或者我可以告诉他们这样的东西.

UPDATE

不幸的是,我不能共享代码库,但我可以告诉你,当TSplitter闪烁时,这就是设置应用程序UI的方式:

TForm (DoubleBuffered = False)
-> BackgroundPanel (DoubleBuffered = True,ParentBackground = False)
-> -> A TGradient,image and label to fill the BackgroundPanel
-> LeftPanel (ParentBackground = False`,no flickering)
-> -> LeftPanelFrame and frame content (selective double buffering)
-> TSplitter
-> RightPanel (ParentBackground = False,no flickering)
-> -> RightPanelFrame and frame content (selective double buffering)

表单顶部还有一个工具栏和一个主菜单,但其余的UI组件设置为alClient(或OnResized以填充空间).

我假设由于BackgroundPanel位于LeftPanel,TSplitter和RightPanel(即Control,> Send to Back)之后,BackgroundPanel上的DoubleBuffered = True和ParentBackground = False将有助于减少/消除任何组件上的闪烁.前面的即时UI层(即TSplitter).但是,情况似乎并非如此.

也许我会尝试将TPanel放置为LeftPanel,TSplitter和RightPanel的父级,并设置其DoubleBuffered = True和ParentBackground = False.我将不得不稍后尝试并回来.所以,它看起来像这样:

TForm
-> BackgroundPanel (DoubleBuffered = True,image and label to fill the BackgroundPanel
-> EncapsulatingPanel (DoubleBuffered = True,ParentBackground = False)
-> -> LeftPanel (ParentBackground = False)
-> -> -> LeftPanelFrame and frame content
-> -> TSplitter
-> -> RightPanel (ParentBackground = False)
-> -> -> RightPanelFrame and frame content

最后,我应该注意到,在调整大小(窗口右侧的黑色轨迹)时,双缓冲TForm会大大降低UI的速度,而不是在应用程序未调整大小时执行其他UI操作时.

更新2

不幸的是,虽然我上面的方法(创建一个后台父TPanel)修复了TSplitter上的闪烁,但它也引起了其他奇怪的UI问题,也许其中一些@David Heffernan在评论中提到过.现在,我刚刚离开闪烁的问题,因为分离器只有1px宽,只有宽度高度调整闪烁.

解决方法

TSplitter控件可能没有DoubleBuffered属性,但是此属性应该在您遇到闪烁的最上层控件上实现 – 在大多数情况下,应该是表单.只要所有控件的ParentDoubleBuffered仍然默认启用,它们都将获得此更改.

DoubleBuffered并不总能修复闪烁,在某些情况下可能会使事情变得更糟.您可以考虑仅在调整大小时使用DoubleBuffered,然后在调整大小时将其关闭.此属性应仅用于实际调整大小的控件.例如,在调整表单大小时,在表单上启用DoubleBuffered.但是当仅调整面板内容的大小时,只为该面板(及其所有子控件)启用它.

至于由于此更改导致应用程序性能下降,您还可以考虑在调整大小时实现一个标志,这将暂停任何可能使其陷入困境的程序执行(重绘任何内容,如标签,图像等).它的自身也可能是你的问题的解决方案(实际上可能是第二个答案).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读