Delphi. Трюки и эффекты (Чиртик, Борисок) - страница 25

...

Листинг 2.3.

Элементарное приложение

program WinAPI;

uses

Windows, Messages;

{$R *.res}

begin

MessageBox(0, \'This is a test\', \'Little application\', MB_OK);

end.

Зачастую неоправданно полностью отказываться от классов, реализованных Borland. Но для чистоты эксперимента в этой главе рассмотрим радикальные примеры, построенные на использовании только Windows API.

2.2. Создание окна вручную

Раз уж речь зашла о приложениях с оконным интерфейсом, то самое время приступить к его реализации средствами Windows API. Итак, чтобы создать и заставить работать окно приложения, нужно выполнить следующие операции:

1. Зарегистрировать класс окна с использованием функции RegisterClass или RegisterClassEx.

2. Создать экземпляр окна зарегистрированного ранее класса.

3. Организовать обработку сообщений, поступающих в очередь сообщений.

Пример того, как можно организовать регистрацию класса окна, приведен в листинге 2.4.

...

Листинг 2.4.

Регистрация класса окна

function RegisterWindow():Boolean;

var

wcx: WNDCLASSEX;

begin

ZeroMemory(Addr(wcx), SizeOf(wcx));

//Формирование информации о классе окна

wcx.cbSize := SizeOf(wcx);

wcx.hInstance := GetModuleHandle(nil);

wcx.hIcon := LoadIcon(0, IDI_ASTERISK); //Стандартный значок

wcx.hIconSm := wcx.hIcon;

wcx.hCursor := LoadCursor(0, IDC_ARROW); //Стандартный указатель

wcx.hbrBackground := GetStockObject(WHITE_BRUSH); //Серый

//цвет фона

wcx.style := 0;

//..самые важные параметры

wcx.lpszClassName := \'MyWindowClass\ //Название класса

wcx.lpfnWndProc := Addr(WindowFunc); //Адрес функции

//обработки сообщений

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

RegisterWindow := RegisterClassEx(wcx) <> 0;

end;

Здесь существенным моментом является обязательное заполнение структуры WNDCLASSEX информацией о классе окна. Самой необычной вам должна показаться следующая строка:

...

wcx.lpfnWndProc := Addr(WindowFunc); //Адрес функции обработки сообщений

Здесь мы сохранили адрес функции WindowFunc (листинг 2.5) – обработчик оконных сообщений (называемый также оконной процедурой). После вызова функции RegisterClassEx система запомнит этот адрес и будет вызывать нашу функцию-обработчик каждый раз при необходимости обработать сообщение, пришедшее окну. Простейшая реализация функции WindowFunc приводится в листинге 2.5.

...

Листинг 2.5.

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

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

function WindowFunc(hWnd:HWND; msg:UINT; wParam:WPARAM;

lParam:LPARAM):LRESULT; stdcall;

var

ps: PAINTSTRUCT;

begin

case msg of

WM_CLOSE:

if (hWnd = hMainWnd) then

PostQuitMessage(0); //При закрытии окна – выход

WM_PAINT:

begin

//Перерисовка содержимого окна