Светящийся размер Delphi XE2 TLabel вызывает проблемы с графикой в ​​левом верхнем углу экрана

После портирования приложения из XE в XE2 я заметил странную ошибку: просто открыв форму в ide или запустив приложение, в левом верхнем углу экрана (вне формы) отображается белая квадратная рамка, которая выглядит так: прочь при наведении мыши или окна над. Я отследил это до TLabel, просто перетащив его в форму и установив Glowsize выше 0, вызывает проблему.

Я переустановил и обновил до последнего обновления XE23, и проблема все еще возникает. Кто-нибудь знает, что происходит?

пример 1

пример 2

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 на ярлыке.

Я не стал исследовать более подробно, почему, но в качестве обходного пути, пока эта ошибка не будет исправлена, все в порядке.

Другие вопросы по тегам