[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Pascal - Delphi /

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



Сегодня наша программа научится работать с CheckBox'ами. CheckBox можно представить как "флаг", который можно установить или сбросить, и в зависимости от его состояния выполнять определенные действия. Программисты очень часто используют этот элемент управления, так что давайте, разберемся, как это делается на Win API.

Помимо CheckBox'ов, на форме присутствуют метки ("Static") и кнопки ("Button"), но их я рассматривать не буду, так как мы уже умеем с ними работать. Как обычно, начнем с объявления констант и переменных.


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'ы.


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'у.


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. Любое другое, отличное от нуля, значение приведет к тому, что флажок будет установлен. Значение последнего параметра не может быть отрицательным.

На сегодня все. Удачи в программировании.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Pascal - Delphi /

Работа со шрифтами на Win API
06-06-2010   

Сегодня поговорим о шрифтах, и о том, каким образом работать с ними на Win API. Нам потребуется переменная типа HFONT. Изменить стиль шрифта можно у любого компонента, я покажу это на примере кнопки... подробнее

Кол. просмотров: общее - 4937 сегодня - 0

Работа с таймером на Win API
06-06-2010   

Таймер - вещь в хозяйстве очень полезная. Если некое действие нужно повторять с определенной периодичностью, то таймер, это как раз то, что нужно... подробнее

Кол. просмотров: общее - 4963 сегодня - 0

Работа с мультимедийным таймером на Win API
06-06-2010   

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

Кол. просмотров: общее - 5110 сегодня - 1

Создание CheckBoxов средствами Win API
06-06-2010   

Сегодня наша программа научится работать с CheckBoxами. CheckBox можно представить как флаг, который можно установить или сбросить, и в зависимости от его состояния выполнять определенные действия... подробнее

Кол. просмотров: общее - 5344 сегодня - 2

Создание группы RadioButton средствами Win API
06-06-2010   

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

Кол. просмотров: общее - 4986 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects