2011-12-18 96 views
10

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

我重新安装并更新到最新的XE2 update3,问题仍然存在。任何人都有线索怎么回事?

example 1

example 2

enter image description here

回答

13

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

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

更新2:
2009 Delphi和XE2之间的区别是,在2009年不仅德尔福DTT_CALCRECT指定而且DTT_COMPOSITE。

在2009年德尔福的DTT_COMPOSITE始终设置:

Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE; 

而XE2如果标签被涂在玻璃上的标志仅设置:

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

发布到QC http://qc.embarcadero.com/wc/qcmain.aspx?d=102146 – hikari 2011-12-27 23:37:13

2

这个问题似乎是,如果你消失禁用标签上的AutoSize。

我没有深入调查为什么,但作为一种解决方法,直到该错误被修复它没有问题。

+1

这似乎与Andreas Hausladen的答案有关。他说这个问题与用'DT_CALCRECT'调用'DrawThemeTextEx'有关。我想这只是在需要计算标签的大小=当标签的“AutoSize”为“True”时完成的。如果您打开'AutoSize',则不执行使用'DT_CALCRECT'的调用,因此不会产生错误。 – 2012-01-07 23:47:32

+1

是的工作;在表单创建之后和更改标题之前稍后设置autosize似乎也可以避免此问题(可能稍后再次出现)。它在最新的更新中仍然不固定4。 – hikari 2012-04-01 20:00:53