自从将应用程序从XE移植到XE2以来,我注意到一个奇怪的错误,即仅在ide中打开表单或运行该应用程序,在屏幕的左上角绘制了一个白色方形框(不在表单中),悬停在鼠标或窗口上方。我将其跟踪到TLabel,只需在窗体上放置一个并将Glowsize设置为0即可导致此问题。

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

最佳答案

问题始于TCustomLabel.AdjustBounds,其中调用了带有屏幕的设备上下文和标志DT_CALCRECT的DoDrawText。因此,如果在该设备上下文上绘制了任何内容,它将被绘制到屏幕上。 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);

07-25 23:40
查看更多