Checkbox с точки зрения программирования является кнопкой. Это означает, что мы должны создавать его как и любую кнопку используя функцию CreateWindows. В качестве стиля надо указать BS_AUTOCHECKBOX (в этом случае галочка в checkbox’е будет автоматически ставиться/убираться) или BS_CHECKBOX (в этом случае галочка сама ставиться не будет — и это будет задача программиста).
Для создания checkbox`a используется функция:
1 2 3 4 5 6 7 8 9 10 11 12 13 | CreateWindow( "button", "Press me", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 10, 10, 80, 30, hwnd, (HMENU)10001, hInstance, NULL ); |
Принцип тут такой же, как и при создании обычной кнопки. Обратите внимание на стиль для checkbox’а, задаваемый в третьем параметре.
Теперь о том, как обрабатывать щелчок по checkbox’у.
Для примера напишем код, который будет показывать текущее состояние checkbox’а в заголовке главного окна. Вот что вы должны добавить в switch оконной процедуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) { switch (Message){ case WM_COMMAND: // Если мы нажали на checkbox'е. if(LOWORD(wparam)==10001) { // Получаем HWND нашего chechbox'а. HWND hwndCheck = GetDlgItem(hwnd, 10001); // Выясняем текущее состояние chechbox'а. LRESULT res = SendMessage (hwndCheck, BM_GETCHECK, 0, 0); // Если галочка стоит. if(res == BST_CHECKED) { SetWindowText(hwnd, "Checked"); } // Если галочка не стоит. if(res == BST_UNCHECKED) { SetWindowText(hwnd, "Unchecked"); } } ... } |
Как вы видите, для выяснения состояния checkbox’а мы посылаем ему сообщение BM_GETCHECK посредством вызова функции SendMessage, которая и возвращает в качестве значения одну из констант BST_CHECKED или BST_UNCHECKED (на самом деле есть еще одно значение: BST_INDETERMINATE — для неопределенного значения состояния checkbox’а). Функция SendMessage требует в качестве первого параметра HWND окна, которому посылаем сообщение (в нашем случае это окно — это сам checkbox). HWND для нашего checkbox’а мы выясняем путем вызова функции GetDlgItem, первый параметр которой — HWND родительского окна для элемента управления, а второй — идентификатор элемента управление (тот самый, который мы задали при создании элемента управления в вызове функции CreateWindow).
После выяснения состояния checkbox’а мы меняем заголовок главного окна путем вызова функции SetWindowText.
Хороший материал.
Продолжайте писать статьи!
очень полезная информация на сайте!
продолжайте писать статьи! очень помогают! 💡
😉
Спасибо, помогли 🙂
А статья справедлива для VC++13? А то оконная процедура не хочет ничего обрабатывать.
Думаю да… Хотя проверить не на чем..