Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы

         

Изменения в цикле обработки сообщений


Время от времени мы вносили небольшие изменения в самую "устойчивую" часть приложения - цикл обработки сообщений. Наши очередные нововведения касаются трансляции сообщений для MDI-приложений. Специальная трансляция сообщений требуется для обеспечения стандартного клавиатурного интерфейса MDI-приложений.

В простейшем случае цикл обработки сообщений MDI-приложения может выглядеть следующим образом:

while(GetMessage(&msg, NULL, 0, 0)) { if(!TranslateMDISysAccel(hwndClient, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }

Как видите, перед тем как передать сообщение функции TranslateMessage, приложение предварительно обрабатывает его функцией TranslateMDISysAccel:

BOOL TranslateMDISysAccel(HWND hwndClient, MSG FAR* lpmsg);

В качестве первого параметра функции передается идентификатор окна Client Window, который был возвращен функцией CreateWindow при создании этого окна. Второй параметр - указатель на структуру MSG, содержащую обрабатываемое сообщение.

Назначение функции TranslateMDISysAccel заключается в преобразовании клавиатурных сообщений WM_KEYDOWN и WM_KEYUP в сообщения WM_SYSCOMMAND, что необходимо для нормальной работы акселераторов, назначенных для строк системного меню окон Document Window.

Заметьте, что строки системного меню имеют акселераторы, аналогичные строкам системного меню главного окна приложения. Вместо клавиши <Alt> в них используется клавиша <Ctrl>. Например, для выбора строки "Close" в системном меню обычного окна используется комбинация клавиш <Alt + F4>, а для выбора этой же строки в системном меню окна Document Window предназначена комбинация клавиш <Ctrl + F4>.

Если функция TranslateMDISysAccel выполнила преобразование, она возвращает значение TRUE. В этом случае для данного сообщения уже не нужно вызывать функции TranslateMessage и DispatchMessage.

Приложение может определить собственные акселераторы. В этом случае в цикле обработки сообщений нужно вызывать функцию TranslateAccelerator:

while(GetMessage(&msg, NULL, 0, 0)) { if(!TranslateMDISysAccel(hwndClient, &msg) && !TranslateAccelerator(hwndFrame, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }



Содержание раздела