Файл: 15. Основы разработки событийно-управляемых программ в среде Windows.pdf
Добавлен: 20.10.2018
Просмотров: 1202
Скачиваний: 5
Теперь рассмотрим структуру оконной функции. Уже было отмечено,
что ОФ – это обработчик сообщений, поступающих в приложение. Оконная
функция оформляется в соответствии со следующими правилами:
ОФ может иметь любое имя, но это имя обязательно должно совпадать
со значением, заданным в поле lpfnWndProc структуры данного
оконного класса.
ОФ всегда принимает 4 входных параметра, которые соответствуют
первым 4 полям структуры сообщения.
Заголовок ОФ оформляется особым образом с использованием
специальных директив, зависящих от используемого языка
программирования
Тело ОФ представляет собой инструкцию множественного выбора типа
case_of, в которой в качестве селектора выступает код сообщения
(второй входной параметр), а значениями селектора – текстовые имена-
константы конкретных сообщений:
сase Message of
wm_Create : “код обработки сообщения wm_Create”
wm_Move : “код обработки сообщения wm_Move”;
wm_KeyDown : “код обработки сообщения wm_KeyDown”;
- - - - - - - - - - - - - - - -
wm_Destroy : “код обработки сообщения wm_Destroy”;
end;
Набор сообщений может быть любым, но, как минимум, обязательно
должна присутствовать обработка сообщения wm_Destroy, которое
возникает при попытке закрытия главного окна приложения; при этом
для правильного завершения работы приложения обработчик
сообщения wm_Destroy должен с помощью системного вызова
PostQuitMessage поместить в очередь сообщение wm_Quit, в ответ на
которое цикл обработки сообщений завершит свою работу.
После оператора выбора в конце ОФ обязательно должна вызываться
специальная системная оконная функция, назначением которой
является обработка всех тех сообщений, которые не обрабатываются
данной оконной функцией. Такая оконная функция называется
умалчиваемой и вызывается .с помощью функции DefWindowProc.
В итоге, стандартная базовая структура Windows-приложения выглядит
следующим образом (использован язык Object Pascal системы Delphi).
program Project1;
uses Windows, Messages; // подключение интерфейсных модулей
var
MyWin : HWnd; // переменная-дескриптор главного окна
MyChildWin, MyPopWin : HWnd; // переменные-дескрипторы
подчиненных окон
// начало описания оконной функции
function WinProc(Win: HWnd; Mess, wParam, lParam : longint):longint; export;
stdcall;
begin
WinProc := 0;
case Mess of
wm_Destroy : begin
// обработчик сообщения
PostQuitMessage(0);
Exit;
end;
wm_Create : begin // обработчик сообщения
// действия, выполняемые при создании окна
Exit;
end;
wm_***** : begin
// еще один обработчик
// обработка некоторого сообщения wm_*****
Exit;
end;
. . . . . . . . . . . . // другие обработчики
end; // для основного оператора case
WinProc := DefWindowProc(Win, Mess, wParam, lParam);
// вызов
стандартного системного
обработчика
end; // конец оконной функции
procedure WinMain; // основная функция приложения
var
Mess : TMsg; // переменная-сообщение
MyWndClass : TWndClass; // переменная для описания оконного
класса
begin
MyWndClass.Style := . . . .; // здесь идет формирование ВСЕХ 10
полей
. . . . . . . . . . . . . . . . . . . . . . .
if RegisterClass(MyWndClass) = 0 then Exit;
// создание главного окна
MyWin := CreateWindow(„MyClass‟, „Ура!Мое первое окно!‟,
ws_OverlappedWindow, 100, 100, 300, 200, 0, 0,
hInstance, nil);
MyChildWin := CreateWindow( . . . . . ); // создание дочернего окна
MyPopWin := CreateWindow( . . . . . ); // создание всплывающего окна
ShowWindow(MyWin, cmdShow); // отображение окна (только
главного!)
UpdateWindow(MyWin);
while GetMessage(Mess, 0, 0, 0) do // цикл обработки
сообщений
begin
TranslateMessage(Mess);
DispatchMessage(Mess);
end;
Halt(Mess.wParam);
end; // конец основной функции
begin
WinMain // запуск приложения
end.
Такое приложение имеет минимальную функциональность: после его
запуска создаются главное окно и два подчиненных окна, которые можно
перемещать по экрану, можно изменять размеры окон и, наконец, можно
закрыть главное окно с завершением приложения. Вся эта стандартная
функциональность с точки зрения обработки сообщений обеспечивается
системной оконной функцией по умолчанию. Для придания приложению
полезных свойств необходимо, прежде всего, уметь реализовывать
интерфейс с пользователем на основе стандартных управляющих элементов.