Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Предоставляет функции дочернего окна многодокументного интерфейса Windows (MDI) и элементы для управления окном.
Синтаксис
class CMDIChildWnd : public CFrameWnd
Участники
Открытые конструкторы
| Имя | Описание |
|---|---|
| CMDIChildWnd::CMDIChildWnd | Формирует объект CMDIChildWnd. |
Открытые методы
| Имя | Описание |
|---|---|
| CMDIChildWnd::Create | Создает дочернее окно Windows MDI, связанное CMDIChildWnd с объектом. |
| CMDIChildWnd::GetMDIFrame | Возвращает родительский кадр MDI в окне клиента MDI. |
| CMDIChildWnd::MDIActivate | Активирует это дочернее окно MDI. |
| CMDIChildWnd::MDIDesk | Удаляет это дочернее окно MDI. |
| CMDIChildWnd::MDIMaximize | Разворачивает это дочернее окно MDI. |
| CMDIChildWnd::MDIRestore | Восстанавливает это дочернее окно MDI из развернутого или свернутого размера. |
| CMDIChildWnd::SetHandles | Задает дескрипторы для ресурсов меню и акселератора. |
Замечания
Дочернее окно MDI выглядит так же, как обычное окно фрейма, за исключением того, что дочернее окно MDI отображается в окне фрейма MDI, а не на рабочем столе. Дочернее окно MDI не имеет собственной строки меню, но вместо этого предоставляет общий доступ к меню окна фреймов MDI. Платформа автоматически изменяет меню кадров MDI, чтобы представить текущее активное дочернее окно MDI.
Чтобы создать полезное дочернее окно MDI для приложения, наследуйте класс.CMDIChildWnd Добавьте переменные-члены в производный класс для хранения данных, относящихся к приложению. Реализуйте в производном классе функции-члены обработчика сообщений и схему сообщений, чтобы указать, что происходит, когда сообщения направляются в окно.
Существует три способа создания дочернего окна MDI:
Непосредственно создайте его с помощью
Create.Непосредственно создайте его с помощью
LoadFrame.Косвенно создайте его с помощью шаблона документа.
Перед вызовом Create или LoadFrameнеобходимо создать объект frame-window в куче с помощью оператора C++ new . Перед вызовом Create можно также зарегистрировать класс окна с помощью глобальной функции AfxRegisterWndClass , чтобы задать стили значков и классов для кадра.
Используйте функцию-член для Create передачи параметров создания кадра в качестве непосредственных аргументов.
LoadFrame требует меньше аргументов, чем Createи вместо этого извлекает большинство значений по умолчанию из ресурсов, включая подпись кадра, значок, таблицу акселератора и меню. Для доступа LoadFrameко всем этим ресурсам должен быть один и тот же идентификатор ресурса (например, IDR_MAINFRAME).
CMDIChildWnd Если объект содержит представления и документы, они создаются косвенно платформой, а не непосредственно программистом. Объект CDocTemplate управляет созданием кадра, созданием содержащихся представлений и подключением представлений к соответствующему документу. Параметры конструктора CDocTemplate указывают CRuntimeClass три класса, участвующих (документ, кадр и представление).
CRuntimeClass Объект используется платформой для динамического создания новых кадров при указании пользователем (например, с помощью команды "Создать файл" или команды MDI Window New).
Класс окна кадра, производный от CMDIChildWnd него, должен быть объявлен с DECLARE_DYNCREATE для правильной работы приведенного выше механизма RUNTIME_CLASS.
Класс CMDIChildWnd наследует большую часть своей реализации по умолчанию.CFrameWnd Подробный список этих функций см. в описании класса CFrameWnd . Класс CMDIChildWnd имеет следующие дополнительные функции:
В сочетании с классом
CMultiDocTemplateнесколькоCMDIChildWndобъектов из одного шаблона документа используют одно и то же меню, сохраняя системные ресурсы Windows.В настоящее время активное дочернее меню MDI полностью заменяет меню окна фрейма MDI, а заголовок активного дочернего окна MDI добавляется в заголовок окна кадров MDI. Дополнительные примеры функций дочернего окна MDI, реализованных в сочетании с окном фрейма MDI, см. в описании
CMDIFrameWndкласса.
Не используйте оператор C++ delete для уничтожения окна фрейма. Вместо этого используйте CWnd::DestroyWindow. Реализация CFrameWnd приведет к удалению PostNcDestroy объекта C++ при уничтожении окна. Когда пользователь закрывает окно фрейма, обработчик по умолчанию OnClose вызывается DestroyWindow.
Дополнительные сведения см. в CMDIChildWndразделе "Фрейм Windows".
Иерархия наследования
CMDIChildWnd
Требования
Заголовок: afxwin.h
CMDIChildWnd::CMDIChildWnd
Вызов для создания CMDIChildWnd объекта.
CMDIChildWnd();
Замечания
Вызов Create для создания видимого окна.
Пример
См. пример для CMDIChildWnd::Create.
CMDIChildWnd::Create
Вызовите эту функцию-член, чтобы создать дочернее окно Windows MDI и присоединить его к объекту CMDIChildWnd .
virtual BOOL Create(
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CMDIFrameWnd* pParentWnd = NULL,
CCreateContext* pContext = NULL);
Параметры
lpszClassName
Указывает на строку символов, завершающую значение NULL, которая называет класс Windows ( структура WNDCLASS ). Имя класса может быть любым именем, зарегистрированным в глобальной функции AfxRegisterWndClass . Должно иметь значение NULL для стандарта CMDIChildWnd.
lpszWindowName
Указывает на строку символов, завершающую значение NULL, представляющую имя окна. Используется в качестве текста для строки заголовка.
dwStyle
Задает атрибуты стиля окна. Требуется стиль WS_CHILD.
rect
Содержит размер и положение окна. Значение rectDefault позволяет Windows указывать размер и позицию нового CMDIChildWnd.
pParentWnd
Указывает родительский элемент окна. Если значение NULL, используется главное окно приложения.
pContext
Указывает структуру CCreateContext . Этот параметр может принимать значение NULL.
Возвращаемое значение
Имеет ненулевое значение в случае успешного выполнения, иначе — 0.
Замечания
Текущее активное окно дочернего фрейма MDI может определить заголовок родительского окна фрейма. Эта функция отключена, отключив бит стиля FWS_ADDTOTITLE дочернего окна фрейма.
Платформа вызывает эту функцию-член в ответ на команду пользователя для создания дочернего окна, а платформа использует параметр pContext для правильного подключения дочернего окна к приложению. При вызове CreatepContext может иметь значение NULL.
Пример 1
В этом примере обработчик команды меню вызывается Create для создания дочернего окна MDI:
// CMainFrame::OnFileNewCMdiChildWnd() is a menu command handler for the
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a standard Windows MDI child window using
// the registered CMDIChildWnd class.
void CMainFrame::OnFileNewMdiChildWnd()
{
CMDIChildWnd *pMDIChildWnd = new CMDIChildWnd;
VERIFY(pMDIChildWnd->Create(
NULL, // standard CMDIChildWnd class
_T("My MDIChildWnd"), // caption of MDI child window
WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, // window styles
rectDefault, // default rectangle size
this)); // parent window; can be NULL
// the default PostNcDestroy handler will delete this object when destroyed
}
Пример 2
Пример кода вызывает метод класса, производный CreateCHelloWndот CMDIChildWnd:
// CMainFrame::OnHello() is a menu command handler for the CMainFrame
// class, which in turn is a CMDIFrameWnd-derived class.
// It shows the creation of a Windows MDI child window using a custom
// window class. The custom window class is registered in
// CHelloWnd::Create(). CHelloWnd is a CMDIChildWnd-derived class.
void CMainFrame::OnHello()
{
CHelloWnd *pHelloWnd = new CHelloWnd;
if (!pHelloWnd->Create(_T("Hello"),
WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
rectDefault, this))
return;
// the default PostNcDestroy handler will delete this object when destroyed
}
В этом примере показана Create реализация CHelloWnd класса:
BOOL CHelloWnd::Create(
LPCTSTR szTitle,
LONG style /* = 0 */,
const RECT &rect /* = rectDefault */,
CMDIFrameWnd *parent /* = NULL */)
{
// Setup the shared menu
SetHandles(::LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_HELLO)),
NULL);
// Register a custom WndClass and create a window.
// This must be done because CHelloWnd has a custom icon.
LPCTSTR lpszHelloClass =
AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
LoadCursor(NULL, IDC_ARROW),
(HBRUSH)(COLOR_WINDOW + 1),
LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_HELLO)));
return CMDIChildWnd::Create(lpszHelloClass, szTitle, style, rect, parent);
}
CMDIChildWnd::GetMDIFrame
Вызовите эту функцию, чтобы вернуть родительский кадр MDI.
CMDIFrameWnd* GetMDIFrame();
Возвращаемое значение
Указатель на окно родительского кадра MDI.
Замечания
Возвращаемый кадр является двумя родителями, удаленными из CMDIChildWnd него, и является родительским элементом окна типа MDICLIENT, который управляет CMDIChildWnd объектом.
Вызовите функцию-член GetParent, чтобы вернуть CMDIChildWnd немедленный родительский элемент MDICLIENT объекта в качестве временного указателяCWnd.
Пример
См. пример cmDIFrameWnd ::MDISetMenu.
CMDIChildWnd::MDIActivate
Вызовите эту функцию-член, чтобы активировать дочернее окно MDI независимо от окна фрейма MDI.
void MDIActivate();
Замечания
Когда кадр становится активным, дочерний окно, которое было активировано последней активацией, также будет активировано.
Пример
См. пример CMDIFrameWnd ::GetWindowMenuPopup.
CMDIChildWnd::MDIDesk
Вызовите эту функцию-член, чтобы уничтожить дочернее окно MDI.
void MDIDestroy();
Замечания
Функция-член удаляет заголовок дочернего окна из окна кадра и отключает дочернее окно.
Пример
// CMainFrame::OnCloseWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It closes and destroys the current active MDI child window.
void CMainFrame::OnCloseWindow()
{
CMDIChildWnd *child = MDIGetActive();
if (child)
child->MDIDestroy();
}
CMDIChildWnd::MDIMaximize
Вызовите эту функцию-член, чтобы развернуть дочернее окно MDI.
void MDIMaximize();
Замечания
Если дочернее окно развернуто, Windows изменяет размер окна, чтобы его клиентская область заполнялась клиентской областью окна кадра. Windows помещает меню "Управление" дочернего окна в строке меню кадра, чтобы пользователь смог восстановить или закрыть дочернее окно и добавить заголовок дочернего окна в заголовок окна фрейма.
Пример
// CMainFrame::OnMaximizeWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived
// class. It maximizes the current active MDI child window.
void CMainFrame::OnMaximizeWindow()
{
BOOL maximized;
CMDIChildWnd *child = MDIGetActive(&maximized);
if (child && (!maximized))
child->MDIMaximize(); // or MDIMaximize(child);
}
CMDIChildWnd::MDIRestore
Вызовите эту функцию-член, чтобы восстановить дочернее окно MDI из развернутого или свернутого размера.
void MDIRestore();
Пример
// CMainFrame::OnRestoreWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It restores the current active MDI child window from maximized
// or minimized size.
void CMainFrame::OnRestoreWindow()
{
BOOL maximized;
CMDIChildWnd *child = MDIGetActive(&maximized);
if (child && (maximized || child->IsIconic()))
child->MDIRestore(); // or MDIRestore(child);
}
CMDIChildWnd::SetHandles
Задает дескрипторы для ресурсов меню и акселератора.
void SetHandles(
HMENU hMenu,
HACCEL hAccel);
Параметры
hMenu
Дескриптор ресурса меню.
hAccel
Дескриптор ресурса акселератора.
Замечания
Вызовите эту функцию, чтобы задать ресурсы меню и акселератора, используемые объектом дочернего окна MDI.
См. также
Пример MDI MFC
Пример MDIDOCVW MFC
Пример SNAPVW MFC
Класс CFrameWnd
Диаграмма иерархии
Класс CWnd
Класс CMDIFrameWnd