Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чиртик Александр - Delphi. Трюки и эффекты ltrs...rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
964.52 Кб
Скачать

Реакция на события элементов управления

При возникновении какого‑либо предусмотренного для элемента управления события родительскому окну посылается сообщение WM_COMMAND.

Примечание

Сообщение WM_COMMAND приходит также при перерисовке так называемых «самоперерисовывающихся» (Owner Dr aw) элементов управления. Однако ввиду специфики данного вопроса и ограниченности объема г лавы мы его рассматривать не будем.

Итак, когда родительское окно получает сообщение WM_COMMAND, то из двух прилагающихся параметров (lParam и wParam) можно извлечь следующие сведения:

• старшие 16 бит wParam представляют собой целочисленный код уведомления, позволяющий определить, что же именно произошло с элементом управления;

• младшие 16 бит wParam представляют собой идентификатор элемента управления, состояние которого изменилось (именно этот идентификатор мы передавали вместо дескриптора меню при создании элементов управления);

• lParam содержит дескриптор (HWND) окна элемента управления, состояние которого изменилось.

Для выделения старших 16 бит из 32‑битного значения можно использовать функцию HiWord. Для получения младших 16 бит можно использовать функцию с именем LoWord. Обе они объявлены в модуле Windows.

В качестве примеров можно привести следующие коды уведомлений:

• BN_CLICKED – нажата кнопка;

• EN_CHANGE – изменен текст в текстовом поле;

• LBN_SELCHANGE – изменилось выделение в списке;

• CBN_SELCHANGE – изменилось выделение в раскрывающемся списке.

Эти и все остальные константы уведомлений стандартных элементов управления объявлены в модуле Messages.

Примечание

Коды уведомлений рассматриваемых в этой г лаве элементов управления приводятся в приложении 3.

Пример приложения

Рассмотрим небольшой пример, иллюстрирующий принцип работы с элементами управления, помещенными на форму описанным ранее способом. Проект этого приложения называется ControlsDemo.

Не будем заострять внимание на регистрации класса главного окна приложения, так как она аналогична приведенной в листинге 2.4. Рассмотрим создание окна с элементами управления в нем (листинг 2.21).

Листинг 2.21. Создание главного окна приложения (с элементами управления)

program ControlsDemo;

uses

Windows, Messages,

Controls in 'Controls.pas';

{$R *.res}

var

hMainWnd: HWND;

hInst: Cardinal;

mess: MSG;

//Функция обработки сообщений

//Создание окна и цикла обработки сообщений

begin

hInst := GetModuleHandle(nil);

//Регистрация и создание главного окна

if not RegisterWindow() then Exit;

hMainWnd := CreateWindow(

'MyWindowClass', //Имя класса окна

'Главное окно', //Заголовок окна

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, //Координата X по умолчанию

CW_USEDEFAULT, //Координата Y по умолчанию

CW_USEDEFAULT, //Ширина по умолчанию

CW_USEDEFAULT, //Высота по умолчанию

HWND(nil), //Нет родительского окна

HMENU(nil), //Нет меню

hInst,

nil);

if (hMainWnd = HWND(nil)) then Exit;

//Инициализация модуля Controls для работы с главным окном

Controls.hParentWnd := hMainWnd;

Controls.hAppInst := hInst;

//Создание элементов управления

CreateFrame(10, 80, 170, 70, –1, 'Кнопки');

CreateButton(20, 100, 70, 30, 1001, 'Кнопка 1');

CreateButton(100, 100, 70, 30, 1002,'Кнопка 2');

CreateFrame(200, 10, 200, 180, –1, 'Флажки и переключатели');

CreateCheck(210, 30, 180, 20, 2001, 'Флажок 1');

CreateCheck(210, 60, 180, 20, 2002, 'Флажок 2', True);

CreateOption(210, 100, 180, 20, 3001, 'Переключатель 1', True);

CreateOption(210, 130, 180, 20, 3002, 'Переключатель 2', False,

True);

CreateOption(210, 160, 180, 20, 3003, 'Переключатель 3', True);

CreateFrame(420, 10, 300, 180, –1, 'Списки и статические

надписи');

CreateLabel(430, 30, 70, 20, ‑1, 'Надпись');

CreateCombo(510, 30, 200, 100, 4001);

CreateList(430, 60, 280, 120, 5001);

CreateFrame(200, 200, 200, 240, –1, 'Текстовые поля');

CreateEdit(210, 220, 180, 20, 6001, 'Текст в текстовом поле');

CreateMemo(210, 250, 180, 180, 6002, 'Текст в многострочном'

+ #13 + #10 + 'текстовом поле');

//Добавление строк в списки

AddToCombo(4001, 'Строка 1');

AddToCombo(4001, 'Строка 2');

AddToCombo(4001, 'Строка 3');

AddToList(5001, 'Строка 1');

AddToList(5001, 'Строка 2');

AddToList(5001, 'Строка 3');

ShowWindow(hMainWnd, SW_NORMAL);

//Запуск цикла обработки сообщений

while (Longint(GetMessage(mess, 0, 0, 0)) <> 0)

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

end.

Листинг 2.21 заодно демонстрирует использование некоторых из приведенных ранее функций работы с элементами управления. Выглядит созданное окно так, как показано на рис. 2.3.

Рис. 2.3. Окно с элементами управления

Принцип построения функции обработки сообщений для этого окна приведен в листинге 2.22.