MFC - изменить цвет текста текстового элемента управления - PullRequest
15 голосов
/ 28 октября 2009

Как изменить цвет текста элемента управления CStatic? Есть ли простой способ, кроме использования CDC :: SetTextColor?

спасибо ...

Ответы [ 5 ]

30 голосов
/ 29 октября 2009

Вы можете реализовать ON_WM_CTLCOLOR в своем диалоговом классе, не создавая новый производный от CStatic класс:

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    //{{AFX_MSG_MAP(CMyDialog)
    ON_WM_CTLCOLOR()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor)
{
    switch (nCtlColor)
    {
    case CTLCOLOR_STATIC:
        pDC->SetTextColor(RGB(255, 0, 0));
        return (HBRUSH)GetStockObject(NULL_BRUSH);
    default:
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    }
}

Обратите внимание, что приведенный выше код устанавливает текст всех статических элементов управления в диалоговом окне. Но вы можете использовать переменную pWnd, чтобы отфильтровать нужные элементы управления.

8 голосов
/ 28 октября 2009

к сожалению, вы не найдете метод SetTextColor в классе CStatic. Если вы хотите изменить цвет текста CStatic, вам придется написать немного больше.

На мой взгляд, лучший способ - создать собственный класс, полученный из CStatic (CMyStatic), и получить уведомление ON_WM_CTLCOLOR_REFLECT.

BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
    //{{AFX_MSG_MAP(CMyStatic)
    ON_WM_CTLCOLOR_REFLECT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor) 
{
    pDC->SetTextColor(RGB(255,0,0)); 

    return (HBRUSH)GetStockObject(NULL_BRUSH);  
}

Очевидно, что вы можете использовать переменную-член и метод установки для замены красного цвета (RGB (255,0,0)).

С уважением.

6 голосов
/ 01 июля 2013

Просто продолжение проблемы рисования (прозрачный фон), вызванной * return (HBRUSH) GetStockObject (NULL_BRUSH); *

Легкая замена, как показано ниже:

HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if (nCtlColor == CTLCOLOR_STATIC &&
    pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd()
) pDC->SetTextColor(RGB(255, 0, 0));    

return hBrush;

Надеюсь, это поможет.

3 голосов
/ 31 августа 2015

Из ответов, приведенных здесь и в других местах, было неочевидно, как создать производный класс для использования вместо CStatic, который обрабатывает саму раскраску.

Итак, вот что работает для меня, используя MSVS 2013 Version 12.0.40629.00 Update 5. Я могу поместить «Static Text» -control в редакторе ресурсов, затем заменить тип переменной-члена на TColorText.

В .h-файле:

class TColorText : public CStatic
{
protected:
  DECLARE_MESSAGE_MAP( )

public:
  // make the background transparent (or if ATransparent == true, restore the previous background color)
  void setTransparent( bool ATransparent = true );
  // set background color and make the background opaque
  void SetBackgroundColor( COLORREF );
  void SetTextColor( COLORREF );

protected:
  HBRUSH CtlColor( CDC* pDC, UINT nCtlColor );

private:
  bool MTransparent = true;
  COLORREF MBackgroundColor = RGB( 255, 255, 255 );  // default is white (in case someone sets opaque without setting a color)
  COLORREF MTextColor = RGB( 0, 0, 0 );  // default is black. it would be more clean 
                                         // to not use the color before set with SetTextColor(..), but whatever...
};

в .cpp-файле:

void TColorText::setTransparent( bool ATransparent )
{
  MTransparent = ATransparent;
  Invalidate( );
}

void TColorText::SetBackgroundColor( COLORREF AColor )
{
  MBackgroundColor = AColor;
  MTransparent = false;
  Invalidate( );
}

void TColorText::SetTextColor( COLORREF AColor )
{
  MTextColor = AColor;
  Invalidate( );
}

BEGIN_MESSAGE_MAP( TColorText, CStatic )
  ON_WM_CTLCOLOR_REFLECT( )
END_MESSAGE_MAP( )

HBRUSH TColorText::CtlColor( CDC* pDC, UINT nCtlColor )
{
  pDC->SetTextColor( MTextColor );
  pDC->SetBkMode( TRANSPARENT );  // we do not want to draw background when drawing text. 
                                  // background color comes from drawing the control background.
  if( MTransparent )
    return nullptr;  // return nullptr to indicate that the parent object 
                     // should supply the brush. it has the appropriate background color.
  else
    return (HBRUSH) CreateSolidBrush( MBackgroundColor );  // color for the empty area of the control
}
1 голос
/ 12 июля 2016

Очень полезно.

https://msdn.microsoft.com/de-de/library/0wwk06hc.aspx

Похоже на

HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC &&
    pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd()
) pDC->SetTextColor(RGB(255, 0, 0));    
return hBrush;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...