有一个工作线程,进行串口通信。在整个通讯过程中有7个状态,这7状态需要在对话框中反映出来。对话中有7个EditBox控件或CStatic控件标有状态。
我想每当改变一个状态后线程用PostMessage发送消息到对话框,对话框中根据相应的状态改变EditBox控件或CStatic控件的背景色。有这样两个问题,1、工作线程发送什么样的消息好;2、怎样轮流改变背景色。
谢谢!

解决方案 »

  1.   

    处理消息WM_CTRLCOLOR
    HBRUSH CXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何属性
    if ( pWnd->GetSafeHwnd()==m_edit2.GetSafeHwnd() )
    {
    static HBRUSH hbrEdit = ::CreateSolidBrush( RGB(255, 0, 0) );
    pDC->SetBkMode ( TRANSPARENT );
    return hbrEdit;
    } // TODO:  如果默认的不是所需画笔,则返回另一个画笔
    return hbr;
    }
      

  2.   

    1、工作线程发送什么样的消息好;
    消息嘛,你自己定一个,什么都好, M$ 建议自定义消息 一般应大于 (WM_USER+100).
    2、怎样轮流改变背景色。
       A)有几种颜色,请先创建好相对应的画刷. 
       B)为每个需要改变颜色的控件保丰一个画刷索引.
       C)响应WM_CTRLCOLOR. (楼上) 可以通过控件ID号来区别不同的控件:HBRUSH CXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何属性
    switch( pWnd->GetDlgCtrlID() )
    {
    case IDC_EDIT1:
    pDC->SetBkMode ( TRANSPARENT );
    return (HBRUSH)m_arrbs[m_index1].GetSafeHandle(); case IDC_EDIT2:
    pDC->SetBkMode ( TRANSPARENT );
    return (HBRUSH)m_arrbs[m_index2].GetSafeHandle();
    ..... } // TODO:  如果默认的不是所需画笔,则返回另一个画笔
    return hbr;
    }  d) 响应你的 自定义消息, 根据需要改变 相应的画刷索引,和更新控件:
    if(...)
    {
      m_index1 = 4;
      GetDlgItem(IDC_EDIT1)->Invalidate();
    }...
      

  3.   

    上面的大哥说自定义消息,那么自定义消息中部也要响应WM_CTRLCOLOR。这样一来,为什么不直接的用
    WM_CTRLCOLOR呢?
      

  4.   

    重载按钮类和CStatic类,添加一个设置其背景色的函数,直接嗲用这个函数就可以了!呵呵,重载函数参考1楼的回答。然后将这些按钮和Static控件的资源ID设置为连续的,在resource.h中修改,然后使用GetDlgItem(ID)和for循环直接改变之!
      

  5.   

    用这两个消息
       WM_CTLCOLOREDIT
       WM_CTLCOLORSTATIC
    wParam 是 窗口的 HDC
    lParam 是 控件的 ID这里是例子
       http://www.china-askpro.com/msg9/qa24.shtml