Но так можно вызвать единственную оконную функцию InputWndProcC), а стандартная функция Di spatchMessageC) по дескриптору окна msg.hwnd автоматически определяет, какую оконную функцию запускать. От такого нештатного вызова оконной функции следует ожидать и других скрытых побочных эффектов.

Код оконной функции, которая запускается при поступлении сообщений в окно, приведен в листинге 1.3.

Листинг 1.3

LRESULT API ENTRY InputWndProc (HWND hWnd. UINT message. WPARAM wParam. LPARAM IParam)
{
switch (message) {
case WM_DESTROY:
PostQuitMessage(O): return 0; case WM_RBUTT0ND0WN:

MessageBoxChWnd."Нажата правая кнопка мыши", "minim".0); return 0;

case WMJ.BUTT0ND0WN:

MessageBoxCNULL."Нажата левая кнопка мыши", "minim".0); return 0;

case WM_RBUTTONUP:

MessageBoxCNULL."Отпущена правая кнопка мыши"."minim".0); return 0;

case WM_LBUTTONUP:

MessageBoxCNULL."Отпущена левая кнопка мыши", "minim".0); return 0;

default:
return DefWindowProcChwnd. message. wParam. IParam);
}
return 0: }

В качестве параметров оконной функции передаются одноименные поля сообщения msg. В приведенной выше функции организованы реакция на нажатие клавиш мыши и щелчок по системной кнопке завершения программы (сообщение

Создание простейшего приложения

WM_DESTROY). В окно может поступить сообщение, обработка которого в данной процедуре не предусмотрена, но для него надо выполнять обязательные стандартные действия. Эти действия выполнит функция, вызываемая для необрабатываемых веток DefWindowProc(hwnd.message.wParam,1 Pa ram). Можно удалить вызов этой функции, и фон в окне изменится.

Отдельно стоит отметить роль сообщения WMJ3ESTRQY. Операционная система не сразу снимает приложение с выполнения, а сначала дает ему возможность самостоятельно выполнить необходимые для корректного завершения действия. Система посылает в оконную функцию сообщение WMDESTROY, получив которое, приложение должно закрыть открытые файлы и освободить динамическую память. Если очень нужно, может даже завершить какие-то вычисления или записать данные на диск. После этого приложение вызывает функцию PostQui tMessage(), которая занесет в очередь сообщение WM_QUIT. После этого основной цикл, прочитав это сообщение из очереди, снимет приложение с выполнения.


⇐ Предыдущая| |Следующая ⇒