Сведения об интерфейсе нескольких документов

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

Фреймы, клиентские и дочерние окна

Приложение MDI имеет три типа окон: окно фрейма, клиентское окно MDI, а также несколько дочерних окон. Окно фрейма похоже на окно main приложения: оно имеет границу размера, заголовок окна, меню окна, кнопку свернуть и кнопку развертывания. Приложение должно зарегистрировать класс окна для окна фрейма и предоставить процедуру окна для его поддержки.

Приложение MDI не отображает выходные данные в клиентской области окна фрейма. Вместо этого отображается окно клиента MDI. Окно клиента MDI — это особый тип дочернего окна, принадлежащий предварительно зарегистрированным оконным классу MDICLIENT. Клиентское окно является дочерним по отношению к окну фрейма; служит фоном для дочерних окон. Она также обеспечивает поддержку создания дочерних окон и управления ими. Например, приложение MDI может создавать, активировать или разворачивать дочерние окна, отправляя сообщения в окно клиента MDI.

Когда пользователь открывает или создает документ, клиентское окно создает дочернее окно для документа. Клиентское окно является родительским окном всех дочерних окон MDI в приложении. Каждое дочернее окно имеет границу размера, заголовок окна, меню окна, кнопку свернуть и кнопку развертывания. Так как дочернее окно обрезано, оно ограничивается клиентским окном и не может отображаться за его пределами.

Приложение MDI может поддерживать несколько типов документов. Например, типичное приложение для работы с электронными таблицами позволяет пользователю работать как с диаграммами, так и с электронными таблицами. Для каждого поддерживаемого типа документа приложение MDI должно зарегистрировать дочерний класс окна и предоставить процедуру окна для поддержки окон, принадлежащих к данному классу. Дополнительные сведения о классах окон см. в разделе Классы окон. Дополнительные сведения о процедурах окна см. в разделе Процедуры окна.

Ниже приведено типичное приложение MDI. Он называется Multipad.

Окно фрейма приложения multipad mdi и окно клиента

Создание дочернего окна

Чтобы создать дочернее окно, приложение MDI либо вызывает функцию CreateMDIWindow , либо отправляет сообщение WM_MDICREATE в окно клиента MDI. Более эффективный способ создания дочернего окна MDI — вызвать функцию CreateWindowEx , указав WS_EX_MDICHILD расширенный стиль.

Чтобы уничтожить дочернее окно, приложение MDI отправляет WM_MDIDESTROY сообщение в окно клиента MDI.

Активация дочернего окна

Любое количество дочерних окон может появиться в окне клиента в любой момент времени, но только одно из них может быть активным. Активное дочернее окно располагается перед всеми остальными дочерними окнами, а его граница выделена.

Пользователь может активировать неактивное дочернее окно, щелкнув его. Приложение MDI активирует дочернее окно, отправляя WM_MDIACTIVATE сообщение в окно клиента MDI. Когда клиентское окно обрабатывает это сообщение, оно отправляет WM_MDIACTIVATE сообщение в процедуру окна дочернего окна, которое необходимо активировать, и в процедуру окна для деактивации дочернего окна.

Чтобы предотвратить активацию дочернего окна, обработайте сообщение WM_NCACTIVATE дочернему окну, возвращая значение FALSE.

Система отслеживает положение каждого дочернего окна в стеке перекрывающихся окон. Такое сложение называется Z-порядком. Пользователь может активировать следующее дочернее окно в порядке Z, нажав кнопку Далее в меню окна в активном окне. Приложение активирует следующее (или предыдущее) дочернее окно в порядке Z, отправляя WM_MDINEXT сообщение в клиентское окно.

Чтобы получить дескриптор активного дочернего окна, приложение MDI отправляет WM_MDIGETACTIVE сообщение в клиентское окно.

Меню нескольких документов

Окно фрейма приложения MDI должно содержать строку меню с меню окна. Меню окна должно содержать элементы, которые упорядочить дочерние окна в клиентском окне или закрыть все дочерние окна. Меню окна типичного приложения MDI может включать элементы из следующей таблицы.

Элемент меню Назначение
Плитка Упорядочивает дочерние окна в формате плитки, чтобы каждое из них отображалось полностью в окне клиента.
Cascade Упорядочивает дочерние окна в каскадном формате. Дочерние окна перекрываются друг с другом, но отображается заголовок каждого окна.
Упорядочить значки Размещает значки свернутых дочерних окон в нижней части клиентского окна.
Закрыть все Закрывает все дочерние окна.

 

При создании дочернего окна система автоматически добавляет новый пункт меню в меню окна. Текст пункта меню совпадает с текстом в строке меню нового дочернего окна. Щелкнув пункт меню, пользователь может активировать соответствующее дочернее окно. При уничтожении дочернего окна система автоматически удаляет соответствующий пункт меню из меню окна.

Система может добавить до десяти пунктов меню в меню окна. При создании десятого дочернего окна система добавляет элемент Дополнительные окна в меню окна. Если щелкнуть этот элемент, откроется диалоговое окно Выбор окна . Диалоговое окно содержит список с заголовками всех доступных дочерних окон MDI. Пользователь может активировать дочернее окно, щелкнув его заголовок в списке.

Если приложение MDI поддерживает несколько типов дочерних окон, настройте строку меню в соответствии с операциями, связанными с активным окном. Для этого укажите отдельные ресурсы меню для каждого типа дочернего окна, которое поддерживает приложение. При активации дочернего окна нового типа приложение должно отправить WM_MDISETMENU сообщение в клиентское окно, передав ему дескриптор в соответствующее меню.

Если дочернего окна не существует, строка меню должна содержать только элементы, используемые для создания или открытия документа.

Когда пользователь перемещается по меню приложения MDI с помощью клавиш курсора, клавиши ведут себя иначе, чем при навигации пользователя по меню типичного приложения. В приложении MDI элемент управления передается из меню окна приложения в меню окна активного дочернего окна, а затем в первый элемент в строке меню.

Несколько ускорителей документов

Чтобы получать и обрабатывать ключи ускорителя для дочерних окон, приложение MDI должно включать функцию TranslateMDISysAccel в цикл сообщений. Цикл должен вызвать TranslateMDISysAccel перед вызовом функции TranslateAccel или DispatchMessage .

Клавиши ускорителя в меню окна дочернего окна MDI отличаются от клавиш для дочернего окна, отличного от MDI. В дочернем окне MDI сочетание клавиш ALT+ – (минус) открывает меню окна, сочетание клавиш CTRL+F4 закрывает активное дочернее окно, а сочетание клавиш CTRL+F6 активирует следующее дочернее окно.

Размер и расположение дочернего окна

Приложение MDI управляет размером и положением своих дочерних окон, отправляя сообщения в окно клиента MDI. Чтобы развернуть активное дочернее окно, приложение отправляет WM_MDIMAXIMIZE сообщение в окно клиента. Когда дочернее окно развернуто, его клиентская область полностью заполняет окно клиента MDI. Кроме того, система автоматически скрывает заголовок дочернего окна и добавляет значок меню дочернего окна и кнопку Восстановить в строку меню приложения MDI. Приложение может восстановить окно клиента до исходного (предмаксимизированного) размера и положения, отправив окну клиента WM_MDIRESTORE сообщение.

Приложение MDI может упорядочить свои дочерние окна в формате каскада или плитки. При каскадной настройке дочерних окон окна отображаются в стеке. Окно в нижней части стека занимает левый верхний угол экрана, а остальные окна смещаются вертикально и горизонтально, чтобы была видна левая граница и заголовок каждого дочернего окна. Чтобы упорядочить дочерние окна в каскадном формате, приложение MDI отправляет сообщение WM_MDICASCADE . Как правило, приложение отправляет это сообщение, когда пользователь щелкает каскад в меню окна.

Когда дочерние окна мозаичны, система отображает каждое дочернее окно полностью, не перекрывая ни одно из окон. Размер всех окон при необходимости соответствует размеру клиентского окна. Чтобы упорядочить дочерние окна в формате плитки, приложение MDI отправляет WM_MDITILE сообщение в клиентское окно. Как правило, приложение отправляет это сообщение, когда пользователь щелкает Элемент в меню окна.

Приложение MDI должно предоставлять разные значки для каждого типа дочернего окна, которое оно поддерживает. Приложение указывает значок при регистрации дочернего класса окна. Система автоматически отображает значок дочернего окна в нижней части клиентского окна, когда дочернее окно свернуто. Приложение MDI указывает системе упорядочить значки дочернего окна, отправляя WM_MDIICONARRANGE сообщение в клиентское окно. Как правило, приложение отправляет это сообщение, когда пользователь нажимает кнопку Упорядочить значки в меню окна.

Окна заголовков значков

Так как дочерние окна MDI могут быть свернуты, приложение MDI не должно манипулировать окнами заголовков значков, как если бы они были обычными дочерними окнами MDI. Окна заголовков значков отображаются, когда приложение перечисляет дочерние окна клиентского окна MDI. Окна заголовков значков отличаются от других дочерних окон тем, что они принадлежат дочернему окну MDI.

Чтобы определить, является ли дочернее окно окном заголовка значка, используйте функцию GetWindow с индексом GW_OWNER. Окна, не являющиеся заголовками, возвращают значение NULL. Обратите внимание, что этого теста недостаточно для окон верхнего уровня, так как меню и диалоговые окна являются собственными окнами.

Данные дочернего окна

Так как количество дочерних окон зависит от того, сколько документов открывает пользователь, приложение MDI должно иметь возможность связывать данные (например, имя текущего файла) с каждым дочерним окном. Это можно сделать двумя способами.

  • Хранение данных дочернего окна в структуре окна.
  • Используйте свойства окна.

Структура окна

Когда приложение MDI регистрирует класс окна, оно может зарезервировать дополнительное пространство в структуре окна для данных приложения, относящихся к этому конкретному классу окон. Для хранения и извлечения данных в этом дополнительном пространстве приложение использует функции GetWindowLong и SetWindowLong .

Чтобы сохранить большой объем данных для дочернего окна, приложение может выделить память для структуры данных, а затем сохранить дескриптор в памяти, содержащей структуру, в дополнительном пространстве, связанном с дочерним окном.

Свойства окна

Приложение MDI также может хранить данные для каждого документа с помощью свойств окна. Данные для каждого документа — это данные, относящиеся к типу документа, содержащегося в определенном дочернем окне. Свойства отличаются от дополнительного пространства в структуре окна тем, что вам не нужно выделять дополнительное пространство при регистрации класса окна. Окно может иметь любое количество свойств. Кроме того, если смещения используются для доступа к дополнительному пространству в структурах окон, на свойства ссылаются имена строк. Дополнительные сведения о свойствах окна см. в разделе Свойства окна.