Радиокнопки создаются подобно обычным кнопкам — для этого мы должны вызвать функцию CreateWindows указав в третьем параметре стиль BS_AUTORADIOBUTTON (или BS_RADIOBUTTON — но он хуже, так как вам придется самим писать код, который будет ставить точку внутри выбранной радиокнопки). То, что радиокнопки делаюся точно также, как и обычные кнопки.
Вот код, добавляющий три радиокнопки (обартите внимание, что они автоматически образуют группу):
1 2 3 4 5 6 7 8 9 10 11 12 | ... // Создание 3-х радиокнопок. CreateWindow("button", "Option 1", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 10, 10, 80, 30, hwnd, (HMENU)10001, hInstance, NULL); CreateWindow("button", "Option 2", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 10, 30, 80, 30, hwnd, (HMENU)10002, hInstance, NULL); CreateWindow("button", "Option 3", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 10, 50, 80, 30, hwnd, (HMENU)10003, hInstance, NULL); ... |
Добавить его надо в WinMain после вызова CreateWindow для создания главного окна.
Теперь надо делать некоторые дейстия при выборе той или иной радиокнопки из нашей группы. Для этого мы должны добавить обработчик для WM_COMMAND в case для оконной процедуры. Например, следующий код будет менять заголовок окна в зависимости от того, что за радиокнопку пользователь выбрал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) { switch (Message){ case WM_COMMAND: // Если мы нажали на 1-й радиокнопке. if(LOWORD(wparam)==10001) SetWindowText(hwnd, "Option 1"); // Если мы нажали на 2-й радиокнопке. if(LOWORD(wparam)==10002) SetWindowText(hwnd, "Option 2"); // Если мы нажали на 3-й радиокнопке. if(LOWORD(wparam)==10003) SetWindowText(hwnd, "Option 3"); break; ... |
Результат работы программы будет приблизительно такой:
Создание нескольких групп радиокнопок
Объявление самих кнопок в нашем коде будет почти такое же, как и в примере выше:
1 2 3 4 5 6 7 8 9 10 11 12 13 | CreateWindow("button", "Option 1", WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 10, 10, 80, 30, hwnd, (HMENU)10001, hInstance, NULL); CreateWindow("button", "Option 2", WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 10, 30, 80, 30, hwnd, (HMENU)10002, hInstance, NULL); CreateWindow("button", "Option 3", WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 10, 70, 80, 30, hwnd, (HMENU)10003, hInstance, NULL); CreateWindow("button", "Option 4", WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 10, 90, 80, 30, hwnd, (HMENU)10004, hInstance, NULL); ... |
Обратите внимание, что в отличие примера выше радиокнопки имеют стиль BS_RADIOBUTTON вместо BS_AUTORADIOBUTTON. Кроме того мы сделали для наглядности 4 радиокнопки, а не 3.
Теперь код по обработке щелчка по радиокнопкам:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ... switch (Message){ case WM_COMMAND: // Проверяем, не щелкнули ли на первой группе радиокнопок. if(10001<= LOWORD(wparam) && LOWORD(wparam)<=10002) { // Отмечаем кпопку из первой группы. CheckRadioButton(hwnd, 10001, 10002, LOWORD(wparam)); } // Проверяем, не щелкнули ли на второй группе радиокнопок. if(10003<= LOWORD(wparam) && LOWORD(wparam)<=10004) { // Отмечаем кпопку из второй группы. CheckRadioButton(hwnd, 10003, 10004, LOWORD(wparam)); } break; ... |
Для наших целей тут мы используем функцию CheckRadioButton. Первый параметр у нее — это HWND нашего окна , второй и третий — идентификаторы первой и последней кнопок в нашей группе, четвертый параметр — идентификатор радиокнопки, которая станет выделенной.
После запуска программы мы получим 2 независимые группы радиокнопок (в каждой из них будет по 2 кнопки):
А мне понравилось, спасибо. Ответ на один из возникших вопросов я нашёл.
А поясните, пожалуйста, почему в случае с несколькими группами кнопок используется стиль RADIOBUTTON, а не AUTORADIOBUTTON? Последний не умеет должным образом работать в данной ситуации?