Читаем Delphi. Трюки и эффекты полностью

Здесь мы сохранили адрес функции 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

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

BeginPaint(hWnd, ps);

TextOut(ps.hdc, 10, 10, \'Текст в окне\', 12);

EndPaint(hWnd, ps);

end;

else

begin

//Обработка по умолчанию

WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);

Exit;

end;

end;

WindowFunc := S_OK; //Сообщение обработано

end;

В этой функции реализована обработка сообщения WMPAINT – запроса на перерисовку содержимого окна. Обработка сообщения WMCLOSE предусмотрена для того, чтобы при закрытии главного окна происходил выход из приложения. Для всех остальных сообщений выполняется обработка по умолчанию.

Обратите особое внимание на прототип этой функции: типы возвращаемых значений, типы параметров и способ вызова функции должны быть именно такими, как в листинге 2.5. Возвращаемое значение зависит от конкретного сообщения. Чаще всего это SOK (константа, равная 0) в случае успешной обработки сообщения.

Далее в листинге 2.6 приводится часть программы, собственно использующая регистрацию, создание окна, а также организующая обработку сообщений для созданного окна.

...

Листинг 2.6.

Регистрация и создание окна. Цикл обработки сообщений

program Window;

uses

Windows, Messages;

{$R *.res}

var

hMainWnd: HWND;

mess: MSG;

begin

//Создание окна

if not RegisterWindow then Exit;

hMainWnd := CreateWindow(

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

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

WS_VISIBLE or WS_OVERLAPPEDWINDOW,//Стиль окна

//(перекрывающееся, видимое)

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

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

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

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

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

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

GetModuleHandle(nil),

nil);

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

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

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

end.

В приведенном листинге 2.6 на месте многоточия должны находиться коды функций WindowFunc и RegisterWindow. При создании окна использовались только стили WS_VISIBLE и WS_OVERLAPPEDWINDOWS. Но это далеко не все возможные стили окон. В приложении 2 приводится список всех стилей окон (если другого не сказано, то стили можно комбинировать при помощи оператора or). Кроме функции CreateWindow, для создания окон можно использовать фyнкциюCreateWindowEx. При этом появится возможность указать дополнительный (расширенный) стиль окна (первый параметр функции CreateWindowEx). Список расширенных стилей приводится все в том же приложении 2.

В конце листинга 2.6 расположен цикл обработки сообщений:

...

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

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

Перейти на страницу:

Похожие книги

Оружие современной пехоты. Иллюстрированный справочник Часть I
Оружие современной пехоты. Иллюстрированный справочник Часть I

В книге в популярной форме рассказано о современной системе вооружения пехоты, об истории и путях ее дальнейшего развития, а также об основах устройства оружия. Для более подробного рассмотрения автором отобраны самые распространенные образцы. Издание подготовлено для всех интересующихся историей военной техники и современным боевым оружием. Прим. OCR: Для популярного справочника очень доступно и одновременно подробно рассмотрены варианты оружейной автоматики, типы затворов и т.п. Достаточно, что бы не считать внешнее сходство оружия доказательство его копирования. Качество фотоматериалов к сожалению очень низкое – лучше скана в сети не нашлось.

Семен Леонидович Федосеев

Военное дело / Военная история / Справочники / Технические науки / Военная техника и вооружение / Образование и наука / Словари и Энциклопедии