如何设置按钮的背景颜色,包括复选框按钮?

时间:2018-02-05 14:50:23

标签: c++ winapi button mfc transparent

如何设置按钮的背景颜色,包括复选框按钮?

我今天努力找到答案 - 认为应该很容易回答这个问题,但我偶然发现的信息不太有用,所以有可能重复那些但我找不到的东西,我会做这个快速的方法......

1 个答案:

答案 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);
}