Подтвердить что ты не робот

Delphi XE2 TLabel glowsize вызывает графическую проблему в левом верхнем углу экрана

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

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

example 1

example 2

enter image description here

4b9b3361

Ответ 1

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

Ответ 2

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

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