Win API
Создание RadioButton средствами Win API

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика


Сегодня поговорим о том, как работать с RadioButton. RadioButton представляют собой кнопки, автоматически объеденяемые в группы. В каждой группе, одновременно может быть включена только одна кнопка. Главное отличие этих кнопок от CheckBox'ов в том, что если повторно щелкнуть на радио-кнопке, то ее состояние не изменится.

Кнопки RadioButton могут быть двух стилей - BS_AUTORADIOBUTTON и BS_RADIOBUTTON. Как и в случае с CheckBox'ами, стиль BS_AUTORADIOBUTTON означает, что Windows сама будет менять состояние кнопки (включена/выключена). А если у кнопки стиль BS_RADIOBUTTON, то состояние кнопки устанавливает программист.

const
  IDRBtn1 = 1;
  IDRBtn2 = 2;
  IDRBtn3 = 3;

var
  RBtn1: HWND;
  RBtn2: HWND;
  RBtn3: HWND;
  Static1: HWND;
  Static2: HWND;
  Static3: HWND;

Сейчас мы рассмотрим самый простой случай. Мы создадим одну группу радио-кнопок, состояние которых будет отслеживать Windows.

RBtn1 := CreateWindowEx( 0, 'Button', 'Опция 1',
                         WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON,
                         20, 15, 80, 20, Wnd, IDRBtn1, hInstance, nil );
SendMessage( RBtn1, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

RBtn2 := CreateWindowEx( 0, 'Button', 'Опция 2',
                         WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON,
                         110, 15, 80, 20, Wnd, IDRBtn2, hInstance, nil );
SendMessage( RBtn2, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

RBtn3 := CreateWindowEx( 0, 'Button', 'Опция 3',
                         WS_CHILD or WS_VISIBLE or BS_AUTORADIOBUTTON,
                         200, 15, 80, 20, Wnd, IDRBtn3, hInstance, nil );
SendMessage( RBtn3, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

Обрабатывать будем следующим образом. Получив сообщение от одной из радио-кнопок, в соответствующей метке напишем, что она включена.

function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
   case Msg of
      WM_DESTROY: begin
         PostQuitMessage( 0 );
         Result := 0;
         Exit;
      end;
      WM_COMMAND: begin
         case LoWord( wParam ) of
            IDRBtn1: begin
               SetWindowText( Static1, 'Включена' );
               SetWindowText( Static2, 'Выключена' );
               SetWindowText( Static3, 'Выключена' );
            end;
            IDRBtn2: begin
               SetWindowText( Static1, 'Выключена' );
               SetWindowText( Static2, 'Включена' );
               SetWindowText( Static3, 'Выключена' );
            end;
            IDRBtn3: begin
               SetWindowText( Static1, 'Выключена' );
               SetWindowText( Static2, 'Выключена' );
               SetWindowText( Static3, 'Включена' );
            end;
         end;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

И в заключении сделаем следующее. Когда форма отобразится на экране, одна из радио-кнопок должна быть включена (например первая). Для этого ей надо послать сообщение BM_CLICK.

// Показываем окно
ShowWindow( Wnd, SW_SHOWNORMAL );

SendMessage( RBtn1, BM_CLICK, 0, 0 );

В следующий раз мы посмотрим, как работать с несколькими гркппами радио-кнопок. А на сегодня все. Удачи в программировании.

.: Пример к данной статье :.


При использовании материала - ссылка на сайт обязательна