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

时间:2011-12-18 22:21:52

标签: delphi delphi-xe2 tlabel

自从将应用程序从XE移植到XE2后,我发现了一个奇怪的错误,只需打开ide中的表单或运行应用程序,屏幕左上角会出现一个白色的方框(表单外) ,当鼠标悬停或窗户悬停时消失。我将其跟踪到TLabel,只需在表单上删除一个并将Glowsize设置为0就会导致问题。

我重新安装并更新到最后一个XE2 update3,问题仍然存在。任何人都知道发生了什么?

example 1

example 2

enter image description here

2 个答案:

答案 0 :(得分: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;

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

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

答案 1 :(得分:2)

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

我没有深入研究为什么,但作为一种解决方法,直到该错误得到解决,它才行得很好。