首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

为何staitc控件的蓝色没有被这个刷子给覆盖了

2013-04-05 
为什么staitc控件的蓝色没有被这个刷子给覆盖了为什么staitc控件的蓝色没有被这个刷子给覆盖了HBRUSH Ctes

为什么staitc控件的蓝色没有被这个刷子给覆盖了
为什么staitc控件的蓝色没有被这个刷子给覆盖了

HBRUSH Ctest6Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

//CreateSolidBrush(RGB(0,255,0));// 

RECT rect;

GetClientRect(&rect);

if(nCtlColor==CTLCOLOR_STATIC)
{
//pDC->SetBkMode(TRANSPARENT);

pDC->FillSolidRect(&rect,RGB(0,0,255));//蓝色
}


// TODO:  在此更改 DC 的任何属性

// TODO:  如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}


最后的效果:static 是蓝色。 只有一个static控件。


wm_ctlcolorstatic这个消息的时候,会用一个刷子来绘制static的背景,默认应该是灰色的。

可是我们最后的结果却是蓝色。怎么回事?

[解决办法]
被OnPaint刷掉了,改下:
HBRUSH Ctest6Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr =CDialog::OnCtlColor(pDC, pWnd, nCtlColor);


RECT rect;
GetClientRect(&rect);
if(nCtlColor==CTLCOLOR_STATIC)
{
   static CBrush stBrush(RGB(0,255,0));
return stBrush;
}
[解决办法]
MSDN:
When you call FillSolidRect, the background color, which was previously set using SetBkColor, is set to the color indicated by clr.
百度:
调用FillSolidRect时,以前用SetBkColor设置的背景色,被设置为clr指定的颜色。

这里
FillSolidRect会用修改背景色为蓝色
然后用hbr(灰色)刷背景,这时背景是灰色
绘制文字时,默认是OPAQUE模式,会使用背景色(蓝色)刷,覆盖原背景(灰色),这时背景是蓝色
(注意看,是大部分背景,右边框还是灰色的,FillRect里也有说明不包含矩形的右下边界)

另外加了pDC->SetBkMode(TRANSPARENT);,不使用背景色(蓝色),这时就是灰色了
还有,应该是pWnd->GetClientRect(&rect);

热点排行