我在一个对话框中添加了一个CStatic控件,现在想修改它的背景色  我的代码如下:
 1 通过classwizard 添加该对话框的WM_CTLCOLOR  并且在对应的函数中添加了如下代码
   if (nCtlColor == IDC_STATIC_YELLOW)
{

pDC->SetTextColor(RGB(100, 112, 1));//设置成你背景的颜色
pDC->SetBkColor(RGB(123,123,32));

return (HBRUSH)::GetStockObject(NULL_BRUSH);
} 2 在该对话框的OnInitDialog方法中添加了如下代码:
CStatic *m_PStatic = (CStatic *) GetDlgItem(IDC_STATIC_YELLOW);
m_PStatic->RedrawWindow();
  运行的时候为什么对应的CStatic控件没有改变呢??
  请各位说说我这样做错误在哪里? 谢谢

解决方案 »

  1.   

    应该是:
    if (nCtlColor == CTLCOLOR_STATIC)//这里不同
    {
        SetTextColor() and so on......
    }
      

  2.   

    你根本就是用错了。nCtlColor不是控件的ID!!!如下:
    nCtlColorContains one of the following values, specifying the type of control: CTLCOLOR_BTN   Button control
    CTLCOLOR_DLG   Dialog box
    CTLCOLOR_EDIT   Edit control
    CTLCOLOR_LISTBOX   List-box control
    CTLCOLOR_MSGBOX   Message box
    CTLCOLOR_SCROLLBAR   Scroll-bar control
    CTLCOLOR_STATIC   Static control 应该用pWnd参数来判断。
    if (pWnd== GetDlgItem(IDC_STATIC_YELLOW))
    {

    pDC->SetTextColor(RGB(100, 112, 1));//设置成你背景的颜色
    pDC->SetBkColor(RGB(123,123,32));

    return (HBRUSH)::GetStockObject(NULL_BRUSH);
    }
      

  3.   

    我是试了上面那位大哥的方法 现在关键我有多个CStatic控件  通过上面的设置之后所有的CStatic都变成了一个颜色   如果我要设置成不同的颜色 通过if (pWnd== GetDlgItem(IDC_STATIC_YELLOW))
    {

    pDC->SetTextColor(RGB(100, 112, 1));//设置成你背景的颜色
    pDC->SetBkColor(RGB(123,123,32));

    return (HBRUSH)::GetStockObject(NULL_BRUSH);
    }
      这样来判断好像不行
      另外按照上面happyparrot来做的话 我还要不要调用这个 
      2 在该对话框的OnInitDialog方法中添加了如下代码:
    CStatic *m_PStatic = (CStatic *) GetDlgItem(IDC_STATIC_YELLOW);
    m_PStatic->RedrawWindow();
      

  4.   

    我的:
    // ColorStatic.cpp : implementation file
    //#include "stdafx.h"
    #include "ColorStatic.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CColorStaticCColorStatic::CColorStatic()
    {
    m_TextColor = RGB(255,255,255);
    m_BackColor = RGB(100,100,100);
    }CColorStatic::~CColorStatic()
    {
    }
    BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
    //{{AFX_MSG_MAP(CColorStatic)
    ON_WM_PAINT()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CColorStatic message handlersvoid CColorStatic::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    CRect rect;
    GetClientRect(&rect); dc.SetBkMode(TRANSPARENT); //设置背景为透明的
    CBrush *pBrush = new CBrush(m_BackColor);
    //dc.SelectObject(pBrush);
    dc.FillRect(&rect,pBrush);

    CFont *pFont=GetParent()->GetFont(); //获取主窗口的字体
    CFont *pOldFont;
    pOldFont=dc.SelectObject(pFont); dc.SetTextColor(m_TextColor);
    CString strCaption;
    this->GetWindowText(strCaption); //获取窗口文本 dc.DrawText(strCaption,&rect,DT_VCENTER|DT_CENTER|DT_SINGLELINE); dc.SelectObject(pOldFont); delete pBrush;
    pBrush = NULL;}void CColorStatic::SetTextColor(COLORREF TextColor)
    {
    m_TextColor=TextColor;
    }void CColorStatic::SetBkColor(COLORREF color = RGB(150,150,150))
    {
    CRect rect;
    GetClientRect(&rect);
    m_BackColor = color;
    InvalidateRect(&rect);
    }
      

  5.   

    改的时候只需要调用SetBkColor方法。
      

  6.   

    或许你应该看看SDK的内容.那样就会更明白了.
    有时只看MFC是不能解决问题.MFC是对SDK进行了封闭而已.
      

  7.   

    To :gudulyn
    不用这么复杂吧 还要这样做 我只要能够在我定义的对话框中修改我的静态控件背景色就行了
      

  8.   

    HBRUSH CColor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialogBar::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    int nID = pWnd->GetDlgCtrlID();
    if ((nID >= IDC_STATIC1) && (nID <= IDC_STATIC23))
    {
    int i=nID-IDC_STATIC1;
    m_br.DeleteObject();
    m_br.CreateSolidBrush(m_showcol[i]);
    hbr = m_br;
    // pDC->SetBkMode(TRANSPARENT);
    }

    // TODO: Return a different brush if the default is not desired
    return hbr;
    }
      

  9.   

    if (nCtlColor == CTLCOLOR_STATIC && IDC_STATIC_YELLOW == pWnd->GetDlgCtrlID())
    {
        SetTextColor() and so on......
    }正确了就给分
      

  10.   

    HBRUSH CRoomStatusCheckDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO: Change any attributes of the DC here
    if (nCtlColor == CTLCOLOR_STATIC)
    {
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_RED)
    {
    pDC->SetBkColor(RGB(255, 0, 0));
    }
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_YELLOW)
    {
    pDC->SetBkColor(RGB(246, 251, 37));
    }
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_GREEN)
    {
    pDC->SetBkColor(RGB(0, 255, 0));
    }
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_BLUE)
    {
    pDC->SetBkColor(RGB(0, 0, 255));
    }
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_GRAY)
    {
    pDC->SetBkColor(RGB(190, 190, 190));
    }
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_DEEPGREEN)
    {
    pDC->SetBkColor(RGB(58, 130, 111));
    }
    return (HBRUSH)::GetStockObject(NULL_BRUSH);
    }
    // TODO: Return a different brush if the default is not desired
    return hbr;
    }
    想了一下 发现可以这样做
    if (pWnd->GetDlgCtrlID() == IDC_STATIC_GRAY)
    {
    pDC->SetBkColor(RGB(190, 190, 190));
    }
    谢谢上面几位热心的朋友
      

  11.   

    感谢samsun2000 、gudulyn、aaronwang81、livedeal(怀念)的热心回答  
    感谢happyparrot一语中的的解答谢谢