2011-07-19 3 views
6

Я использую DrawThemeTextEx, чтобы нарисовать текст. Я пытаюсь сделать это в той или иной цвет, используя элемент crText COLORREF из DTTOPS структуры:Как изменить цвет шрифта DrawThemeTextEx?

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; 

К сожалению, цвет текста всегда выходит черный, а не ярко-зеленый лайм цвет мой код уточнением:

enter image description here

я может изменить шрифт , который используется selecting the new font into the device context, то есть:

SelectObject(dc, font.Handle); 

но ни SetTextColor, ни установки crText и DTT_TEXTCOLOR варианты в DTTOPS структуры, изменения цвета текста.

Что сбивает с толку, что DTTOPS structure allows me to specify a color:

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?

+0

Вы рисуете на стекле или на обычном нестерильном холсте управления? –

+0

В этом примере я рисую на обычном (не стеклянном) холсте. –

ответ

6

Член crText является ColorRef. MSDN says старший байт должен быть равен нулю.

+0

Ну, я буду ... –