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

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

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

пример 1

пример 2

введите описание изображения здесь


person hikari    schedule 18.12.2011    source источник


Ответы (2)


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

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

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

person Chris    schedule 07.01.2012
comment
Кажется, это коррелирует с ответом Андреаса Хаусладена. Он говорит, что проблема связана с вызовом DrawThemeTextEx с DT_CALCRECT. Я полагаю, что это делается только тогда, когда есть необходимость рассчитать размер метки = когда метка AutoSize равна True. Если вы включите AutoSize, вызов с DT_CALCRECT не выполняется и, следовательно, ошибка не возникает. - person Andriy M; 08.01.2012
comment
Ага, это работает; установка автоматического изменения размера позже после создания формы и перед изменением заголовка также, похоже, позволяет избежать проблемы (возможно, повторное появление позже). Он остается нефиксированным в последнем обновлении 4. - person hikari; 02.04.2012