флажок ownerdrawn

#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. Насколько я знаю, вам нужно будет хранить и управлять внутренним состоянием флажка (установлен / снят) самостоятельно.