Я пытаюсь динамически изменить контекст рисования (цвет фона, цвет текста, значок, …) кнопки-флажка, но у меня есть несколько проблем, чтобы нарисовать его, потому что, когда я пытаюсь изменить стиль в 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);
}
к несчастью BS_OWNERDRAW
Стиль не может сочетаться с другими стилями. От документация:
BS_OWNERDRAW
Создает кнопку, нарисованную владельцем. Окно владельца получает сообщение WM_DRAWITEM, когда визуальный аспект кнопки изменился. Не комбинируйте стиль BS_OWNERDRAW с другими стилями кнопок.
BS_CHECKBOX
(hex: 02, bin: 0010) и BS_OWNERDRAW
(hex: 0B, bin: 1011) являются взаимоисключающими, что вы уже можете увидеть, посмотрев на их двоичные представления (биты перекрываются).
В качестве альтернативы вы можете использовать произвольный розыгрыш, который не требует BS_OWNERDRAW
стиль, он работает, отвечая на только пользовательские уведомления о розыгрыше. Так что вы можете сохранить BS_CHECKBOX
и позвольте системе нарисовать некоторые аспекты флажка.