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


Класс CMDIFrameWnd

Предоставляет функции фреймового окна многодокументного интерфейса Windows (MDI) и элементы для управления окном.

Синтаксис

class CMDIFrameWnd : public CFrameWnd

Участники

Открытые конструкторы

Имя Описание
CMDIFrameWnd::CMDIFrameWnd Создает документ CMDIFrameWnd.

Открытые методы

Имя Описание
CMDIFrameWnd::CreateClient Создает окно Windows MDICLIENT для этого CMDIFrameWnd. Вызывается функцией-членом OnCreate CWnd.
CMDIFrameWnd::CreateNewChild Создает новое дочернее окно.
CMDIFrameWnd::GetWindowMenuPopup Возвращает всплывающее меню окна.
CMDIFrameWnd::MDIActivate Активирует другое дочернее окно MDI.
CMDIFrameWnd::MDICascade Упорядочивает все дочерние окна в каскадном формате.
CMDIFrameWnd::MDIGetActive Извлекает активное дочернее окно MDI, а также флаг, указывающий, развернут ли дочерний элемент.
CMDIFrameWnd::MDIIconArrange Упорядочивает все свернутые дочерние окна документа.
CMDIFrameWnd::MDIMaximize Разворачивает дочернее окно MDI.
CMDIFrameWnd::MDINext Активирует дочернее окно сразу за активным дочерним окном и помещает текущее активное дочернее окно за всеми остальными дочерними окнами.
CMDIFrameWnd::MDIPrev Активирует предыдущее дочернее окно и помещает текущее активное дочернее окно сразу за ним.
CMDIFrameWnd::MDIRestore Восстанавливает дочернее окно MDI из развернутого или свернутого размера.
CMDIFrameWnd::MDISetMenu Заменяет меню окна фрейма MDI, всплывающего меню окна или обоих элементов.
CMDIFrameWnd::MDITile Упорядочивает все дочерние окна в формате плитки.

Замечания

Чтобы создать полезное окно фрейма MDI для приложения, наследуйте класс.CMDIFrameWnd Добавьте переменные-члены в производный класс для хранения данных, относящихся к приложению. Реализуйте в производном классе функции-члены обработчика сообщений и схему сообщений, чтобы указать, что происходит, когда сообщения направляются в окно.

Можно создать окно фрейма MDI, вызвав функцию CFrameWndэлемента Create или LoadFrame.

Перед вызовом Create или LoadFrameнеобходимо создать объект окна кадра в куче с помощью оператора C++ new . Перед вызовом Create можно также зарегистрировать класс окна с помощью глобальной функции AfxRegisterWndClass , чтобы задать стили значков и классов для кадра.

Используйте функцию-член для Create передачи параметров создания кадра в качестве непосредственных аргументов.

LoadFrame требует меньше аргументов, чем Createи вместо этого извлекает большинство значений по умолчанию из ресурсов, включая подпись кадра, значок, таблицу акселератора и меню. Для доступа LoadFrameк ним все эти ресурсы должны иметь один и тот же идентификатор ресурса (например, IDR_MAINFRAME).

Хотя MDIFrameWnd он является производным, CFrameWndкласс окна кадра, производный от CMDIFrameWnd необходимости не объявляться с DECLARE_DYNCREATE.

Класс CMDIFrameWnd наследует большую часть своей реализации по умолчанию.CFrameWnd Подробный список этих функций см. в описании класса CFrameWnd . Класс CMDIFrameWnd имеет следующие дополнительные функции:

  • Окно кадра MDI управляет окном MDICLIENT, переместив его в сочетании с панелью управления. Окно клиента MDI является прямым родительским элементом дочерних окон фреймов MDI. Стили окон WS_HSCROLL и WS_VSCROLL, указанные в CMDIFrameWnd окне клиента MDI, а не в главном окне фрейма, чтобы пользователь смог прокрутить клиентную область MDI (например, в диспетчере программ Windows).

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

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

  • Окно фрейма MDI имеет обработчики по умолчанию для следующих стандартных команд меню окна:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

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

Не используйте оператор C++ delete для уничтожения окна фрейма. Вместо этого используйте CWnd::DestroyWindow. Реализация CFrameWnd приведет к удалению PostNcDestroy объекта C++ при уничтожении окна. Когда пользователь закрывает окно фрейма, обработчик по умолчанию OnClose вызывается DestroyWindow.

Дополнительные сведения см. в CMDIFrameWndразделе "Фрейм Windows".

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

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

Требования

Заголовок: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

Формирует объект CMDIFrameWnd.

CMDIFrameWnd();

Замечания

Вызовите функцию-членLoadFrame, Create чтобы создать видимое окно фрейма MDI.

Пример

// Create main MDI Frame window. CMainFrame is a CMDIFrameWnd-derived
// class. The default CFrameWnd::PostNcDestroy() handler will delete this
// object when destroyed.
CMainFrame *pMainFrame = new CMainFrame;

CMDIFrameWnd::CreateClient

Создает окно клиента MDI, которое управляет объектами CMDIChildWnd .

virtual BOOL CreateClient(
    LPCREATESTRUCT lpCreateStruct,
    CMenu* pWindowMenu);

Параметры

lpCreateStruct
Длинный указатель на структуру CREATESTRUCT .

pWindowMenu
Указатель на всплывающее меню окна.

Возвращаемое значение

Имеет ненулевое значение в случае успешного выполнения, иначе — 0.

Замечания

Эта функция-член должна вызываться, если переопределить функцию-член напрямую OnCreate .

Пример

// The code below is from winmdi.cpp. It shows how to
// call CMDIFrameWnd::CreateClient(). CMainFrame is a
// CMDIFrameWnd-derived class.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext * /*pContext*/)
{
   CMenu *pMenu = NULL;
   if (m_hMenuDefault == NULL)
   {
      // default implementation for MFC V1 backward compatibility
      pMenu = GetMenu();
      ASSERT(pMenu != NULL);
      // This is attempting to guess which sub-menu is the Window menu.
      // The Windows user interface guidelines say that the right-most
      // menu on the menu bar should be Help and Window should be one
      // to the left of that.
      int iMenu = pMenu->GetMenuItemCount() - 2;

      // If this assertion fails, your menu bar does not follow the guidelines
      // so you will have to override this function and call CreateClient
      // appropriately or use the MFC V2 MDI functionality.
      ASSERT(iMenu >= 0);
      pMenu = pMenu->GetSubMenu(iMenu);
      ASSERT(pMenu != NULL);
   }

   return CreateClient(lpcs, pMenu);
}

CMDIFrameWnd::CreateNewChild

Создает новое дочернее окно.

CMDIChildWnd* CreateNewChild(
    CRuntimeClass* pClass,
    UINT nResource,
    HMENU hMenu = NULL,
    HACCEL hAccel = NULL);

Параметры

pClass
Класс времени выполнения создаваемого дочернего окна.

nResource
Идентификатор общих ресурсов, связанных с дочерним окном.

hMenu
Меню дочернего окна.

hAccel
Акселератор дочернего окна.

Замечания

Используйте эту функцию для создания дочерних окон окна фрейма MDI.

Пример

// CMainFrame is a CMDIFrameWnd-derived class,
// OnNewDraw is a menu command handler,
// CDrawFrame is a CMDIChildWnd-derived class.
void CMainFrame::OnNewDraw()
{
   CreateNewChild(RUNTIME_CLASS(CDrawFrame), IDR_DRAW, m_hDrawMenu,
                  m_hDrawAccel);
}

CMDIFrameWnd::GetWindowMenuPopup

Вызовите эту функцию-член, чтобы получить дескриптор текущего всплывающего меню с именем "Окно" (всплывающее меню с элементами меню для управления окнами MDI).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Параметры

hMenuBar
Текущая строка меню.

Возвращаемое значение

Всплывающее меню окна, если оно существует; в противном случае ЗНАЧЕНИЕ NULL.

Замечания

Реализация по умолчанию ищет всплывающее меню, содержащее стандартные команды меню окна, такие как ID_WINDOW_NEW и ID_WINDOW_TILE_HORZ.

Переопределите эту функцию-член, если у вас есть меню "Окно", которое не использует идентификаторы стандартных команд меню.

Пример

// CMainFrame::OnActivateFirstMDIChild() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It looks for the caption of the first created MDI child window from
// the Window popup menu, and then activate the child window.
void CMainFrame::OnActivateFirstMDIChild()
{
   // Get handle to the Window pop-up menu.
   CMenu *menubar = GetMenu();
   CMenu *wmenu = CMenu::FromHandle(GetWindowMenuPopup(menubar->GetSafeHmenu()));
   if (wmenu == NULL)
      return;

   // Get the caption of the first created MDI child window.
   CString caption;
   if (!wmenu->GetMenuString(AFX_IDM_FIRST_MDICHILD, caption, MF_BYCOMMAND))
      return;

   // Get the actual name of the first created MDI child window by
   // getting rid of the number and space, e.g. "&1 MDI 1".
   int pos = caption.FindOneOf(_T(" "));
   if (pos == -1)
      return;

   caption = caption.Right(caption.GetLength() - (pos + 1));

   // Get the CWnd* of the first created MDI child window by comparing
   // the caption of each MDI child window in the MDI application.
   // Activate the first created MDI child window if found.
   CMDIChildWnd *child = MDIGetActive();
   do
   {
      CString str;
      child->GetWindowText(str);
      if (str == caption)
      {
         child->MDIActivate(); // or MDIActivate(child);
         break;
      }

      child = (CMDIChildWnd*)child->GetWindow(GW_HWNDNEXT);
   } while (child);
}

CMDIFrameWnd::MDIActivate

Активирует другое дочернее окно MDI.

void MDIActivate(CWnd* pWndActivate);

Параметры

pWndActivate
Указывает на дочернее окно MDI для активации.

Замечания

Эта функция-член отправляет сообщение WM_MDIACTIVATE как в активированное дочернее окно, так и в деактивированное дочернее окно.

Это то же сообщение, которое отправляется, если пользователь изменяет фокус на дочернее окно MDI с помощью мыши или клавиатуры.

Примечание.

Дочернее окно MDI активируется независимо от окна фрейма MDI. Когда кадр становится активным, дочернее окно, которое было активировано последней активацией, отправляется WM_NCACTIVATE сообщение для рисования активного кадра окна и строки заголовков, но не получает другое сообщение WM_MDIACTIVATE.

Пример

См. пример CMDIFrameWnd ::GetWindowMenuPopup.

CMDIFrameWnd::MDICascade

Упорядочивает все дочерние окна MDI в каскадном формате.

void MDICascade();
void MDICascade(int nType);

Параметры

nType
Указывает каскадный флаг. Можно указать только следующий флаг: MDITILE_SKIPDISABLED, что предотвращает каскадное отключение дочерних окон MDI.

Замечания

Первая версия MDICascadeбез параметров каскадирует все дочерние окна MDI, включая отключенные. Вторая версия необязательно не каскадно отключается дочерних окон MDI, если указано MDITILE_SKIPDISABLED для параметра nType .

Пример

// CMainFrame::OnWindowCommand() is a menu command handler for
// CMainFrame class, which is a CMDIFrameWnd-derived
// class. It handles menu commands for the Windows pop-up menu.
// Its entries in the message map are of the following form:
//    ON_COMMAND_EX(ID_WINDOW_ARRANGE, &CMainFrame::OnWindowCommand)
BOOL CMainFrame::OnWindowCommand(UINT nID)
{
   switch (nID)
   {
   case ID_WINDOW_ARRANGE: // For Window\Arrange Icons menu item, arrange
      MDIIconArrange();    // all minimized document child windows.
      break;

   case ID_WINDOW_CASCADE: // For Window\Cascade menu item, arrange
      MDICascade();        // all the MDI child windows in a cascade format.
      break;

   case ID_WINDOW_TILE_HORZ:       // For Window\Tile Horizontal menu item,
      MDITile(MDITILE_HORIZONTAL); // tile MDI child windows so that
      break;                       // one window appears above another.

   case ID_WINDOW_TILE_VERT:     // For Window\Tile Vertical menu item,
      MDITile(MDITILE_VERTICAL); // tile MDI child windows so that
      break;                     // one window appears beside another.
   }

   return TRUE;
}

CMDIFrameWnd::MDIGetActive

Извлекает текущее активное дочернее окно MDI, а также флаг, указывающий, развернут ли дочернее окно.

CMDIChildWnd* MDIGetActive(BOOL* pbMaximized = NULL) const;

Параметры

pbMaximized
Указатель на возвращаемое значение BOOL. Установите значение TRUE при возврате, если окно развернуто; в противном случае ЗНАЧЕНИЕ FALSE.

Возвращаемое значение

Указатель на активное дочернее окно MDI.

Пример

См. пример CMDIChildWnd ::MDIMaximize.

CMDIFrameWnd::MDIIconArrange

Упорядочивает все свернутые дочерние окна документа.

void MDIIconArrange();

Замечания

Это не влияет на дочерние окна, которые не свернуты.

Пример

См. пример cmDIFrameWnd ::MDICascade.

CMDIFrameWnd::MDIMaximize

Разворачивает указанное дочернее окно MDI.

void MDIMaximize(CWnd* pWnd);

Параметры

pWnd
Указывает на окно, чтобы развернуть его.

Замечания

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

Если еще одно дочернее окно MDI активируется при максимально активном дочернем окне MDI, Windows восстанавливает активное дочернее окно и разворачивает только что активированное дочернее окно.

Пример

См. пример CMDIChildWnd ::MDIMaximize.

CMDIFrameWnd::MDINext

Активирует дочернее окно сразу за активным дочерним окном и помещает текущее активное дочернее окно за всеми остальными дочерними окнами.

void MDINext();

Замечания

Если активное дочернее окно MDI в настоящее время развернуто, функция-член восстанавливает активного дочернего элемента и увеличивает только что активированный дочерний элемент.

Пример

// CMainFrame::OnActivateNextWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It activates the child window immediately behind the currently
// active child window and places the currently active child window
// behind all other child windows.
void CMainFrame::OnActivateNextWindow()
{
   MDINext();
}

CMDIFrameWnd::MDIPrev

Активирует предыдущее дочернее окно и помещает текущее активное дочернее окно сразу за ним.

void MDIPrev();

Замечания

Если активное дочернее окно MDI в настоящее время развернуто, функция-член восстанавливает активного дочернего элемента и увеличивает только что активированный дочерний элемент.

CMDIFrameWnd::MDIRestore

Восстанавливает дочернее окно MDI из развернутого или свернутого размера.

void MDIRestore(CWnd* pWnd);

Параметры

pWnd
Указывает на окно для восстановления.

Пример

См. пример для CMDIChildWnd::MDIRestore.

CMDIFrameWnd::MDISetMenu

Заменяет меню окна фрейма MDI, всплывающего меню окна или обоих элементов.

CMenu* MDISetMenu(
    CMenu* pFrameMenu,
    CMenu* pWindowMenu);

Параметры

pFrameMenu
Задает меню нового меню окна фрейма. Если значение NULL, меню не изменяется.

pWindowMenu
Задает меню нового всплывающего меню окна. Если значение NULL, меню не изменяется.

Возвращаемое значение

Указатель на меню фрейма, замененное этим сообщением. Указатель может быть временным. Его не требуется сохранять для дальнейшего использования.

Замечания

После вызова MDISetMenuприложение должно вызвать функцию CWnd члена DrawMenuBar для обновления строки меню.

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

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

Не вызывайте эту функцию-член, если вы используете платформу для управления дочерними окнами MDI.

Пример

// CMdiView::OnReplaceMenu() is a menu command handler for CMdiView
// class, which in turn is a CView-derived class. It loads a new
// menu resource and replaces the main application window's menu
// bar with this new menu.
void CMdiView::OnReplaceMenu()
{
   // Load a new menu resource named IDR_SHORT_MENU. m_hDefaultMenu is
   // a member variable of CMdiDoc class (a CDocument-derived class).
   // Its type is HMENU.
   CMdiDoc *pdoc = (CMdiDoc*)GetDocument();
   pdoc->m_hDefaultMenu =
       ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_SHORT_MENU));
   if (pdoc->m_hDefaultMenu == NULL)
      return;

   // Get the parent window of this view window. The parent window is
   // a CMDIChildWnd-derived class. We can then obtain the MDI parent
   // frame window using the CMDIChildWnd*. Then, replace the current
   // menu bar with the new loaded menu resource.
   CMDIFrameWnd *frame = ((CMDIChildWnd*)GetParent())->GetMDIFrame();
   frame->MDISetMenu(CMenu::FromHandle(pdoc->m_hDefaultMenu), NULL);
   frame->DrawMenuBar();
}

 

// GetDefaultMenu() is an undocumented virtual function for
// CDocument class. It allows the document to determine which
// menu to display. m_hDefaultMenu is of type HMENU. Its value
// is initialized to NULL either in the constructor or
// CDocument::OnNewDocument(). And the menu resource is destroyed
// in the destructor to avoid having too many menus loaded at once.
HMENU CMdiDoc::GetDefaultMenu()
{
   if (m_hDefaultMenu)
      return m_hDefaultMenu;

   return COleServerDoc::GetDefaultMenu();
}

// Initialize member variable(s) in the constructor. CMdiDoc is
// a CDocument-derived class.
CMdiDoc::CMdiDoc()
{
   // Use OLE compound files
   EnableCompoundFile();

   m_hDefaultMenu = NULL; // initialize to NULL
}

// Destroy menu resource in CMdiDoc's destructor. CMdiDoc is
// a CDocument-derived class.
CMdiDoc::~CMdiDoc()
{
   if (m_hDefaultMenu)
      ::DestroyMenu(m_hDefaultMenu);
}

CMDIFrameWnd::MDITile

Упорядочивает все дочерние окна в формате плитки.

void MDITile();
void MDITile(int nType);

Параметры

nType
Указывает флаг наливки. Этот параметр может быть одним из следующих флагов:

  • MDITILE_HORIZONTAL дочерние окна MDI плиток, чтобы одно окно отображалось над другим.

  • MDITILE_SKIPDISABLED запрещает отключенные дочерние окна MDI от плитки.

  • MDITILE_VERTICAL дочерние окна MDI плиток, чтобы одно окно отображалось рядом с другим.

Замечания

Первая версия MDITile, без параметров, плитки окон вертикально в Windows версии 3.1 и более поздних версий. Вторая версия плиток окна вертикально или горизонтально в зависимости от значения параметра nType .

Пример

См. пример cmDIFrameWnd ::MDICascade.

См. также

Пример MDI MFC
Пример MDIDOCVW MFC
Пример SNAPVW MFC
Класс CFrameWnd
Диаграмма иерархии
Класс CWnd
Класс CMDIChildWnd