这个是书上的代码,我试过,没错HBRUSH CPrintTextDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
CBrush m_brush (RGB(255,255,255));
CRect m_rect;
GetClientRect(m_rect);
pDC->SelectObject(&m_brush);
pDC->FillRect(m_rect,&m_brush);
return m_brush;
}问题:
1.它要返回的是一个画刷句柄吧,怎么直接返回CBrush对象?
2.那些FillRect什么的是不需要的吧?我添加了一个全局变量,m_brush然后就这样
HBRUSH CPrintTextDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
m_brush.CreateSolidBrush(RGB(255,255,0));
//CRect m_rect;
//GetClientRect(m_rect);
//pDC->SelectObject(&m_brush);
//pDC->FillRect(m_rect,&m_brush);
// TODO: Return a different brush if the default is not desired
return (HBRUSH)m_brush;
}然后再DestroyWindow里面删除了对象,结果颜色是变了,但是弹出错误说程序发生异常,不懂~~3.我的界面上就一个按钮,然后我一开始最后的那个 return m_brush;那里没改,是return hbr;
结果只有那个按钮右下方的一块是黄的,为什么ClientRect是那块区域?
问题比较杂,希望有人帮我回答下。 

解决方案 »

  1.   

    1、CBrush可以隐式转换为HBRUSH,当然你写(HBRUSH)m_brush;也可以
    2、什么异常?
    3、按钮右下方的一块是黄的?这时代码是什么样的?不太理解你说的
      

  2.   

    我想说的比较详细,简单的说就是
    2.直接返回一个画刷也能改变背景的吧?怎么做?
    3.按照第一段代码不变,只把最后的return m_brush;
    改成 return hbr;也就是做了FillRect的工作,这时应是哪个区域涂色?
      

  3.   

    2.直接返回一个画刷也能改变背景的吧?怎么做?
    能返回,但你的Brush不能是临时变量。你应该把CBrush m_brush (RGB(255,255,255));
    这句去掉,把m_brush 变成类的成员。3.按照第一段代码不变,只把最后的return m_brush;改成 return hbr;也就是做了FillRect的工作,这时应是哪个区域涂色?
    这种情况下结果是不可预测的。因为你首先用brush1填充了客户区。然后返回brush2,含义是用brush2填充客户区。但msdn并没有说那个先做。结果来看,是各做了一部分。
      

  4.   

    CBrush类中重载了HBRUSH类型
    operator HBRUSH() const;
      

  5.   

    一般这样写:
    static   HBRUSH   hbrXXX = ::CreateSolidBrush(RGB(255,255,255));