Операционная система Microsoft Windows 3.1 для программиста -том 1


Функция окна


В нашем приложении был создан класс окна, в котором определена функция окна с именем WndProc:

LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_LBUTTONDOWN: { MessageBox(NULL, "Нажата левая клавиша мыши", "Сообщение", MB_OK | MB_ICONINFORMATION); return 0; } case WM_RBUTTONDOWN: { MessageBeep(-1); // звуковой сигнал MessageBox(NULL, "Нажата правая клавиша мыши", "Сообщение", MB_OK | MB_ICONINFORMATION); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); }

Мы уже говорили, что эта функция нестандартна и ее нельзя вызывать напрямую из функции WinMain или из какой-либо другой функции.

Функция окна должна иметь следующий прототип (имя функции окна может быть любым, а не только WndProc):

LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

Тип LRESULT определен в файле windows.h следующим образом:

typedef signed long LONG; typedef LONG LRESULT;

Таким образом, функция окна возвращает значение с типом LONG, что в текущей реализации Windows (версия 3.1) соответствует двойному слову.

Модификатор CALLBACK указывает на соглашения о передаче параметров _pascal и определяет функцию окна как функцию _far:

#define CALLBACK _far _pascal

Функция окна, так же как и функция WinMain (и все функции программного интерфейса Windows), использует для передачи параметров соглашения языка Паскаль.

Вы могли бы описать функцию окна как long _far _pascal, однако для обеспечения возможности переноса вашей программы в 32-разрядные версии Windows (Windows NT) или для использования 32-разрядного расширения Win32s текущей версии Windows следует пользоваться символами LRESULT и CALLBACK.

Обратите внимание на ключевое слово _export, которое используется в определении функции окна. Если описать функцию с этим ключевым словом, ее имя станет экспортируемым. При этом функция будет иметь специальный пролог и эпилог.




Начало  Назад  Вперед