修改字体颜色和static的背景
当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。
也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。
修改背景颜色:
case WM_CREATE:
hSolidBrush = CreateSolidBrush(RGB(0, 100, 0));
。。。
case WM_CTLCOLORSTATIC:
{
return (INT_PTR)hSolidBrush; //这里必须返回画刷句柄
}
结果:
修改文字背景颜色
上图中,我们的代码只是改变了控件的背景颜色(整个子窗口的背景颜色),却忽略了文字的背景颜色。
修改文字背景颜色使用 SetBkColor 函数,它的原型为:
COLORREF SetBkColor(
HDC hdc, //设备环境句柄
COLORREF crColor //背景颜色
);
修改文字前景色(文字颜色)使用 SetTextColor 函数,它的原型为:
COLORREF SetTextColor(
HDC hdc, //设备环境句柄
COLORREF crColor //背景颜色
);
这里我们修改的是 static 控件中的文本颜色,所以需要获取 static 控件的设备环境句柄。非常巧妙的是,发送 WM_CTLCOLORSTATIC 消息时,wParam 参数表示的就是 static 控件的设备环境句柄(lParam 表示控件句柄)。
请看部分代码:
case WM_CTLCOLORSTATIC:
{
HDC m_staticHdc = (HDC)wParam;
SetTextColor(m_staticHdc, RGB(255, 255, 255));//白色字体
SetBkColor(m_staticHdc, RGB(0,100,0));
return (INT_PTR)hSolidBrush; //这里必须返回画刷句柄
}
结果:
透明背景
1.实现透明背景需要设置文本背景颜色透明
2.返回没有颜色的画刷。
- SetBkMode 函数可以用来设置文本的背景模式,它的原型为:
int SetBkMode(
HDC hdc, //设备环境句柄
int iBkMode //背景模式
);
BkMode 有下面两种取值:
取值 | 说明 |
---|---|
OPAQUE | 使用当前背景颜色来填充背景。 |
TRANSPARENT | 背景透明。 |
- GetStockObject (NULL_BRUSH); 语句可以返回没有颜色的画刷。
case WM_CTLCOLORSTATIC:
{
HDC m_staticHdc = (HDC)wParam;
SetTextColor(m_staticHdc, RGB(255, 0, 0));
SetBkMode(m_staticHdc,TRANSPARENT);
return (INT_PTR)GetStockObject(NULL_BRUSH); //这里必须返回画刷句柄
}
break;