Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Операционная система 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);
  }
}
[Назад] [Содеожание] [Дальше]