Уроки Iczelion'а



         

Урок 32. Создание MDI-приложения - часть 2


Первое различие состоит в том, что вы ДОЛЖHЫ вызывать DefFramProc вместо DefWindowProc для обработки Windows-сообщение вашему окну, которые вы не хотите обрабатывать самостоятельно. Это единственный путь заставить Windows делать за вас гразную работу по управлению MDI-приложение. Если вы забудете использовать DefFramProc, ваше приложение не будет иметь MDI-свойств. DefFrameProc имеет следующий синтакс:

DefFrameProc proc hwndFrame:DWORD, hwndClient:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

Если вы сравните DefFramProc с DefWindowProc, вы заметите, что разница между ними состоит в том, что у DefFrameProc пять параметров, в то время как у DefWindowProc только четыре. Дополнительный параметр - это хэндл клиенсткого окна. Это хэндл необходим для того, чтобы Windows могла посылать MDI-сообщения клиенсткому окну.

Второе различие заключается в том, что вы должны вызывать TranslateMDISysAccel в цикле обработки сообщений вашего фреймового окна. Это необходим, если вы хотите, что Windows обрабатывала нажатия на комбинации клавиш, связанных с MDI, такие как Ctrl+F4, Ctrl+Tab. У этой функции следующий прототип:

TranslateMDISysAccel proc hwndClient:DWORD, lpMsg:DWORD

Первый параметр - это хэндл клиентского окна. Для вас не должно быть сюрпризом, что клиентское окно будет родителем окном для все дочерних MDI-окон. Второй параметр - это адрес MSG-структуры, котоурю вы заполните с помощью функции getMessage. Идея состоит в том, чтобы передать MSG-структуру клиентскому окну, что оно могло проверить, содержит ли эта структура искомые комбинации клавиш. Если это так, она обрабатывает само сообщение и возвращает ненулевое значение, или, в противном случае, FALSE.

Этапы создания фреймовое окно могут быть кратко просуммированы:

  • Заполняем структуру WNDCLASSEX как обычно.
  • Регистрируем класс фреймового окна, вызвая RegisterClassEx.
  • Создаем фреймовое окно с помощью CreateWindowEx.
  • Внутри цикла обработки сообщений вызываем TranslateMDISysAccel.
  • Внутри процедуры окна передаем необрабатанные сообщения DefFrameProc вместо DefWindowProc.




Содержание  Назад  Вперед