Delphi TSplitter闪烁问题
我正在使用启用了VCL样式的Delphi,我想为我的表单更改TSplitter的颜色.我在内插器类中覆盖TSplitter.Paint以绘制比默认VCL样式cBtnFace颜色更暗的颜色,但是在调整大小时窗体上会出现明显的闪烁.有没有办法消除这种闪烁?
我试过这些东西来尝试减少闪烁,但没有一个有效: >禁用VCL样式(TSplitter.StyleElements:= []). 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.但是当仅调整面板内容的大小时,只为该面板(及其所有子控件)启用它. 至于由于此更改导致应用程序性能下降,您还可以考虑在调整大小时实现一个标志,这将暂停任何可能使其陷入困境的程序执行(重绘任何内容,如标签,图像等).它的自身也可能是你的问题的解决方案(实际上可能是第二个答案). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |