winapi — MFC / C ++: установка свойства BS_OWNERDRAW для кнопки-флажка не работает

Я пытаюсь динамически изменить контекст рисования (цвет фона, цвет текста, значок, …) кнопки-флажка, но у меня есть несколько проблем, чтобы нарисовать его, потому что, когда я пытаюсь изменить стиль в 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

Решение

к несчастью BS_OWNERDRAW Стиль не может сочетаться с другими стилями. От документация:

BS_OWNERDRAW

Создает кнопку, нарисованную владельцем. Окно владельца получает сообщение WM_DRAWITEM, когда визуальный аспект кнопки изменился. Не комбинируйте стиль BS_OWNERDRAW с другими стилями кнопок.

3

Другие решения

BS_CHECKBOX (hex: 02, bin: 0010) и BS_OWNERDRAW (hex: 0B, bin: 1011) являются взаимоисключающими, что вы уже можете увидеть, посмотрев на их двоичные представления (биты перекрываются).

В качестве альтернативы вы можете использовать произвольный розыгрыш, который не требует BS_OWNERDRAW стиль, он работает, отвечая на только пользовательские уведомления о розыгрыше. Так что вы можете сохранить BS_CHECKBOX и позвольте системе нарисовать некоторые аспекты флажка.

2

По вопросам рекламы [email protected]