spu*_*eon 5 delphi flicker vcl-styles
我正在使用启用了VCL样式的Delphi,我想为我的表单更改TSplitter的颜色.我在内TSplitter.Paint插器类中重写以绘制比默认VCL样式cBtnFace颜色更暗的颜色,但在调整大小时窗体上会出现明显的闪烁.有没有办法消除这种闪烁?
我试过这些东西来尝试减少闪烁,但没有一个有效:
禁用VCL样式(TSplitter.StyleElements := []).
更改VCL样式位图样式设计器的"分割器"对象元素,但修改此对象元素不会更改分割器的外观.
试图处理对象WM_ERASEBKGND上的消息TControl,但我无法在我的插入器类中调用该过程.
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;
Run Code Online (Sandbox Code Playgroud)任何其他想法摆脱闪烁的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)
Run Code Online (Sandbox Code Playgroud)
表单顶部还有一个工具栏和一个主菜单,但其余的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, ParentBackground = False)
-> -> A TGradient, 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
Run Code Online (Sandbox Code Playgroud)
最后,我应该注意到,在调整大小(窗口右侧的黑色轨迹)时,双缓冲TForm会大大降低UI的速度,而不是在应用程序未调整大小时执行其他UI操作时.
更新2
不幸的是,虽然我上面的方法(创建一个后台父级TPanel)修复了闪烁TSplitter,但它也引起了其他奇怪的UI问题,也许其中一些@David Heffernan在评论中提到过.现在,我刚刚离开闪烁的问题,因为分离器只有1px宽,只有在宽度+高度调整时闪烁.
这TSplitter控件可能没有DoubleBuffered属性,但该属性应该在您遇到闪烁的最上面的控件(在大多数情况下是窗体)上实现。只要所有控件ParentDoubleBuffered仍然默认启用,它们也都会获得此更改。
DoubleBuffered并不总能解决闪烁问题,并且在某些情况下可能会使情况变得更糟。您可以考虑仅使用DoubleBuffered在调整大小期间使用,然后在调整大小完成后将其关闭。此属性只能用在那些实际正在调整大小的控件上。例如,当调整表单大小时,DoubleBuffered在表单上启用。但是,当仅调整面板内容的大小时,请仅针对该面板(及其所有子控件)启用它。
至于由于此更改而导致的应用程序性能下降,您还可以考虑在调整大小时实现一个标志,这将暂停任何可能使其陷入困境的程序执行(任何重绘的内容,例如标签、图像等)。这本身也可能是您问题的解决方案(实际上可能是第二个答案)。
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |