» Главная
eXcode.ru » Статьи » Delphi/Pascal » WinAPI
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 15





Создание CheckBox′ов средствами WinAPI




Источник: http://decoding.narod.ru/api/checkbox/checkbox.html

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

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


const
IDChBox1 = WM_USER+1;
IDChBox2 = WM_USER+2;
IDChBox3 = WM_USER+3;
IDBtn1 = WM_USER+4;
IDBtn2 = WM_USER+5;

var
ChBox1: HWND;
ChBox2: HWND;
ChBox3: HWND;
Label1: HWND;
Label2: HWND;
Btn1: HWND;
Btn2: HWND;


Обратим внимание на то, как задаются константы. Как вы знаете, взаимодействие Windows с приложениями происходит по средствам сообщений. Но не всегда программисту бывает достаточно тех сообщений, которые предопределены в системе. Windows позволяет программисту создать свое, так называемое, пользовательское сообщение. Весь диапазон чисел ниже $0400 (WM_USER) зарезервирован под системные сообщения, следовательно, пользовательские сообщения должны начинаться с WM_USER+1.

Но ведь раньше мы так не делали. Почему? Я просто хотел показать, что даже если мы не будем следовать этому правилу, Windows не допустит конфликтов в таком важном для работы системы механизме, как сообщения. Ведь от этого напрямую зависит надежность работы операционной системы. Рассмотренный сейчас способ является более правильным, по этому в дальнейшем, мы будем использовать именно его.

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

На сегодня все. Удачи в программировании.
К началу статьи





Добавил: LedWormДата публикации: 2005-09-04 18:12:51
Рейтинг статьи:3.57 [Голосов 7]Кол-во просмотров: 24941

Комментарии читателей

Всего комментариев: 2333

2018-09-11 09:26:35
CharlesVes
Онкопрепараты

[url=https://apteka-onko.ru/product-category/effektivnye-sredstva-lecheniya-raka/]капрелса инструкция по применению[/url]
[url=https://apteka-onko.ru/product-category/effektivnye-sredstva-lecheniya-raka/]инлита отзывы пациентов[/url]
[url=https://apteka-onko.ru/product-category/effektivnye-sredstva-lecheniya-raka/]спрайсел sprycel дазатиниб[/url]


<a href=https://apteka-onko.ru/product-category/effektivnye-sredstva-lecheniya-raka/>ибрутиниб отзывы</a>
<a href=https://apteka-onko.ru/product-category/effektivnye-sredstva-lecheniya-raka/>стивагра купить</a>
<a href=https://apteka-onko.ru/product-category/effektivnye-sredstva-lecheniya-raka/>инлита инструкция по применению</a>

2018-09-03 18:50:14
LuzaraRem
Народ кто желает поработать знаю отличный способ заработка.
На данном сервисе "[b][url=https://optimdoxod.blogspot.com/][b]ОПТИМАЛЬНЫЙ ДОХОД[/b][/url][/b]" Выплаты ежедневно.
За день пару-тройку сотен за 10 мин. работы по моему Классно!

2018-08-27 18:22:58
MaxAvticr
Аренда авто Крым, автопрокат аэропорт Симферополь, бюджетные марки машин, цены от 900 рублей в сутки, только иномарки с кондиционером. <a href="http://а82.рф/">Забронировать авто в Крыму, аэропорт Симферополь</a>

2018-08-25 17:44:24
LizaraRem
Народ кто желает поработать нашла отличный способ заработка.
На данном сервисе "[b][url=https://optimdoxod.blogspot.com/][b]ОПТИМАЛЬНЫЙ ДОХОД[/b][/url][/b]" Выплаты ежедневно.
В день пару-тройку сотен за 10 мин. работы по моему Офигенно!

2018-08-10 22:05:43
Marinkzer
Народ кому интересно нашла отличный торрент плеер Kino-Torrent версия PRO
Все фильмы, сериалы и мультики в одной программе - просмотр и скачивание. Бесплатно и без рекламы.
Быстрый поиск по всему рунету. Обновления фильмов точно в день выхода в кинотеатрах.
Сегодня добавленно: [b]"Мег: Монстр глубины" "Кристофер Робин" "Судная ночь. Начало"[/b]
Скачать Kino-Torrent версии PRO можно здесь: [url=http://kino-top.tk][b]KinoTorrentSetup[/b][/url]

2018-08-02 23:30:08
Bdwilefelp
<a href=http://hyip-soft.ru/>заказать хайп проект</a>

2018-07-31 18:05:20
Bdwilefelp
[url=http://hyip-soft.ru/]создание хайп проекта[/url]

2018-07-03 13:20:54
Pierrehak

<a href=https://sviloguzov.ru/ktpn-630>купить ктп 25 ква,ктп 25 40 ква,мачтовое ктп 25 ква</a>

2018-06-30 15:39:29
Pierrehak

<a href=https://sviloguzov.ru/ktpn-160>Пункт коммерческого учета электроэнергии 10 кв,</a>

2018-06-19 08:26:19
jiebalVier
знаю что вроде прикольный

---
Не обманывайтесь на этот счет. fifa 15 рпл скачать торрент, fifaconfig exe скачать для fifa 15 а также [url=http://15fifa.ru/]fifarus[/url] скачать фифа 15 модингвей торрент на пк
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Что вы думаете о девушках -программистах?
Ни разу таких не встречал
24% (89)
Очень любопытное зрелище
10% (36)
Мне все равно
3% (12)
Это очень сексуально!
6% (21)
Я и есть девушка -программист
11% (40)
Уважаю таких
9% (33)
Считаю это бесмысленным
6% (22)
Где бы мне найти такую?
13% (46)
Я их боюсь :)
6% (22)
Считаю, что это нормально
12% (45)

Проголосовало: 366
- Папа, а хакеры хорошо получают?
- Хорошо, сынок, лет этак пятнадцать...
Рейтинг: 9.2/10 (32)
Посмотреть все анекдоты