Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы

         

Окна MDI-приложения


На первый взгляд может показаться, что MDI-приложение состоит из окон двух типов: главного окна приложения (которое можно отнести к перекрывающимся окнам) и дочерних окон Document Window, в которых отображаются документы или другая информация. Это не совсем верно. На самом деле в MDI-приложении имеется больше окон, чем кажется. Кроме того, окна Document Window ведут себя немного не так, как обычные дочерние окна.

Запустите приложение WSTYLE, загрузочный модуль которого есть на дискете, прилагаемой к 11 тому "Библиотеки системного программиста" (приложение WSTYLE описано в 3 главе 11 тома, оно демонстрирует поведение окон, имеющих различные стили). Внешний вид окон, создаваемых этим приложением, показан на рис. 1.7.

Рис. 1.7. Окна, создаваемые приложением WSTYLE

Проведя эксперимент, вы сможете легко убедиться в том, что дочерние окна Document Window ведут себя не так, как временные (pop up), перекрывающиеся (overlapped) или "настоящие" дочерние (child) окна. В отличие от перекрывающихся и временных окон, окна Document Window не могут выходить за границы создавшего их окна. В этом окна Document Window похожи на дочерние окна. Однако дочернее окно не может стать активным, и его заголовок (если он есть) никогда не будет выделен цветом, сколько бы вы не щелкали по нему левой клавишей мыши. Если же выбрать окно Document Window, оно становится активным и цвет его заголовка изменяется, становясь таким же, как и у активного перекрывающегося или временного окна.

Секрет такого странного поведения окон Document Window заключается в том, что Windows создает заголовок окна Document Window в виде отдельного окна и для активного окна Document Window изменяет цвет фона окна заголовка. Таким образом, для Windows окно Document Window состоит как бы из двух отдельных дочерних окон - окна заголовка и окна, отображающего документ.

Но это еще не все. Оказывается, MDI-приложение создает еще одно, невидимое окно, которое является родительским для окон Document Window.


Это окно называется Client Window и оно является дочерним по отношению к главному окну приложения.

Как правило, окно Client Window занимает всю внутреннюю область главного окна приложения (client area). Поэтому окна Document Window располагаются внутри внутреннего пространства главного окна приложения. Если же в приложении используется орган управления Toolbar (набор кнопок с изображением пиктограмм, дублирующих функции меню) или Statusbar (строка состояния в нижней части главного окна приложения), необходимо искусственно уменьшить размер окна Client Window. Позже мы расскажем вам, как это сделать.

Иерархия окон, создаваемых MDI-приложением, показана на рис. 1.8.



Рис. 1.8. Иерархия окон MDI-приложения

Прежде всего, приложение создает главное окно Frame Window, вызывая функцию CreateWindow. Это окно создается аналогично обычному главному окну приложения и является перекрывающимся. Оно может иметь меню, системное меню, кнопки и рамку для изменения размера.

Перед созданием окна Frame Window приложение должно зарегистрировать класс окна обычным образом, назначив стиль окна, а также при необходимости меню и пиктограмму. Разумеется, в приложении должна быть определена соответствующая функция окна. Она похожа на обычную, но в ней вместо функции DefWindowProc вызывается функция DefFrameProc, выполняющая дополнительную обработку сообщений.

После создания окна Frame Window следует создать окно Client Window, во внутренней области которого будут располагаться окна Document Window. Окно Client Window создается на базе предопределенного класса окна "MDICLIENT" с помощью функции CreateWindow. Для окна Client Window не нужно определять функцию окна, так как она уже определена в Windows.

Внутренняя область окна Client Window называется рабочим пространством приложения (application workspace). Внутри этой области создаются дочерние окна Document Window.

И, наконец, по мере необходимости MDI-приложение создает окна Document Window, посылая окну Client Window при помощи функции SendMessage сообщение WM_MDICREATE.


В ответ на это сообщение функция окна Client Window, определенная в Windows, создает новое окно Document Window. Отметим, что для создания окон Document Window нельзя использовать функцию CreateWindow.

Перед тем как приступить к созданию окон Document Window, приложение должно зарегистрировать класс окна Document Window и определить соответствующую функцию окна. Функция окна Document Window определяет реакцию окна на сообщения, предназначенные окну Document Window, и выполняет рисование во внутренней области окна Document Window. В этой функции вместо функции DefWindowProc вызывается функция DefMDIChildProc.

Таким образом, MDI-приложение при инициализации создает окно Frame Window и Client Window, определяя для окна Frame Window класс окна и специальную функцию окна. В процессе работы приложение создает окна Document Window, посылая окну Client Window сообщение WM_MDICREATE.

При необходимости упорядочить расположение окон Document Window или представляющих их пиктограмм приложение посылает окну Client Window соответствующие сообщения. Например, для каскадного расположения окон Document Window нужно послать сообщение WM_MDICASCADE. Функция окна Client Window сама выполнит необходимое перемещение окон и изменит их размеры, избавляя программиста от рутинной работы.


Содержание раздела