今天做的一个关于改变对话框背景颜色的MFC程序
HBRUSH CDlg1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何属性 // TODO:  如果默认的不是所需画笔,则返回另一个画笔
//return hbr;

// TODO: 在此添加额外的初始化代码
static CBrush brush;
brush.CreateSolidBrush(RGB(0,0,0)); 
return brush;
}
最后倒是能实现功能了,但是提示错误debug assertion failed,不知道是那里的问题。急救啊

解决方案 »

  1.   

    帮你试了一下,是brush.CreateSolidBrush(RGB(0,0,0));多次调用导致的出错。
    brush是静态变量,虽然只有一个对象,但是每次执行OnCtlColor时都会再次进行CreateSolidBrush创建操作。
    如果确定只是需要黑色画刷的话,可以做如下修改:
    原代码 static CBrush brush;
    brush.CreateSolidBrush(RGB(0,0,0));  
    return brush;新代码return (HBRUSH)GetStockObject(BLACK_BRUSH);以上同样适用于GRAY_BRUSH,WHITE_BRUSH等若干系统自己的画刷。如果系统自带的画刷颜色不满足要求,则建议将此画刷变量改为对话框类的成员变量m_brush,然后在对话框构造函数或者OnInitDialog中进行画刷的创建,在OnCtlColor中直接返回m_brush。再或者,可以对原有代码中brush的创建情况进行判断,得到代码如下
    static CBrush brush;
    if (brush.m_hObject == NULL)
    brush.CreateSolidBrush(RGB(0,0,0));  
    return brush;不过感觉最后一种方式不如用成员变量更易于理解。
      

  2.   

    OnCtlColor()这个函数在每次窗口重绘的时候都会执行一次。你在函数里面
    static CBrush brush;
    brush.CreateSolidBrush(RGB(0,0,0)); 
    写这两句代码,在窗口第一次启动的时候已经给brush对象赋值,以后窗口再重绘的时候又执行这两句代码,此时因为brush已经不为空,所以再次给它赋值会出错。
    1、brush定义为成员变量,并把brush.CreateSolidBrush(RGB(0,0,0)); 放到类的构造函数中。
    2、 static CBrush brush;
        brush.DeleteObject();
        brush.CreateSolidBrush(RGB(0,0,0)); 
    3、同2楼的方法