#c #winapi #checkbox #ownerdrawn
#c #winapi #флажок #ownerdrawn
Вопрос:
у меня есть собственное приложение win32 c , в котором есть флажок. Я хочу заменить флажок и создать кнопку включения / выключения с 2 состояниями (точно так же, как флажок). Я добавил BS_OWNERDRAW
стиль к флажку и нарисовал его в окне WM_DRAWITEM
. Проблема в том, что когда я нажимаю на флажок, я получаю WM_COMMAND
сообщение (как и без BS_OWNERDRAW
), но состояние CHECKED не изменяется автоматически. Должен ли я реализовать эту функциональность или я что-то упускаю?
Код, который обрабатывает нажатие на флажок:
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDC_CHECKBOX:
if(wmEvent == BN_CLICKED)
{
dwPos = SendMessage(checkBox, BM_GETCHECK, 0, 0);
if(dwPos == BST_CHECKED )
{
// do some stuff
} else if(dwPos == BST_UNCHECKED) {
// do some stuff
}
}
Проблема в том, что каждый раз, когда я нажимаю на флажок, BM_GETCHECK возвращает BST_UNCHECKED . Если я удалю BS_OWNERDRAW, он будет работать нормально.
Код, который создает кнопку / флажок:
checkBox = CreateWindowEx(
0,
WC_BUTTON,
szBuffer,
WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_OWNERDRAW,
BUTTON_ON_OFF_X, BUTTON_ON_OFF_Y,
BUTTON_ON_OFF_WIDTH, BUTTON_ON_OFF_HEIGHT,
hWnd,
(HMENU)IDC_CHECKBOX,
hInst,
NULL
);
Комментарии:
1. к сожалению, я этого не сделал. Обновил мой вопрос кодом, который создает флажок
Ответ №1:
Обычно вы устанавливаете BS_AUTOCHECKBOX так, чтобы флажок автоматически устанавливался / снимался в ответ на ввод пользователя. Однако, согласно документам, вы не можете комбинировать другие стили (например, BS_AUTOCHECKBOX ) при использовании BS_OWNERDRAW.
http://msdn.microsoft.com/en-us/library/windows/desktop/bb775951(v=vs.85).aspx
Комментарии:
1. также, если я не могу использовать BS_AUTOCHECKBOX, это будет обычная кнопка, и я не смогу использовать BM_GETCHECK / BM_SETCHECK .. верно? Какое сообщение я могу использовать, чтобы получить тот же результат?
Ответ №2:
ДА. Вам нужно будет перевести из вашей WM_COMMAND и переключить состояние внутренней проверки с помощью чего-то вроде CheckDlgButton.
Комментарии:
1. CheckDlgButton — это просто удобная функция, которая генерирует сообщение BM_SETCHECK, которое, я думаю, не будет работать для кнопок BS_OWNERDRAW. Насколько я знаю, вам нужно будет хранить и управлять внутренним состоянием флажка (установлен / снят) самостоятельно.