Delphi XE2中的TLabel发光大小会导致屏幕左上角出现图形问题

10

自从将一个应用程序从XE迁移到XE2后,我注意到了一个奇怪的 bug,只要在IDE中打开窗体或者运行应用程序,就会在屏幕左上角(窗体外)绘制一个白色方块,当鼠标悬停或窗口覆盖时就会消失。我追踪到这是由 TLabel 引起的,只要简单地将 TLabel 拖放到窗体上并将 Glowsize 设置大于 0 就会出现此问题。

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

示例1

示例2

输入图像描述

2个回答

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

更新1:
Delphi 2009似乎没有受到影响,但也调用了DrawThemeTextEx。我看到的唯一区别是Options记录的所有未使用字段都为零,而在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后消失。
我没有深入调查原因,但作为一个解决方法,在修复该错误之前它可以很好地工作。

1
这似乎与Andreas Hausladen的答案相关。他说问题与使用“DT_CALCRECT”调用“DrawThemeTextEx”有关。我想当标签的“AutoSize”为真时,才会计算标签大小的需要时才这样做。如果关闭“AutoSize”,就不会执行带“DT_CALCRECT”的调用,因此,也不会出现错误。 - Andriy M
1
没错,这个方法可行;在创建窗体后并在更改标题之前设置自动调整大小似乎也可以避免此问题(可能稍后会再次出现)。在最新的更新4中仍未修复。 - hikari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接