对话框的  WM_CTLCOLORDLG这个消息的问题大家知道,对话框是会处理这个消息的。如果我们对这个消息返回一个黑色刷子, 而且onpaint 里不填充颜色背景,那么对话框的背景颜色应该是黑色的。这是理论知识。
为了验证这个理论知识:我在 类的的成员里添加了一个刷子, onctlcor里返回数字,代码为:
HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
return (HBRUSH)brush;  //黑色brush   CBrush brush;}结果,对话框上的控件的背景变黑了,注意是控件的背景,不是对话框自身变黑色!而是控件!!
我很奇怪为什么会这样,于是又修改代码:HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor==CTLCOLOR_DLG)
{
int i=2;  //这里设置断点,结果没有进入!!!
}return (HBRUSH)brush;  //黑色brush   CBrush brush;}我很奇怪,mfc封装wm_ctlcolor这个消息的时候,难道没有对  WM_CTLCOLORDLG处理嘛?
附资料:
wm_ctlcolor是一个笼统的消息,具体的有
    WM_CTLCOLORBTN
    WM_CTLCOLOREDIT
    WM_CTLCOLORDLG
    WM_CTLCOLORLISTBOX
    WM_CTLCOLORSCROLLBAR
    WM_CTLCOLORSTATIC
等。

解决方案 »

  1.   

    你这个对话框中并没有一个“子”对话框的“控件”,所以不会有CTLCOLOR_DLG的消息;要处理对话框自己的背景色,可以设置消息映射:
    ON_WM_CTLCOLOR_REFLECT ()
    然后实现CWnd::CtlColor方法。
      

  2.   

    只有对话框变大时,才有WM_CTLCOLORDLG,变小时没有该消息是因为变小不需要重绘对话框客户区。
    貌似是因为这个原因导致的,这个消息没有发出
      

  3.   


    我试过了,成功了, 更正一个错误,与反射无关,建立了2个对话框。工程是 “对话框工程”增加了一个对话框。代码为:
    OnInitDialog: pdlg=new CMyDialog; pdlg->Create(IDD_DIALOG1,this);// pdlg->SetParent(this); pdlg->ShowWindow(SW_SHOW); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }父对话框这函数源码没变
    HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    if(nCtlColor==4)
    {
    int i=2;
    } return (HBRUSH)brush;
    }
    子对话框源码:CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
    : CDialog(CMyDialog::IDD, pParent)
    {
    brush.CreateSolidBrush(RGB(255,0,0));
    }BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_WM_CTLCOLOR()
    END_MESSAGE_MAP()
    // CMyDialog 消息处理程序HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    //HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何属性 // TODO:  如果默认的不是所需画笔,则返回另一个画笔 if(nCtlColor==4)
    {
    int i=2;
    } return (HBRUSH)brush;
    //return hbr;
    }也就说 与反射无关系,作为一对话框,如果想相应wm_ctlcolordlg这个消息,那么只能在自身处理,你也不能在父窗口中处理。
    以上是我的纠正
      

  4.   


    在第8楼的基础上, 第8楼基础上,添加另一个消息:
    BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_WM_CTLCOLOR()
    ON_WM_ERASEBKGND()
    END_MESSAGE_MAP()
    // CMyDialog 消息处理程序HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    //HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何属性 // TODO:  如果默认的不是所需画笔,则返回另一个画笔 if(nCtlColor==4)
    {
    int i=2;
    } return (HBRUSH)brush;
    //return hbr;
    }BOOL CMyDialog::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 RECT rect;
    GetClientRect(&rect);
    InflateRect(&rect,-10,-10);
    pDC->FillSolidRect(&rect,RGB(0,0,255));
    // return CDialog::OnEraseBkgnd(pDC);
    return TRUE;
    }发现wm_ctlcolordlg并没有覆盖 wm_erasbkgnd所绘制的界面,怎么回事呢?
      

  5.   

    要用wm_ctlcolordlg设置背景就不要处理WM_ERASEBKGND的消息