1:如何改变CDialogBar中Dialog的背景颜色?SetDialogBkColor()?如果用这个函数,该放那里?2:如何改变CDialogBar中Dialog中控件的背景颜色?

解决方案 »

  1.   

    2
    如何改变控件的颜色    有两种方法。其一,可以在父类中指定控件的颜色,或者利用MFC4.0新的消息反
    射在控件类中指定颜色。
        当控件需要重新着色时,工作框调用父窗口(通常是对话框)的
    CWnd: : OnCrtlColor,可以在父窗口类中重置该函数并指定控件的新的绘画属
    性。例如,下述代码将对话中的所有编辑控件文本颜色改为红色:
    HBRUSH CAboutDig : : OnCtlColor (CDC * pDCM , CWnd * pWnd , UINT nCtlColor)
    {
        HBRUSH hbr = CDialog : : OnCtlColor (pDC, pWnd , nCtlColor );    //Draw red text for all edit controls .
        if (nCtlColor= = CTLCOLOR_EDIT )
           pDC —> SetTextColor (RGB (255 , 0 , 0 , ) ) ;    return hbr ;
    }
        然而,由于每个父窗口必须处理通知消息并指定每个控件的绘画属性,所以,
    这种方法不是完全的面向对象的方法。控件处理该消息并指定绘画属性更合情合理。
        消息反射允许用户这样做。通知消息首先发送给父窗口,如果父窗口没有处理
    则发送给控件。创建一个定制彩色列表框控件必须遵循下述步骤。
        首先,使用ClassWizard 创建一个CListBox 的派生类并为该类添加下述数据
    成员。
    class CMyListBox ; publilc CListBox
    {
    …private;
        COLORREF m_clrFor ;     // foreground color
        COLORREF m_clrBack ;   //background color
        Cbrush m_brush ;         //background brush
        其次,在类的构造函数中,初始化数据中。
    CMyListBox : : CMyListBox ()
    {
        //Initialize data members .
        m_clrFore =RGB (255 , 255 , 0) ;   // yellow text
        m_clrBack=RGB (0 , 0 , 255) ;    // blue background
        m_brush . CreateSolidBrush  (m _clrBack );
    }
        最后,使用ClassWizard处理反射的WM_CTLCOLOR(=WM_CTLCOLOR)消息并指定新
    的绘画属性。
    HBRUSH CMyListBox : : CtlColor (CDC* pDC, UINT nCtlColor )
    {
        pDC—>SetTextColor (m_clrFore);
        pDC—>SetBkColor  (m_clrBack);    return (HBRUSH) m_brush.GetSafeHandle ()
    }
        现在,控件可以自己决定如何绘画,与父窗口无关。
      

  2.   

    派生一个CDialogBar,然后在WM_CTLCOLOR中设置控件的背景等
      

  3.   

    1, 2都可以用 WM_CTLCOLOR搞定重载 CDialogBar的 WM_CTLCOLOR消息, 然后if (nCtlColor == CTLCOLOR_DLG)   //对话框背景
        pDC->SetBKColor(...);
    else if (nCtlColor == CTLCOLOR_EDIT)  //文本框
        pDC->...etc.
      

  4.   

    如果是 CDialog类, 应该在 Initstance中加入SetDialogBKColor()