我的程序有很多动态生成的CStatic控件(如果用CreateEx()生成的控件叫做动态生成的话)。这些控件其实是从CStatic继承而来的,我把继承得到的这个类做了一个链表,像下面这样:class CItemStatic: public CStatic {
bool m_Flag;
CItemStatic *pNext;
}在对话框的OnInitDialog()中我生成这些控件:// TODO:
pItem = new CItemStatic;
pItem->CreateEx( /*参数省略*/ );
/*生成链表省略*/现在我能访问每一个结点的指针。在工作线程中,我不停遍历这个链表,如果遍历时发现当前结点的m_Flag属性为true时,我将启动下面这个线程改变CStatic控件的背景颜色和字体颜色。DWORD WINAPI ChangeColor(CItemStatic* pItem)
{
pItem->SetWindowTextW(_T("Hello!"));     //可用
pItem->MessageBox(_T("Hello!"));         //可用CDC *pDC = pItem->GetWindowDC();   //可用
pDC->SelectObject(&br);            //可用 (其中br为:CBrush br; br.CreateSolidBrush(0x000000FF); )
pDC->Rectangle(0,0,100,30);        //可用  //TODO: 永久改变该静态控件的字体颜色和背景颜色pDC->SetBkColor(RGB(0,0,255));     //编译连接通过,实际不显示,即不可用。
pDC->SetTextColor(RGB(0,0,0));     //编译连接通过,实际不显示。pItem->ReleaseDC(pDC);
pItem->UpdateWindow();             //可用
}请问,该怎么写才能达到我的目的,即从那一刻开始,永久改变该静态控件的字体颜色和背景颜色,直到程序结束?请直接附代码,谢谢!

解决方案 »

  1.   

    看一下调离ChangeColor之后CItemStatic中的onpain有没有被调用要动态改变,最好是重写CItemStatic中的OnPaint函数,你想怎样显示都行
      

  2.   

    答1楼:继承自CStatic的这个类没有OnPaint函数,也无可重载的OnPaint函数。谢谢。
      

  3.   

    ==============================WM_CTLCOLOR==========================================
    WM_CTLCOLOR是一个由控件(Control)发送给它父窗口的通告消息(Notification message)。生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。
    在About dialog中添加两个Edit control,设定其ID为IDC_EDIT1与IDC_EDIT2;第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。
    1. 在CAboutDlg中添加一个数据成员:HBRUSH m_brMine;
    2. 利用向导映射AboutDlg的WM_CTLCOLOR消息,产生函数:
    HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    pDC是AboutDlg的设备上下文,pWnd是AboutDlg中发送该消息的control指针,
    nCtlColor是Control的类型编码。对其进行如下修改:
    HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT))
    {
    COLORREF clr = RGB(255,0,0);
    pDC->SetTextColor(clr);   //设置红色的文本
    clr = RGB(0,0,0);
    pDC->SetBkColor(clr);     //设置黑色的背景
    m_brMine = ::CreateSolidBrush(clr);
    return m_brMine;  //作为约定,返回背景色对应的刷子句柄
    }
    else
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    return hbr;
    }
    }第二种方法(对应于IDC_EDIT2): 利用MFC 4.0的新特性: Message relection。
    1.利用向导添加一个新的类:CColorEdit,基类为CEdit;
    2.在CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;
    3.利用向导映射CColorEdit的"=WM_CTLCOLOR"消息,产生函数:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:
    HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
    {
    COLORREF clr = RGB(0,0,0);
    pDC->SetTextColor(clr);   //设置黑色的文本
    clr = RGB(255,0,0);
    pDC->SetBkColor(clr);     //设置红色的背景
    m_bkBrush = ::CreateSolidBrush(clr);
    return m_bkBrush;  //作为约定,返回背景色对应的刷子句柄
    }
    4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;
    5.在定义CAboutDlg的color.cpp文件中加入:#include "coloredit.h"CStatic   同样。。
      

  4.   

    不写自己写。(谢1楼提示。)解:添加消息响应OnPaint(),n加入代码:CItemStatics::OnPaint()
    {CDC* pDC = GetDC();
    CBrush br;
    br.CreateSolidBrush(RGB(0,0,255));
    pDC->SelectObject(br);pDC->Rectangle(0,0,LowerRight_x,LowerRight_y);   //背景将永久改变CFont font;
    font.CreatePointFont(168,_T("Impact"));pDC->SelectObject(font);
    pDC->SetTextAlign(TA_CENTER);                    //可居中
    pDC->SetTextColor(RGB(255,255,255));             //可设字体颜色
    pDC->TextOutW(_T("All right, it's done."));}