Vấn đề bắt đầu từ TCustomLabel.AdjustBounds
với một cuộc gọi đến DoDrawText
với bối cảnh thiết bị của màn hình và DT_CALCRECT cờ. Vì vậy, nếu bất cứ điều gì sơn trên bối cảnh thiết bị đó, nó sẽ được vẽ lên màn hình. Cờ DT_CALCRECT
nên ngăn điều đó nhưng cuộc gọi DrawThemeTextEx
trong Vcl.Themes.TUxThemeStyle.DoDrawText
dường như bỏ qua DT_CALCRECT + LOptions.dwFlags DTT_CALCRECT và vẽ lên ngữ cảnh thiết bị ở đó nó chỉ nên tính hình chữ nhật được yêu cầu. Tôi không biết tại sao DrawThemeTextEx
thực hiện điều đó (chưa) nhưng đó là điểm khởi đầu.
UPDATE 1:
Delphi 2009 dường như không bị ảnh hưởng bởi điều này, nhưng cũng kêu gọi DrawThemeTextEx. Sự khác biệt duy nhất tôi thấy là tất cả các lĩnh vực không sử dụng của các hồ sơ Options là số không trong khi trong Delphi XE2 chúng chứa rác. Có lẽ DrawThemeTextEx cần chúng bằng không.
UPDATE 2:
Sự khác biệt giữa Delphi 2009 và XE2 là trong Delphi 2009 không chỉ DTT_CALCRECT được quy định nhưng cũng DTT_COMPOSITE.
Trong Delphi 2009 DTT_COMPOSITE luôn thiết lập:
Options.dwFlags := DTT_TEXTCOLOR or DTT_COMPOSITED or DTT_GLOWSIZE;
trong khi ở XE2 cờ chỉ được thiết lập nếu nhãn được vẽ trên kính:
if csGlassPaint in ControlState then
Include(LFormat, tfComposited);
Nguồn
2011-12-18 23:02:29
đăng lên QC http://qc.embarcadero.com/wc/qcmain.aspx?d=102146 – hikari