【问题标题】:Delphi XE2 TLabel glowsize causes graphic issue on top left corner of the screenDelphi XE2 TLabel glowsize 导致屏幕左上角出现图形问题
【发布时间】:2026-01-04 20:30:01
【问题描述】:

自从将应用程序从XE移植到XE2后,我注意到一个奇怪的错误,只是在ide中打开表单或运行应用程序,屏幕左上角会绘制一个白色方框(表单外) ,在鼠标悬停或窗口上方时消失。我将此追踪到 TLabel,只需将一个放在表单上并将 Glowsize 设置为 0 以上就会导致问题。

我重新安装并更新到最新的 XE2 update3,但问题仍然存在。有人知道发生了什么吗?

【问题讨论】:

    标签: delphi delphi-xe2 tlabel


    【解决方案1】:

    问题从TCustomLabel.AdjustBounds 开始,调用DoDrawText 并使用屏幕的设备上下文和标志DT_CALCRECT。因此,如果在该设备上下文上绘制了任何内容,它将被绘制到屏幕上。 DT_CALCRECT 标志应该防止这种情况,但 Vcl.Themes.TUxThemeStyle.DoDrawText 中的 DrawThemeTextEx 调用似乎忽略了 DT_CALCRECT + LOptions.dwFlags DTT_CALCRECT 并绘制到它应该只计算所需矩形的设备上下文上。我不知道为什么DrawThemeTextEx 这样做(目前),但这是一个起点。

    更新 1:
    Delphi 2009 似乎不受此影响,但也调用 DrawThemeTextEx。我看到的唯一区别是选项记录的所有未使用字段都为零,而在 Delphi XE2 中它们包含垃圾。也许 DrawThemeTextEx 需要它们为零。

    更新 2:
    Delphi 2009 和 XE2 之间的区别在于,在 Delphi 2009 中,不仅指定了 DTT_CALCRECT,还指定了 DTT_COMPOSITE。

    在 Delphi 2009 中,始终设置 DTT_COMPOSITE:

    Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE;
    

    而在 XE2 中,仅当标签涂在玻璃上时才会设置标志:

      if csGlassPaint in ControlState then
        Include(LFormat, tfComposited);
    

    【讨论】:

      【解决方案2】:

      如果禁用标签上的 AutoSize,问题似乎消失了。

      我没有深入调查原因,但作为一种解决方法,直到该错误得到修复为止。

      【讨论】:

      • 这似乎与 Andreas Hausladen 的回答有关。他说问题与用DT_CALCRECT 调用DrawThemeTextEx 有关。我想只有当需要计算标签的大小时才会这样做=当标签的AutoSizeTrue 时。如果您关闭AutoSize,则不会执行与DT_CALCRECT 的调用,因此不会产生错误。
      • 是的,行得通;在创建表单后和更改标题之前设置自动调整大小似乎也可以避免该问题(可能稍后重新出现)。它在最新更新中仍未修复4。
      最近更新 更多