我正在尝试动态更改复选框按钮的绘制上下文(背景颜色,文本颜色,图标,...),但我有几个问题要绘制它,因为当我尝试修改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);
}
答案 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
并让系统绘制复选框的某些方面。