7

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設定しても、使用されるテキストの色は変更されません。crTextDTT_TEXTCOLORDTTOPS

紛らわしいのは、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を使用してテキストを描画するときにテキストの色を指定するにはどうすればよいですか?

4

1 に答える 1

7

crTextメンバーはColorRef. MSDN は、上位バイトは「0 でなければならない」と述べています。

于 2011-07-19T03:23:52.247 に答える