10

自从将应用程序从 XE 移植到 XE2 后,我注意到一个奇怪的错误,只是在 ide 中打开表单或运行应用程序,屏幕左上角(在表单外)绘制了一个白色方框,如下所示将鼠标悬停在上方或窗口上方。我将此追踪到 TLabel,只需将一个放在表单上并将 Glowsize 设置为 0 以上就会导致问题。

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

示例 1

示例 2

在此处输入图像描述

4

2 回答 2

13

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

更新 1:
Delphi 2009 似乎不受此影响,但也调用 DrawThemeTextEx。我看到的唯一区别是选项记录的所有未使用字段都为零,而在 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);
于 2011-12-18T23:02:29.960 回答
2

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

我没有更深入地调查原因,但作为一种解决方法,直到该错误得到修复,它确实很好。

于 2012-01-07T21:42:06.040 回答