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

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

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

example 1

example 2

enter image description here

Ответы [ 2 ]

13 голосов
/ 19 декабря 2011

Проблема начинается в 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);
2 голосов
/ 08 января 2012

Проблема, похоже, исчезнет, ​​если вы отключите AutoSize для метки.

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

...