delphi - XE2 中的 TDateTimePicker VCL 样式故障仅发生在 Windows 经典主题上

标签 delphi delphi-xe2 vcl-styles

我想这是 VCL 样式尚未准备好真正使用的另一个原因。

TDateTimePicker 控件在没有 VCL 样式的情况下看起来很好。打开任何 vcl 样式,我得到这样的外观:

enter image description here

我可以通过注册样式 Hook 来关闭此组件类型的 vcl 样式,但这看起来真的很难看。

这是在安装了更新 4 的 Delphi XE2 上。

理想情况下,我希望有一个解决方法,或者日期时间选择器的某些属性,或者日期时间选择器的某些子类,我可以强制日期时间选择器正确绘制和主题。

请注意,普通组合框的主题正确。请注意,这可以在可以想象的最小示例项目中轻松重现。是的。这是另一个样式错误。

更新 它可能是特定于平台的,与不带 Aero 的 Windows Server 2008 R2 上的 Windows Common Controls 版本相关(Windows 服务器组件术语中的“桌面体验”)。在其他人无法重现它之后,我才想到在几台不同的 Windows 机器上尝试这个。执行此操作后,我发现该问题仅在 Windows Server 2008 R2 上重现。我们的一些客户使用 Windows Server 2008 R2。如您所知,使用 VCL 样式的一个主要原因是它使您的应用程序看起来相同,无论 Windows 主题是什么。然而,在上述情况下,整个应用程序主题正确,但 DateTimePicker 控件除外,该控件的主题不正确,并且仅在 Windows Server 2008 R2 上。同样基于 XE2 的演示应用程序在 Windows 7 上运行良好。

工作系统和非工作系统的 SysWow64 文件夹中都有一个 ComCtl32.dll,其版本为 5.82.7601.17514。然而,显然,当 VCL 主题关闭时,这些控件的 native 布局和外观是不同的,这会影响换肤代码,导致失败。

更新2:报告为错误:QC Entry 106783

最佳答案

好的,我只是对 Vcl.Styles.DateTimePickers 做了一个小小的更改单位是 vcl-styles-utils 的一部分。要在“Windows 经典”主题处于事件状态时修复此问题。

以这种方式使用这个样式钩子(Hook)

uses
  Vcl.Styles,
  Vcl.Themes,
  Vcl.Styles.DateTimePickers;

initialization
 TStyleManager.Engine.RegisterStyleHook(TDateTimePicker, TDateTimePickerStyleHookFix);

这就是结果。

enter image description here

关于delphi - XE2 中的 TDateTimePicker VCL 样式故障仅发生在 Windows 经典主题上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11229550/

相关文章:

delphi - 如何在 Delphi 7 中禁用 CPU 窗口

delphi - 将子组件属性类型转换为 ini 文件

delphi - 如何更改Delphi XE7的IDE语言

database - 从备忘录中逐行提取文本

delphi - 将一个元素追加到动态数组

delphi - 如何使用 VCL 样式设置 StringTree 的背景颜色?

delphi - Delphi Firemonkey中的鼠标事件动画

delphi - 模块 'rtl160.bpl' 中地址 50043a45 处的访问冲突。读取地址00000000

inno-setup - 在哪里可以找到 VclStylesinno.dll 以便能够在我的 Inno Setup 脚本中使用 VCL 样式?