Поделиться через


Класс 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".

Иерархия наследования

CObject

CCmdTarget

CWnd

CFrameWnd

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

Пример кода вызывает метод класса, производный 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