如何设置按钮的背景颜色,包括复选框按钮?
我今天努力找到答案 - 认为应该很容易回答这个问题,但我偶然发现的信息不太有用,所以有可能重复那些但我找不到的东西,我会做这个快速的方法......
答案 0 :(得分:3)
所有“按钮”类窗口都会将WM_CTLCOLORSTATIC
发送到其父窗口,然后可以调用::SetBkColor((HDC)wParam, rgbBkColor)
,然后返回该颜色的画笔。
如果全部使用系统颜色,则无需管理画笔手柄,您可以简单地询问::GetSysColor(sysIndex)
,并返回::GetSysColorBrush(sysIndex)
返回的画笔。
如果你使用的是自定义颜色,那么你需要创建自己的画笔并管理它的句柄。
根据Windows标准消息框,我需要使用此代码进行消息框替换,其上部使用白色背景,下部使用灰色背景。所以我的静态控件(图标)需要是白色的,而我的其他按钮(包括“不要再问”复选框)需要有灰色背景(复选框通常有白色背景)。
因此,我处理WM_ERASEBKGND以正确地绘制背景的两个部分,然后我处理WM_CLTLCOLORSTATIC以确保所有按钮对于它们出现的背景都是正确的“透明”。在我的例子中,我使用了一个“静态”控件来显示图标,它用灰色绘制背景,还有一些按钮加上一个复选框按钮 - 复选框按钮总是用白色绘制背景,所以两者都需要固定。
我的例子是使用MFC,但希望你可以为你的目的进行足够的翻译:
// add to the message map:
ON_MESSAGE(WM_CTLCOLORSTATIC, OnCtlColorStatic)
// create the implementation:
LRESULT CRTFMessageBox::OnCtlColorStatic(WPARAM wParam, LPARAM lParam)
{
// buttons and static controls (icon) send WM_CTLCOLORSTATIC, so we can force them to use the correct background color here...
const HDC hdc = (HDC)wParam;
const int idc = ::GetDlgCtrlID((HWND)lParam);
// choose a system color or brush based on if this is icon (static) or another control (a button)
const int idx = idc == IDC_STATIC ? COLOR_WINDOW : COLOR_3DFACE;
// select system color
::SetBkColor(hdc, GetSysColor(idx));
// return system brush (which we don't need to delete!)
return (LRESULT)GetSysColorBrush(idx);
}