如何使CMFCButton看起来像一个标准复选框?

如何使CMFCButton看起来像一个标准复选框?,mfc,custom-controls,cbutton,Mfc,Custom Controls,Cbutton,彩色背景上的标准MFCCButton复选框如下所示: 我想去掉灰色的边缘,但无法消除它。无论我如何设置控件的大小,它仍然会出现 将其更改为CMFCButton可提供以下功能: 这很好,它去掉了边距,除了现在没有复选标记。我需要那个复选标记 有没有办法用复选标记获得干净的外观?我曾想过将标准图像集传递给CMFCControl::SetImage(),但我不知道如何获取它们。我知道我可以自己画所有的东西,但我尽量避免重新发明轮子 我知道这里有很多类似的问题,但我发现的答案似乎都不适用。我发现最接

彩色背景上的标准MFC
CButton
复选框如下所示:

我想去掉灰色的边缘,但无法消除它。无论我如何设置控件的大小,它仍然会出现

将其更改为
CMFCButton
可提供以下功能:

这很好,它去掉了边距,除了现在没有复选标记。我需要那个复选标记

有没有办法用复选标记获得干净的外观?我曾想过将标准图像集传递给
CMFCControl::SetImage()
,但我不知道如何获取它们。我知道我可以自己画所有的东西,但我尽量避免重新发明轮子


我知道这里有很多类似的问题,但我发现的答案似乎都不适用。我发现最接近的是:;但是,第一个答案非常神秘,第二个答案是一大块代码,似乎有些过火。

我发现了一些简单的方法:

在对话框的
消息映射中添加了
ON\u WM\u CTLCOLOR()
后,我将其添加到对话框类中:

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

    if (myCheckbox.m_hWnd == pWnd->m_hWnd) // myCheckbox is the problem control
    {
        pDC->SetBkMode(TRANSPARENT);
        hbr = reinterpret_cast<HBRUSH>(::GetStockObject(NULL_BRUSH));
    }

    return hbr;
}
HBRUSH MyDlg::OnCtlColor(CDC*pDC、CWnd*pWnd、UINT-nCtlColor)
{
HBRUSH hbr=CDialogEx::OnCtlColor(pDC、pWnd、nCtlColor);
如果(myCheckbox.m_hWnd==pWnd->m_hWnd)//myCheckbox是问题控件
{
pDC->SetBkMode(透明);
hbr=重新解释强制转换(::GetStockObject(NULL_笔刷));
}
返回hbr;
}

不清楚您试图解决什么问题。也不清楚为什么——尽管你知道解决方案——会先发制人地拒绝它。我想消除方框周围的灰色空白,而不必给应用程序增加太多的复杂性。我甚至不确定我引用的例子是否相关。你认为“边际”是什么?它在窗口API中没有明确定义的含义。对你来说什么是“重要的复杂性”?或者,为什么您认为实现自定义控件会增加应用程序的复杂性?有了这些,为什么你不问问,为什么你的解决方案(对你来说似乎很好)没有显示复选框?这难道不是你想要解决的真正问题吗?这个问题提到了“灰色边距”,并包括一个在白色缩进复选框的三个边上不对称灰色区域的图示。至于复杂性,我引用的代码(可能有效,也可能无效)使用35行代码来解决概念上无关紧要的问题;类似的问题通常通过改变一两个参数来解决。事实上,我不明白为什么SDK一开始就给出了说明性的结果,而且我从2.0版开始就一直在编程Windows,我根本没有发现第一个答案是“神秘的”,因为所有这些功能都有充分的文档记录。第二个答案确实有些过分。不管怎样,你已经解决了这个问题,还是你还需要一个答案?