MFC-更改cstatic文本控件的文本颜色

MFC-更改cstatic文本控件的文本颜色,mfc,visual-c++,Mfc,Visual C++,如何更改CStatic文本控件的文本颜色?除了使用CDC::SetTextColor之外,还有其他简单的方法吗 谢谢…不幸的是,您在CStatic类中找不到SetTextColor方法。如果您想更改CStatic的文本颜色,则需要编写更多的代码 在我看来,最好的方法是创建自己的CStatic派生类(CMyStatic),并在那里显示关于WM CTLCOLOR反射的通知消息 BEGIN_MESSAGE_MAP(CMyStatic, CStatic) //{{AFX_MSG_MAP(CMyS

如何更改CStatic文本控件的文本颜色?除了使用CDC::SetTextColor之外,还有其他简单的方法吗


谢谢…

不幸的是,您在CStatic类中找不到SetTextColor方法。如果您想更改CStatic的文本颜色,则需要编写更多的代码

在我看来,最好的方法是创建自己的CStatic派生类(CMyStatic),并在那里显示关于WM CTLCOLOR反射的通知消息

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);  
}
显然,可以使用成员变量和setter方法替换红色(RGB(255,0,0))


注意。

您可以在对话类中的\u WM\u 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
变量来过滤所需的控件。

只是绘画问题(透明背景)的后续问题,这是由*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;

希望这能有所帮助。

从这里和其他地方给出的答案来看,如何创建一个派生类来代替处理着色本身的CStatic并不明显

下面是我使用MSVS 2013版本12.0.40629.00更新5的工作原理。我可以在资源编辑器中放置一个“静态文本”控件,然后用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
}
非常有用

一模一样

HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_STATIC &&
    pWnd->GetSafeHwnd() == GetDlgItem(XXX)->GetSafeHwnd()
) pDC->SetTextColor(RGB(255, 0, 0));    
return hBrush;

你是对的。这是另一种方法。我刚才提到我认为更好的方式。在第二种情况下,您必须将代码添加到每个要以其他颜色显示标签的对话框中。是的,我同意,在这种情况下,您的方式是更好的方式。如果有人想对整个对话框(或应用程序)进行重大修改,可以使用我的方法;将导致绘画问题(或时髦的透明背景“功能”)。您可能希望返回(HBRUSH)GetStockObject(白色画笔)@杰克·博尔丁:谢谢你的评论。你能分享一下为什么白色画笔比空画笔更受欢迎,或者仅仅是非空画笔更受欢迎?再次感谢。按照这些说明加上@JackBolding的建议,控件后面有一个白色背景。我的解决方法如下:首先,调用
OnCtlColor()
(不管发生什么)的基类版本,并将返回的
HBRUSH
存储在一个变量中。接下来,如果合适,调用
pDC->SetTextColor()
。最后,从第一步返回笔刷。感谢您的解决方案。它会产生一些意想不到的副作用。现在我的静态控件与主视图的控件背景颜色不同,文本背景也是白色的。