Класс 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".
Иерархия наследования
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