自从将一个应用程序从XE迁移到XE2后,我注意到了一个奇怪的 bug,只要在IDE中打开窗体或者运行应用程序,就会在屏幕左上角(窗体外)绘制一个白色方块,当鼠标悬停或窗口覆盖时就会消失。我追踪到这是由 TLabel 引起的,只要简单地将 TLabel 拖放到窗体上并将 Glowsize 设置大于 0 就会出现此问题。
我已经重新安装并更新到了最新的 XE2 Update3,但问题仍然存在。有人知道发生了什么吗?
自从将一个应用程序从XE迁移到XE2后,我注意到了一个奇怪的 bug,只要在IDE中打开窗体或者运行应用程序,就会在屏幕左上角(窗体外)绘制一个白色方块,当鼠标悬停或窗口覆盖时就会消失。我追踪到这是由 TLabel 引起的,只要简单地将 TLabel 拖放到窗体上并将 Glowsize 设置大于 0 就会出现此问题。
我已经重新安装并更新到了最新的 XE2 Update3,但问题仍然存在。有人知道发生了什么吗?
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);