Запись главного цикла обработки сообщений
Главный цикл обработки сообщений приложения 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, чтобы выяснить, обрабатывалась ли какая - либо из определяемых программой клавиша-ускоритель. В противном случае цикл доставляет сообщение в соответствующую оконную процедуру.