Класс CMDIChildWnd
Предоставляет функции дочернего окна многодокументного интерфейса 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 для правильного подключения дочернего окна к приложению. При вызове Create
pContext может иметь значение 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
Пример кода вызывает метод класса, производный Create
CHelloWnd
от 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