【问题标题】:TDateTimePicker VCL Styles glitch in XE2 that only happens on Windows Classic ThemeXE2 中的 TDateTimePicker VCL 样式故障仅在 Windows 经典主题上发生
【发布时间】:2012-06-29 01:58:33
【问题描述】:

我想这是 VCL 样式还没有准备好被真正使用的另一个原因。

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

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

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

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

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

更新它可能是特定于平台的,与不带 Aero 的 Windows Server 2008 R2 上的 Windows 通用控件版本相关(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 主题关闭时,这些控件的原生布局和外观显然是不同的,这会影响换肤代码,从而导致失败。

Update2:报告为错误:QC Entry 106783

【问题讨论】:

  • @Robert 在 Stack Overflow 和 QC 上搜索 VCL 样式,您会发现此功能是一个充满 bug 的 pre-alpha 质量功能。就像 FMX。
  • 好的,它可能是特定于平台的。没有桌面体验的 Windows Server 2008 R2 (Aero)。
  • Eureka,我刚刚将我的测试应用程序复制到了 Windows Server 2008 R2 机器上并尝试过,并重现了您的问题。
  • 他们刚刚在 Windows 8 中完全移除了 Aero 玻璃(也许还有主题服务?)。这将非常有趣。
  • @WarrenP 我不认为你有这个权利。 Windows 8 Aero 的变化在于 MS 在其外壳和工具中提供的 UI。 API 应该仍然存在。

标签: delphi delphi-xe2 vcl-styles


【解决方案1】:

好的,我刚刚对Vcl.Styles.DateTimePickers 单元做了一个小改动,它是vcl-styles-utils 的一部分。在“Windows 经典”主题处于活动状态时解决此问题。

这样使用这个style hook

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

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

这就是结果。

【讨论】:

    【解决方案2】:

    我可以确认,当我安装桌面体验、启用主题并启动主题服务时,此故障消失了。

    好的,这是我现在的解决方法代码:

    function DetectWin7Or2008R2ClassicTheme:Boolean;
    begin
    
       if  ( Win32MajorVersion>=6 ) then
          result := (not Themes.ThemeServices.ThemesEnabled) // and IsServerOs
       else
          result := false;
    
    
    end;
    
    
    // main form initialization section:
    
    
    initialization
     if DetectWin7Or2008R2ClassicTheme then
     TStyleManager.Engine.RegisterStyleHook(TDateTimePicker, TStyleHook); {no theme!}
    end.
    

    这显然是一个疯狂的角落案例。我希望找到更多,当我发现 Windows Server 2008R2 或 Windows 7 上还有什么问题时,当主题服务未运行时,我会回来更新这个问题,当您选择“Windows 经典主题”时会发生这种情况在 Win7 上也是如此。

    【讨论】:

    • 为什么你认为这个限制为 7?维斯塔呢? Win32MajorVersion>=6 应该足够了。
    猜你喜欢
    • 2012-04-18
    • 2012-08-25
    • 2012-02-26
    • 2013-10-26
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多