简单一点就是WM_CTLCOLOR
若要复杂一点就派生CStatic,重载Drawitem

解决方案 »

  1.   

    用WM_CTRLCOLOR的同时可能要改变Static的ID号,不能用ID_STATIC
      

  2.   

    回答如何设置静态文本的底色常有人问如何改变对话框控件的颜色,字体的颜色,我今天就提供出一种最方便的方法吧.
    (当然还有很多其他方法,看个人的程序的要求而定.)
    以对话框程序为例:步骤一:在XXDlg.h中定义两个私有变量:
        COLORREF m_txtBkColor;
        COLORREF m_txtForeColor;在XXDlg.cpp的CXXDlg构造函数中初始化:
        m_txtBkColor=RGB(255,0,0);
        m_txtForeColor=RGB(0,0,255);步骤二:
    在Windows中最重要的三个关键词的理解:窗口,消息,事件.
    MFC窗口的基类是CWnd,用MFC我们很多时候都是在和CWnd打交道.那么我们就的熟悉
    CWnd的数据成员,各类函数,事件响应等,这些是基础,不熟的话,找本类库手册查查.我们这里把静态文本框作为CWnd来处理.
    在对话框上加一个静态文本框IDC_STATIC1在CXXDlg::OnPaint()函数中添加代码如下:void CDdDlg::OnPaint() 
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    { CDialog::OnPaint();
                    //以下为添加的代码;
            CWnd* m_static1=GetDlgItem(IDC_STATIC1);//获取控件窗口指针
            CRect rc;
            CString str;
            CDC* pDC=m_static1->GetDC();//获取子窗口CDC指针
            pDC->SetBkColor(m_txtBkColor);//设置子窗口背景色
            pDC->SetTextColor(m_txtForeColor);//设置子窗口文字颜色
            m_static1->GetWindowText(str);//获取子窗口上的文本
                    m_static1->GetClientRect(&rc);//获取子窗口矩形
            m_static1->ValidateRect(rc);  //子窗口客户区有效
                    pDC->DrawText(str,rc,NULL);//绘制文本
         
    }
    }编译运行看看,是不是按你的愿望改变了呢?而且切换窗口,风格也没有消失.
    (问题http://expert.csdn.net/Topic/43922.shtm也请参考,不过有关绘图最好是用个
    从CWnd或其派生类继承另编个子类,提供个Public绘图方法比喻Draw();在Draw中使用
    Invalidate()就可以了.)现在我们来检验以下在程序中随时改变其风格.步骤三:
    在对话框上放个Button吧,添加其对BN_CLICKED消息响应函数OnButton1()实现代码如下:
    void CXXDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CWnd* m_static1=GetDlgItem(IDC_STATIC1);//获取CWnd指针
    m_txtBkColor=RGB(0,255,0);              //改变静态文本框的底色
    m_txtForeColor=RGB(192,128,0);         //改变静态文本框的文字色
    m_static1->SetWindowText("anything");//设置文本
            m_static1->UpdateData();//提交
    Invalidate();//更新对话框
    }
    OK,一切都很如愿嘛,起码来说windows面上的东西,都可由你控制.
    再深一步,多用类库手册吧.
    用完了你再去用API,基本上MFC就可搞定绝大部分问题.
      

  3.   

    CoolFired老兄好热情,兄弟我感谢你上次的帮助。往往。
      

  4.   

    处理WM_CTLCOLOR消息,如下:HBRUSH CCtlColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    if(nCtlColor==CTLCOLOR_STATIC)
    {
            pDC->SetTextColor(RGB(255, 0, 0));
            pDC->SetBkColor(RGB(245, 245, 245));
    } // TODO: Return a different brush if the default is not desired
    return hbr;
    }