为什么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);