DrawThemeTextExを使用してテキストを描画しています。crText
構造体のCOLORREFメンバーを使用して、特定の色で描画しようとしていますDTTOPS
:
procedure DrawThemeText(dc: HDC; text: WideString; font: TFont; pt: TPoint; foreColor: COLORREF);
var
R: TRect;
dttOpts: TDttOpts;
hOldFont: HFONT;
oldColor: COLORREF;
begin
foreColor := $FF00FF00; //bright lime green
font.
R := Rect(pt.x, pt.y, $7fffffff, $7fffffff);
ZeroMemory(@dttOpts, SizeOf(TDTTOpts));
dttOpts.dwSize := SizeOf(TDTTOpts);
dttOpts.iGlowSize := 1;
dttOpts.crText := foreColor;
dttOpts.dwFlags := DTT_GLOWSIZE or DTT_TEXTCOLOR;
hOldFont := SelectObject(dc, font.Handle);
oldColor := SetTextColor(dc, foreColor);
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
SetTextColor(dc, oldColor);
SelectObject(dc, hOldFont);
end;
残念ながら、コードが指定している明るいライム グリーンの色ではなく、テキストの色は常に黒になります。
デバイスコンテキストに新しいフォントを選択することで、使用されるフォントを変更できます。つまり、次のようになります。
SelectObject(dc, font.Handle);
ただし、構造体のおよびオプションをSetTextColor
設定しても、使用されるテキストの色は変更されません。crText
DTT_TEXTCOLOR
DTTOPS
紛らわしいのは、DTTOPS 構造体で色を指定できることです。
typedef struct _DTTOPTS { DWORD dwSize; // size of the struct DWORD dwFlags; // which options have been specified COLORREF crText; // color to use for text fill COLORREF crBorder; // color to use for text outline COLORREF crShadow; // color to use for text shadow ...
そのメンバーを使用していることを示す DTT_TEXTCOLOR フラグとともに:
#define DTT_TEXTCOLOR (1UL << 0) // crText has been specified
私が達成したいことは文書化されていますが、正しく機能していません。明らかに私は何か間違ったことをしています。
DrawThemeTextExを使用してテキストを描画するときにテキストの色を指定するにはどうすればよいですか?