Среда, 02.07.2025, 21:11
Приветствую Вас Гость

Soft by Warik

NEMO_CHAT
Категории раздела
Анекдот
Случайный анекдот:

Наши часики
Опрос
Какое время года Вам больше нравится?
Всего ответов: 24
Статистика
Rambler's Top100




Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Win API [ Добавить статью ]

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

Сегодня наша программа научится работать с 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

Категория: Win API | Добавил: Warik (23.02.2010)
Просмотров: 5888 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Мини-профиль

Гость !



Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!
Друзья сайта