Создание радиокнопки (RADIOBUTTON)

Радиокнопки создаются подобно обычным кнопкам — для этого мы должны вызвать функцию 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? Последний не умеет должным образом работать в данной ситуации?

Ответить на Sun ¬
Отменить ответ


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>