Delphi XE2 TLabel glowsize导致屏幕左上角出现图形问题

hik*_*ari 10 delphi tlabel delphi-xe2

自从将应用程序从XE移植到XE2后,我注意到一个奇怪的错误,只需在ide中打开表单或运行应用程序,屏幕左上角(表单外)就会绘制一个白色方框,远离鼠标或窗户.我将其跟踪到TLabel,只需在表单上删除一个并将Glowsize设置为0就会导致问题.

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

例1

例2

在此输入图像描述

And*_*den 13

问题始于TCustomLabel.AdjustBounds调用DoDrawText屏幕的设备上下文和标志DT_CALCRECT.因此,如果在该设备上下文中绘制任何内容,它将被绘制到屏幕上.该DT_CALCRECT标志应该阻止,但DrawThemeTextEx调用Vcl.Themes.TUxThemeStyle.DoDrawText似乎忽略了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;
Run Code Online (Sandbox Code Playgroud)

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

  if csGlassPaint in ControlState then
    Include(LFormat, tfComposited);
Run Code Online (Sandbox Code Playgroud)