Запись главного цикла обработки сообщений
Главный цикл обработки сообщений приложения MDI похож на цикл не-MDI приложения, который обрабатывает клавиши-ускорители. Различие в том, что цикл обработки сообщений MDI вызывает функцию TranslateMDISysAccel перед проверкой определяемых программой клавиш-ускорителей, или перед диспетчеризацией сообщения.
Пример ниже показывает цикл обработки сообщений типичного MDI приложения.
Обратите внимание! на то, что GetMessage может возвратить значение - (минус)1, если есть ошибка. |
Демонстрационный пример
MSG msg; BOOL bRet; while ((bRet = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0) { if (bRet == -1) { // обработка ошибки и возможный выход из программы } else { if (!TranslateMDISysAccel(hwndMDIClient, &msg) && !TranslateAccelerator(hwndFrame, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } |
Функция TranslateMDISysAccel преобразует сообщения WM_KEYDOWN в сообщения WM_SYSCOMMAND и отправляет их активному дочернему окну MDI. Если сообщение - сообщение не ускорителя MDI, функция возвращает ЛОЖЬ (FALSE), когда прикладная программа использует функцию TranslateAccelerator, чтобы выяснить, обрабатывалась ли какая - либо из определяемых программой клавиша-ускоритель. В противном случае цикл доставляет сообщение в соответствующую оконную процедуру.