Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы© Александр Фролов, Григорий ФроловТом 17, М.: Диалог-МИФИ, 1994, 287 стр. 1.3. Изменения в цикле обработки сообщенийВремя от времени мы вносили небольшие изменения в самую "устойчивую" часть приложения - цикл обработки сообщений. Наши очередные нововведения касаются трансляции сообщений для 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); } } |