Сведения о интерфейсе нескольких документов
Каждый документ в приложении многодокументного интерфейса (MDI) отображается в отдельном дочернем окне в клиентской области главного окна приложения. Типичные приложения MDI включают приложения для word-обработки, которые позволяют пользователю работать с несколькими текстовыми документами и приложениями электронной таблицы, которые позволяют пользователю работать с несколькими диаграммами и электронными таблицами. Дополнительные сведения см. в следующих разделах.
- Рамка, клиентская область и дочерние окна Windows
- Создание дочернего окна
- Активация дочернего окна
- меню нескольких документов
- нескольких акселераторов документов
- размер и расположение дочернего окна
- Заголовок значков Windows
- данные дочернего окна
Фрейм, клиент и дочерние окна
Приложение MDI имеет три типа окон: окно кадра, клиентское окно MDI, а также ряд дочерних окон. Окно рамки похоже на главное окно приложения: оно имеет изменяемую границу, заголовочную строку, меню окна, кнопку свертывания и кнопку развёртывания. Приложение должно зарегистрировать класс окна для окна фрейма и предоставить процедуру окна для его поддержки.
Приложение MDI не отображает выходные данные в клиентской области окна кадра. Вместо этого отображается окно клиента MDI. Окно MDI — это особый тип дочернего окна, относящегося к предварительно зарегистрированным классам окон MDICLIENT. Клиентское окно является дочерним элементом окна фрейма; он служит фоном для дочерних окон. Она также обеспечивает поддержку создания дочерних окон и управления ими. Например, приложение MDI может создавать, активировать или развернуть на весь экран дочерние окна, отправляя управляющие сообщения в окно клиента MDI.
Когда пользователь открывает или создает документ, окно клиента создает дочернее окно для документа. Окно клиента — это родительское окно всех дочерних окон MDI в приложении. Каждое дочернее окно имеет рамку для изменения размера, строку заголовка, меню окна, кнопку свертывания и кнопку развертывания. Так как дочернее окно обрезается, оно ограничивается окном клиента и не может отображаться вне него.
Приложение MDI может поддерживать несколько типов документов. Например, обычное приложение электронной таблицы позволяет пользователю работать как с диаграммами, так и с электронными таблицами. Для каждого типа документа, поддерживаемого им, приложение MDI должно зарегистрировать дочерний класс окна и предоставить процедуру окна для поддержки окон, принадлежащих данному классу. Дополнительные сведения о классах окон см. в разделе "Классы окон". Дополнительные сведения о процедурах окна см. в Процедуры окна.
Ниже приведено типичное MDI-приложение. Он называется Multipad.
Создание дочернего окна
Чтобы создать дочернее окно, приложение MDI вызывает функцию CreateMDIWindow или отправляет сообщение WM_MDICREATE в окно клиента MDI. Более эффективный способ создания дочернего окна MDI — вызвать функцию CreateWindowEx, указав расширенный стиль WS_EX_MDICHILD.
Чтобы уничтожить дочернее окно, приложение MDI отправляет WM_MDIDESTROY сообщение в окно клиента MDI.
Активация дочернего окна
Любое количество дочерних окон может отображаться в окне клиента в любое время, но только одно может быть активным. Активное дочернее окно размещается перед всеми другими дочерними окнами, а ее граница выделена.
Пользователь может активировать неактивное дочернее окно, щелкнув его. Приложение MDI активирует дочернее окно, отправив WM_MDIACTIVATE сообщение в окно клиента MDI. По мере того как окно клиента обрабатывает это сообщение, оно отправляет WM_MDIACTIVATE сообщение в процедуру окна дочернего окна для активации и в процедуру окна деактивации дочернего окна.
Чтобы предотвратить активацию дочернего окна, обработайте сообщение WM_NCACTIVATE для дочернего окна, возвращая FALSE.
Система отслеживает положение каждого дочернего окна в стеке накладывающихся окон. Это слоение называется Z-Order. Пользователь может активировать следующее дочернее окно по Z-порядку, щелкнув на пункт Далее в меню окна в текущем активном окне. Приложение активирует следующее (или предыдущее) дочернее окно в порядке Z, отправив WM_MDINEXT сообщение в окно клиента.
Чтобы получить дескриптор активного дочернего окна, приложение MDI отправляет в окно клиента сообщение WM_MDIGETACTIVE.
Меню для работы с несколькими документами
Окно фрейма приложения MDI должно содержать строку меню с меню окна. Меню окна должно содержать элементы, которые упорядочиют дочерние окна в окне клиента или закрывают все дочерние окна. Меню окна типичного приложения MDI может содержать элементы в следующей таблице.
Элемент меню | Цель |
---|---|
плитка | Упорядочивает дочерние окна в виде плитки таким образом, чтобы каждое из них отображалось полностью в клиентской области. |
Каскад | Упорядочивает дочерние окна в каскадном формате. Дочерние окна пересекаются друг с другом, но заголовок каждой из них отображается. |
упорядочить значки | Упорядочивает значки свернутых дочерних окон в нижней части клиентского окна. |
Закрыть всё | Закрывает все дочерние окна. |
При создании дочернего окна система автоматически добавляет новый пункт меню в меню окна. Текст элемента меню совпадает с текстом в строке меню нового дочернего окна. Щелкнув пункт меню, пользователь может активировать соответствующее дочернее окно. При уничтожении дочернего окна система автоматически удаляет соответствующий пункт меню из меню окна.
Система может добавить до десяти элементов меню в меню окна. После создания десятого дочернего окна система добавляет элемент Больше окон в меню окна. Щелкнув этот элемент, отобразится диалоговое окно выбора окна. Диалоговое окно содержит список с заголовками всех дочерних окон MDI, доступных в настоящее время. Пользователь может активировать дочернее окно, щелкнув его заголовок в списке.
Если приложение MDI поддерживает несколько типов дочерних окон, настройте строку меню для отражения операций, связанных с активным окном. Для этого укажите отдельные ресурсы меню для каждого типа дочернего окна, которое поддерживает приложение. При активации нового типа дочернего окна приложение должно отправить сообщение WM_MDISETMENU к клиентскому окну, передав ему дескриптор соответствующего меню.
Если дочернее окно не существует, строка меню должна содержать только элементы, используемые для создания или открытия документа.
Когда пользователь перемещается через меню приложения MDI с помощью клавиш курсора, ключи ведут себя не так, как при переходе пользователя через типичные меню приложения. В приложении MDI элемент управления передается из меню окна приложения в меню окна активного дочернего окна, а затем на первый элемент в строке меню.
Несколько акселераторов документов
Чтобы получать и обрабатывать ключи акселератора для дочерних окон, приложение MDI должно включать функцию TranslateMDISysAccel в цикл сообщений. Цикл должен сначала вызывать TranslateMDISysAccel, прежде чем вызывать функцию TranslateAccelerator или 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 также может хранить данные для каждого документа с помощью свойств окна. данные для каждого документа — это данные, относящиеся к типу документа, содержащегося в определенном дочернем окне. Свойства отличаются от дополнительного пространства в структуре окна, поэтому при регистрации класса окна не нужно выделять дополнительное пространство. Окно может иметь любое количество свойств. Кроме того, где смещения используются для доступа к дополнительному пространству в структурах окон, свойства обозначаются строковыми именами. Дополнительную информацию о свойствах окна см. в Свойства окна.