Полноценное оконное приложение Типичная программа, работающая в среде Windows, содержит, как минимум, две функции, запускаемые операционной системой. Это главная функция WinMainO, содержащая основной цикл выбора сообщений из очереди, и оконная функция, обрабатывающая эти сообщения. Обычно WinMainO перед выполнением основного цикла вызывает функцию (в данном примере она названа Ini tApp()), которая описывает и создает окно, производит другие однократные действия, необходимые для инициализации приложения, после чего основной цикл ожидает сообщения и рассылает их соответствующим окнам.

В листинге 1.2 приведен код функции WinMainO.

Листинг 1.2

#inc1ude <windows.h>

int InitApp(HINSTANCE 1); //Предописания функции InitApp. int API ENTRY WinMain (HINSTANCE KodPril.HINSTANCE.LPSTR.int Oknlcon) { MSG msg: //Сюда GetMessageO заносит выбранное из очереди сообщение, if (InitApp(KodPriD) return 1; while (GetMessageC (LPMSG)&msg. NULL. 0. 0) )

{ DispatchMessageC (LPMSG)&msg ): } return msg.wParam;
}

Полноценное оконное приложение Функция GetMessageC) выбирает из очереди сообщение и заносит его в структуру msg. Если это было сообщение WM_QUIT, то функция GetMessageC) возвращает нулевое значение и цикл завершается. При этом следующая за циклом команда return msg.wParam завершает приложение и передает управление операционной системе. Возвращаемое оператором return число может быть проанализировано операционной системой для получения информации о том, как завершилось приложение.

Функция GetMessageC) извлекает из очереди приложения все сообщения, если ее второй параметр равен NULL, а два последних равны нулю. В противном случае извлекаются только сообщения окну, дескриптор которого задан вторым параметром. Третий и четвертый параметры задают диапазон извлекаемых сообщений. Сообщение, номер которого не попадает в этот диапазон, пропускается.

В теле цикла организуется передача сообщения в оконную процедуру функцией Di spatchMessageC). Она не вызывает оконную процедуру непосредственно, а оповещает о необходимости вызова операционную систему и передает управление следующему оператору в теле цикла. Следует заметить, что, желая повысить быстродействие программы, мы можем вызвать оконную функцию напрямую, не обращаясь к операционной системе. Для этого достаточно заменить в основном цикле функцию Di spatchMessageC) вызовом функции InputWndProc (msg.hwnd, msg.message, msg.wParam, msg.lParam).


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