MFC / C ++:将属性BS_OWNERDRAW设置为复选框按钮不起作用

时间:2018-06-15 09:07:33

标签: c++ winapi checkbox mfc ownerdrawn

我正在尝试动态更改复选框按钮的绘制上下文(背景颜色,文本颜色,图标,...),但我有几个问题要绘制它,因为当我尝试修改PreSubclassWindow中的样式时回调,框架不会绘制复选框控件。

void CheckBoxButton::PreSubclassWindow()
{
   ModifyStyle(0xf, BS_CHECKBOX);
   ModifyStyle(0, BS_OWNERDRAW);

   CButton::PreSubclassWindow();
}

另见根据以下建议实施的代码:

void CheckBoxButton::paint()
    {
        HTHEME theme;
        CRect rect;
        GetClientRect(rect);

        theme = OpenThemeData(this->GetSafeHwnd(), L"Button");
        HRESULT result = DrawThemeBackground(theme, GetDC()->GetSafeHdc(), BP_CHECKBOX, CBS_CHECKEDDISABLED, &rect, NULL);
    }

2 个答案:

答案 0 :(得分:3)

不幸的是BS_OWNERDRAW样式无法与其他样式结合使用。来自documentation

  

<强> BS_OWNERDRAW

     

创建一个所有者绘制的按钮。当按钮的可视方面发生更改时,所有者窗口会收到WM_DRAWITEM消息。不要将BS_OWNERDRAW样式与任何其他按钮样式组合使用。

答案 1 :(得分:2)

BS_CHECKBOX(十六进制:02,bin:0010)和BS_OWNERDRAW(十六进制:0B,bin:1011)是互斥的,您可以通过查看它们的二进制表示(位重叠)。

或者您可以使用自定义绘图,它不需要BS_OWNERDRAW样式,它通过响应custom draw notifications only来工作。因此,您可以保留BS_CHECKBOX并让系统绘制复选框的某些方面。