我对 Delphi 2009/2010 对 Windows 中 Aero Theme Glass 功能的支持、DoubleBuffered 的确切含义以及它与 Aero glass 的关系感到困惑。我发现 DoubleBuffered 不仅是 VCL 中的一个属性,它也可以在.net WinForms中找到。最初我想知道它是否设置了公共控件库使用的某种窗口样式位,或者什么。为什么使用它,何时使用?
[更新:我应该声明我知道什么是“双缓冲”,作为一种减少闪烁的通用技术,我想知道的是,为什么它与 Windows Vista 中 Aero Glass 窗格上的渲染控件有任何关系/ Windows 7,特别是为什么所有事物的 BUTTON 都需要将双缓冲设置为 true,才能在玻璃上工作?下面链接的博客文章似乎信息量最大。]
尤其是对DoubleBuffered属性很困惑,想知道它为什么存在,它的玻璃支架和窗体、控件中的双缓冲属性是什么关系。当您阅读像这样的 C++ 文章时,您会发现没有提到双缓冲。
[更新2:以下内容包含一些事实错误,并已进行修改:]
我发现一些 C++ 开发人员谈论他们如何调用 SetLayeredWindowAttributes 以避免在经典 Win32 应用程序中打开 DWM/Aero 合成导致的“黑色变成玻璃”故障 [但是下面的博客链接告诉我这不再有效在 Windows 7 中,实际上只是在 Vista 中短暂工作,直到微软阻止它]。[Begin WRONG Idea] 我们不应该使用其他颜色,比如明亮的洋红色,然后把它变成玻璃透明色吗?[结束错误的想法]
什么时候应该设置和不设置 DoubleBuffered 的规则是什么,为什么首先将 DoubleBuffered 添加到 VCL 中?什么时候设置会出问题?(似乎远程桌面是一种情况,但这是唯一的情况吗?)当它没有设置时,我们会在按钮文本的渲染中出现故障,很可能是因为 Delphi 似乎没有更改默认的“将黑色渲染为玻璃“在 Aero DWM 中。
在我看来,Aero Glass 渲染从根本上是以一种奇怪或难以理解的方式完成的[由 Windows 本身,而不是仅包装此功能的 Delphi],并且 2009/2010 年的许多内部 VCL 源代码StdCtrls 中的类必须做很多复杂的逻辑才能在 Aero Glass 上正确渲染东西,但它仍然有很多问题,在我看来它做错了,这可能是这个相关问题和 qc 问题的背后。 [更新 3:玻璃上的许多渲染故障,在 VCL 中,在通用控件中渲染完成错误,微软似乎并不关心修复。简而言之,Delphi VCL 代码修复无法解决这样一个事实,即古老的 Windows 通用控件库和现代 [但古怪的] Aero Glass 合成功能彼此不太喜欢,并且不能很好地协同工作。感谢 Microsoft 构建了如此高质量的技术并将其释放到世界各地。]
如果还不够有趣;为什么我们有 ParentDoubleBuffered?
[7 月 30 日更新:这个问题对我来说很有趣,因为我认为它表明,当你有一个大型的现有 VCL 框架时,使用 Windows API 来解决这个问题是一个难题。]