Проблема начинается в TCustomLabel.AdjustBounds
с вызова DoDrawText
с контекстом устройства экрана и флагом 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);
person
Andreas Hausladen
schedule
18.12.2011