hur.cn - 华软网

 热门搜索

OnCtlColor这个东西谁来帮我解释下,我菜鸟~~

  作者:未知    来源:网络    更新时间:2011/8/17
这个是书上的代码,我试过,没错

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是那块区域?


问题比较杂,希望有人帮我回答下。 

---华软 网友回答---
CBrush不就是画刷句柄吗
---华软网友回复---
1、CBrush可以隐式转换为HBRUSH,当然你写(HBRUSH)m_brush;也可以
2、什么异常?
3、按钮右下方的一块是黄的?这时代码是什么样的?不太理解你说的

---华软网友回复---
我想说的比较详细,简单的说就是
2.直接返回一个画刷也能改变背景的吧?怎么做?
3.按照第一段代码不变,只把最后的return m_brush;
改成 return hbr;也就是做了FillRect的工作,这时应是哪个区域涂色?
---华软网友回复---
2.直接返回一个画刷也能改变背景的吧?怎么做?
能返回,但你的Brush不能是临时变量。你应该把CBrush m_brush (RGB(255,255,255));
这句去掉,把m_brush 变成类的成员。

3.按照第一段代码不变,只把最后的return m_brush;改成 return hbr;也就是做了FillRect的工作,这时应是哪个区域涂色?
这种情况下结果是不可预测的。因为你首先用brush1填充了客户区。然后返回brush2,含义是用brush2填充客户区。但msdn并没有说那个先做。结果来看,是各做了一部分。

---华软网友回复---
CBrush类中重载了HBRUSH类型
operator HBRUSH() const;
---华软网友回复---
一般这样写:
static   HBRUSH   hbrXXX = ::CreateSolidBrush(RGB(255,255,255));
---华软网友回复---
谢谢各位,继续学习      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。