【问题标题】:How can I get CMFCButton to look like a standard checkbox?如何让 CMFCButton 看起来像标准复选框?
【发布时间】:2020-06-13 12:06:54
【问题描述】:

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

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

将其更改为 CMFCButton 会得到以下结果:

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

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

我知道这里有很多关于 SO 的类似问题,但我找到的答案似乎都不适用。我找到的最接近的是:Once and for all: how do I get a fully transparent checkbox, button, radio button, etc. in Windows API, and not with a black background?;但是第一个答案非常神秘,第二个是一大段代码,看起来有点矫枉过正。

【问题讨论】:

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

标签: mfc custom-controls cbutton


【解决方案1】:

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

ON_WM_CTLCOLOR() 添加到对话框的MESSAGE_MAP 后,我将其添加到对话框类中:

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;
}

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多