В среде MS-DOS программный код приложения состоит из операторов, которые выполняются один за другим. Код программы для Windows состоит из процедур обработки сообщений, которые Windows посылает приложению. Windows фиксирует возникающие в программах и аппаратуре события и затем посылает соответствующие сообщения в программу.
С позиций прикладной программы Windows воспринимается как набор системных функций, образующий так называемый API – интерфейс прикладных программ (API – Application Programming Interface). Чтобы выполнить то или иное действие (например, открыть окно или начертить на экране линию), программа обращается к соответствующей функции API.
В состав Windows входит более 600 функций. Реализующий их код хранится в оперативной памяти и на дисках. Каждая API-функция имеет имя, подобно именам подпрограмм в библиотеках компиляторов, и программа вызывает соответствующую функцию, ссылаясь на ее имя. Ссылка на имя API-функции разрешается не на этапе компоновки программы, а непосредственно в ходе исполнения программы.
Windows создает входное сообщение для каждого входного события, генерируемого пользователем с помощью мыши или клавиатуры. Windows сохраняет входные данные в очереди системных сообщений. Затем эти сообщения посылаются в очередь сообщений приложения. Приложение также может создавать собственные сообщения и помещать их в свою очередь сообщений. Для обработки сообщений главная программа приложения использует непрерывный цикл, так называемый главный цикл сообщений. Этот цикл содержит некоторое количество функций, предназначенных для обработки сообщений. Выход из этого цикла совершается тогда, когда поступает сообщение, которое должно завершить программу.
При пользовании только функциями Windows API минимальная программа будет занимать около 60 строк, состоять из нескольких процедур и функций.
Program WinMin;
Uses WinTypes, WinProcs;
Const AppName = ‘WinMin’;
// Оконная функция
Function WindowProc(Window: HWnd; Message, Wparam: Word;
Lparam: LongInt): LongInt; EXPORT;
Begin
WindowProc:= 0;
Case Message of
// Обработка сообщений
wm_Destroy:
Begin
PostQuitMessage(0);
Exit;
end;
end;
WindowProc: = DefWindowProc(Window, Message, WParam, LParam);
End;
// Точка входа в программу
procedure WinMain
Var Window: HWnd; Message: TMsg;
// Описание класса
WindowClass: TWndClass;
Begin
If HPrevInst = 0 Then
// Только для первого класса программы
begin
// Описание атрибутов класса окна
With WindowClass do
Begin
Style := cs_HRedraw OR cs_WRedraw;
lpfnWndProc:= @WindowProc;
cbClsExtra:= 0;
cbWndExtra:= 0;
hinstance:= HInstance;
hicon:= Loadicon(0, idi_Application);
hCursor:= LoadCursor(0, idc_Arrow);
hbrBackground:= GetStockObject(White_Brush);
lpszMenuName:= ‘ ‘;
lpszClassName:= AppName;
end;
// Регистрация класса
if not RegisterClass(WindowClass) then
Halt(255);
End;
// Создание класса с определенными атрибутами
Window:= CreateWindow(AppName, ‘WinMin’, ws_OverlappedWindow,
w_UseDefault, cw_UseDefault, cw_UseDefault, 0, 0,Hinstance, Nil);
ShowWindow(Window,CmdShow);
UpdateWindow(Window);
// Цикл обработки сообщений
While GetMessage(Message, 0, 0, 0) do
Begin
TranslateMessage(Message);
DispatchMessage(Message);
End;
Begin
WinMain
End.
Программа WinMin состоит из функции WindowProc, процедуры WinMain и вызовов одиннадцати функций Windows API. Процедура WinMain – это точка входа в программу, которая получает управление от ядра Windows. Каждая Windows-программа (создаваемая с использованием только функций Windows API) должна иметь такую процедуру. Функция WindowProc – это специальная “оконная” функция, обрабатывающая сообщения, посылаемые окну. Эта функция вызывается непосредственно ядром Windows. Функции Windows API, используемые в этой небольшой программе, выполняют следующие действия: для регистрации класса вызывается функция RegisterClass; функция CreateWindow создает окно на базе зарегистрированного класса; функции ShowWindow и UpdateWindow предназначены для отображения окна, а цикл обработки сообщений включает в себя вызовы функций GetMessage, TranslateMessage и DispatchMessage.
Windows-программа состоит из трех важных частей:
инициализация – регистрация класса окна, создание и отображение окна;
выполнение – цикл обработки сообщений;
завершение – закрытие окна и возврат в среду Windows.
В Delphi большинство стандартных сообщений обрабатываются автоматически, поскольку все объекты Delphi имеют встроенный механизм – процедуру обработки сообщений. В каждом из компонентов Delphi определен механизм управления сообщениями, который переводит все сообщения Windows, посылаемые определенному объекту, в вызовы методов.
Работая со средой Delphi, достаточно иметь представление о том, как устроена Windows-программа, а писать циклы обработки сообщений, вызывать функции регистрации оконных классов и создания окна нет необходимости. Все это происходит автоматически и скрыто от программиста.