2011-12-18 88 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