Как правильно указать цвет текста в функции DrawThemeTextEx для Delphi-приложений
Вопрос пользователя заключается в том, что при использовании функции DrawThemeTextEx для отображения текста в Delphi-приложении, цвет текста не изменяется в соответствии с указанным значением crText в структуре DTTOPTS. Несмотря на то, что в документации указано, что можно задать цвет текста через crText и установить флаг DTT_TEXTCOLOR, фактически цвет текста остаётся черным.
Шаги для корректного использования цвета текста в DrawThemeTextEx:
Убедитесь, что вы используете правильный цвет в формате COLORREF. Цвет должен быть представлен в формате BGR, где высокий байт (ALPHA) должен быть равен нулю.
Проверьте, что вы правильно установили флаг DTT_TEXTCOLOR в структуре DTTOPTS, что указывает на то, что вы хотите использовать заданный цвет текста.
В примере кода пользователя есть недопонимание: установка цвета текста с помощью SetTextColor(dc, foreColor) не связана с функцией DrawThemeTextEx. Она используется для установки цвета текста в контексте устройства (DC) для стандартного текста, а не для темы.
Пример кода, который должен корректно установить цвет текста в функцию DrawThemeTextEx:
procedure DrawThemeText(dc: HDC; text: WideString; font: TFont; pt: TPoint; foreColor: COLORREF);
var
R: TRect;
dttOpts: TDttOpts;
hOldFont: HFONT;
oldColor: COLORREF;
begin
// Убедитесь, что ALPHA байт в COLORREF равен нулю
foreColor := (GetBValue(foreColor) shl 16) or (GetGValue(foreColor) shl 8) or GetRValue(foreColor);
R := Rect(pt.x, pt.y, $7fffffff, $7fffffff);
ZeroMemory(@dttOpts, SizeOf(TDTTOpts));
dttOpts.dwSize := SizeOf(TDTTOpts);
dttOpts.crText := foreColor;
dttOpts.dwFlags := DTT_TEXTCOLOR; // Установите флаг для использования цвета текста
// Остальные опции, такие как iGlowSize, можно установить по желанию
hOldFont := SelectObject(dc, font.Handle);
try
hr := DrawThemeTextEx(ThemeServices.Theme[teWindow], DC, WP_CAPTION, CS_ACTIVE,
PWideChar(Text), Length(Text),
DT_LEFT or DT_TOP or DT_SINGLELINE or DT_NOPREFIX, R, dttOpts);
finally
SelectObject(dc, hOldFont);
end;
end;
Обратите внимание, что в примере выше, мы не используем SetTextColor(dc, foreColor), так как это не влияет на цвет текста в DrawThemeTextEx.
Если вы работаете с стеклом (glass) или на обычном полотне (non-glass canvas), убедитесь, что вы используете правильный контекст устройства (DC) для отображения темы.
Следуя этим шагам, вы сможете корректно указать цвет текста при использовании функции DrawThemeTextEx в вашем Delphi-приложении.
Описание: Вопрос касается настройки цвета текста в функции `DrawThemeTextEx` для Delphi-приложений, где пользователь сталкивается с проблемой неправильной работы цвета текста и требуется корректное указание цвета в формате `COLORREF` и установка соответс
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.