gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:41:33 28 4
gpt4 key购买 nike

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

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

example 1

example 2

enter image description here

最佳答案

问题始于使用屏幕设备上下文和标志 DT_CALCRECT 调用 DoDrawTextTCustomLabel.AdjustBounds。因此,如果在该设备上下文上绘制任何内容,它将被绘制到屏幕上。 DT_CALCRECT 标志应该可以防止这种情况,但是 Vcl.Themes.TUxThemeStyle.DoDrawText 中的 DrawThemeTextEx 调用似乎忽略了 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);

关于Delphi XE2 TLabel Globesize 导致屏幕左上角出现图形问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555303/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com