sdk的对话框工程版本
static HBRUSH hbr=CreateSolidBrush(RGB(255,0,0));
case WM_ERASEBKGND:
{
RECT rect;
GetClientRect(hDlg,&rect);
hdc=(HDC)wParam;
FillRect(hdc,&rect,hbr);
return 0;
}
break; case WM_CTLCOLORDLG:
{
int  ii=2;
return (HRESULT)GetStockObject(BLACK_BRUSH);
}
break;运行的结果,是黑色的 分析原因:可能是WM_CTLCOLORDLG覆盖了红色背景,我分析的对否?

解决方案 »

  1.   

    不知!测试一下
    case WM_CTLCOLORDLG:
    {
    int  ii=2;
    return (HRESULT)GetStockObject(BLACK_BRUSH);
    }这里面直接return掉,看看效果是什么撒
      

  2.   


    null_brush
    后,结果是红色的。
      

  3.   

    case WM_ERASEBKGND:
     {
     RECT rect;
     GetClientRect(hDlg,&rect);
     hdc=(HDC)wParam;
     FillRect(hdc,&rect,hbr);
     return 0;  改成return 1;表示不要擦除(因为你刚填充红色),后面的case WM_CTLCOLORDLG要去掉。
    因为调用顺序是ERASEBKGND-》CTLCOLORDLG-》PAINT
     }
      

  4.   


    为了进一步验证这个结论:我把wm_ctlcolordlg这个消息给注释掉后,发现,红色看不到了, 是否可以说明:windows默认 会用wm_ctlcolordlg这个消息去再次擦背景?把红色擦掉?我用mfc建立一个对话框工程:看是否是这样,
    Onctlcolor的源码为:
    CBrush brush(RGB(0,0,255)); HBRUSH hbru=(HBRUSH)brush; return hbru;onerasebkgnd的源码为:
    BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    RECT rect;
    GetClientRect(&rect);
    CBrush brush(RGB(255,0,0));
    pDC->FillRect(&rect,&brush);
    return TRUE;
    //return CDialog::OnEraseBkgnd(pDC);
    }
    结果是红色,而不是蓝色也就说wm_ctlcolrodlg并没有把wm_erasebkgnd给擦掉,覆盖掉。怎么回事?
      

  5.   

    惊奇的发现, wm-erasebkgnd的值会影响到 WM_CTLCOLORDLG这个消息!
      

  6.   


    你要搞清楚BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC) 返回值的含义呀你把
    BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    RECT rect;
    GetClientRect(&rect);
    CBrush brush(RGB(255,0,0));
    pDC->FillRect(&rect,&brush);
    return TRUE;
    //return CDialog::OnEraseBkgnd(pDC);
    }
    ----------------------------------------
    中改为 return FALSE 再次看看是什么结果
      

  7.   

    HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    { CBrush brush(RGB(0,0,255)); HBRUSH hbru=(HBRUSH)brush; return hbru;
    }BOOL Ctest33Dlg::OnEraseBkgnd(CDC* pDC)
    {
    RECT rect;
    GetClientRect(&rect);
    CBrush brush(RGB(255,0,0));
    pDC->FillRect(&rect,&brush);
    return FALSE;
    //return CDialog::OnEraseBkgnd(pDC);
    }
    结果依然是红色,修改返回值不管用。你要不自己试试
      

  8.   

    我为什么觉得是break写在了{}外引起的呢、、、、、
      

  9.   

    CBrush brush(RGB(0,0,255));
     
    HBRUSH hbru=(HBRUSH)brush;
     
    return hbru;  //此处有误,brush会被析构掉,最好定义一个成员变量CBrush m_bk_brush;
      

  10.   

    This message is sent to a dialog box before Windows draws the dialog box. By responding to this message, the dialog box can set its text and background colors by using the given display device context handle. The DefWindowProc function selects the default system colors for the dialog box.
      

  11.   


    多谢,改成类的成员后,已经有一些控件的背景被修改了。说明wm_ctlcolor可能会覆盖wm_erasebkgnd的效果的。但是
    mfc与sdk对wm_ctlcolor的处理差异很大!后者是,完全覆盖之,除了控件外, 因为对于sdk,我们处理的是wm-ctlcolordlg 这个具体的消息,所以可以
    可以用新的颜色来覆盖wm_erasebkgnd填充的效果。而mfc则不一样,如果返回刷子,那么并不会把整个对话框的背景给覆盖,你可能说,wm_erasebkgnd的返回值有关系啊,你返回true或者flase试试,看结果就知道了。很遗憾,mfc还真与 返回值无关。而且也看不到wm_ctlcolordlg去覆盖wm_erasebkgnd所填充的背景。仅仅修改的是:控件的颜色.看代码:
    HBRUSH Ctest33Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    return (HBRUSH)brush;  //黑色brush   CBrush brush;}
      

  12.   

    对于修改背景色,我觉得没必要在wm_erasebkgnd中处理,在wm-ctlcolordlg中处理就好了。
      

  13.   


    好吧。我只是忍不住想问 为啥mfc和sdk对同一个消息处理的结果不一样
      

  14.   

    楼主参考下《Windows界面编程第一篇 位图背景与位图画刷》吧,这里讲解的很详细的。
    http://blog.csdn.net/morewindows/article/details/8451629
      

  15.   


    16楼的问题, 我故意加了一句:
    if(nCtlColor==CTLCOLOR_DLG)
    {
    int i=2;  //这里设置断点
    }发现没有进入if语句里,所以导致, 仅仅修改的是:控件的颜色., 而对话框背景没有被WM_CTLCOLORDLG修改。 控件倒是被黑色了。  对话框背景没有被黑色。