Сегодня наша программа научится работать с CheckBox'ами. CheckBox можно представить как "флаг", который можно установить или сбросить, и в зависимости от его состояния выполнять определенные действия. Программисты очень часто используют этот элемент управления, так что давайте, разберемся, как это делается на Win API. Помимо CheckBox'ов, на форме присутствуют метки ("Static") и кнопки ("Button"), но их я рассматривать не буду, так как мы уже умеем с ними работать. Как обычно, начнем с объявления констант и переменных. Code const IDChBox1 = 1; IDChBox2 = 2; IDChBox3 = 3; IDBtn1 = 4; IDBtn2 = 5;
var ChBox1: HWND; ChBox2: HWND; ChBox3: HWND; Label1: HWND; Label2: HWND; Btn1: HWND; Btn2: HWND; Посмотрим, как создаются CheckBox'ы. Code ChBox1 := CreateWindowEx( 0, 'Button', 'BS_AUTOCHECKBOX', WS_CHILD or WS_VISIBLE or BS_AUTOCHECKBOX, 10, 10, 130, 25, Wnd, IDChBox1, hinstance, nil ); SendMessage( ChBox1, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );
ChBox2 := CreateWindowEx( 0, 'Button', 'BS_AUTO3STATE', WS_CHILD or WS_VISIBLE or BS_AUTO3STATE, 155, 10, 110, 25, Wnd, IDChBox2, hinstance, nil ); SendMessage( ChBox2, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );
ChBox3 := CreateWindowEx( 0, 'Button', 'BS_CHECKBOX', WS_CHILD or WS_VISIBLE or BS_CHECKBOX, 10, 65, 100, 25, Wnd, IDChBox3, hinstance, nil ); SendMessage( ChBox3, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 ); Здесь нужно обратить внимание на стиль каждого из CheckBox'ов, а именно: BS_AUTOCHECKBOX, BS_AUTO3STATE и BS_CHECKBOX. Рассмотрим каждое немного подробнее. BS_AUTOCHECKBOX - CheckBox имеет два состояния: флажок либо установлен, либо сброшен. BS_AUTO3STATE - CheckBox имеет три состояния: первые два, как у BS_AUTOCHECKBOX, и третье (назовем его неопределенным), когда флажок установлен, но фон окрашен серым цветом вместо белого. BS_CHECKBOX - аналогичен BS_AUTOCHECKBOX за тем исключением, что задача по установке и сбросу флажка ложится на программиста (при клике по BS_AUTOCHECKBOX и BS_AUTO3STATE, их состояние меняется автоматически). Посмотрим, как нужно обрабатывать событие, вызванное щелчком по CheckBox'у. Code function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall; var Res: LRESULT; begin case Msg of WM_DESTROY: begin PostQuitMessage( 0 ); Result := 0; Exit; end; WM_COMMAND: case LoWord( wParam ) of // Обрабатываем BS_AUTOCHECKBOX IDChBox1: begin Res := SendMessage( ChBox1, BM_GETCHECK, 0, 0 ); case Res of BST_CHECKED: SetWindowText( Label1, 'Состояние: включен' ); BST_UNCHECKED: SetWindowText( Label1, 'Состояние: выключен' ); end; end; // Обрабатываем BS_AUTO3STATE IDChBox2: begin Res := SendMessage( ChBox2, BM_GETCHECK, 0, 0 ); case Res of BST_CHECKED: SetWindowText( Label2, 'Состояние: включен' ); BST_INDETERMINATE: SetWindowText( Label2, 'Состояние: неопределено' ); BST_UNCHECKED: SetWindowText( Label2, 'Состояние: выключен' ); end; end; // Обрабатываем BS_CHECKBOX IDChBox3: begin Res := SendMessage( ChBox3, BM_GETCHECK, 0, 0 ); case Res of BST_CHECKED: CheckDlgButton( Wnd, IDChBox3, 0 ); BST_UNCHECKED: CheckDlgButton( Wnd, IDChBox3, 1 ); end; end; IDBtn1: CheckDlgButton( Wnd, IDChBox3, 0 ); IDBtn2: CheckDlgButton( Wnd, IDChBox3, 1 ); end; else Result := DefWindowProc( Wnd, Msg, wParam, lParam ); end; end; Как видите, в этом нет ничего сложного. Используя сообщение BM_GETCHECK, мы узнаем, в каком состоянии находится CheckBox (для наглядности мы выводим соответствующую надпись в поле "Static"). Что касается BS_CHECKBOX, то, как говорилось выше, его состояние программист должен задавать сам. В этом нам поможет функция CheckDlgButton. Если нам надо сбросить флажок, то в третьем параметре мы передаем 0. Любое другое, отличное от нуля, значение приведет к тому, что флажок будет установлен. Значение последнего параметра не может быть отрицательным. На сегодня все. Удачи в программировании.
Источник: http://nemo-chat.3dn.ru |