Светящийся размер Delphi XE2 TLabel вызывает проблемы с графикой в левом верхнем углу экрана
После портирования приложения из XE в XE2 я заметил странную ошибку: просто открыв форму в ide или запустив приложение, в левом верхнем углу экрана (вне формы) отображается белая квадратная рамка, которая выглядит так: прочь при наведении мыши или окна над. Я отследил это до TLabel, просто перетащив его в форму и установив Glowsize выше 0, вызывает проблему.
Я переустановил и обновил до последнего обновления XE23, и проблема все еще возникает. Кто-нибудь знает, что происходит?
2 ответа
Проблема начинается в TCustomLabel.AdjustBounds
с призывом к DoDrawText
с контекстом устройства экрана и флагом DT_CALCRECT. Так что, если что-то раскрасит контекст этого устройства, оно будет нарисовано на экране. 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);
Кажется, проблема исчезнет, если вы отключите AutoSize на ярлыке.
Я не стал исследовать более подробно, почему, но в качестве обходного пути, пока эта ошибка не будет исправлена, все в порядке.