CMDIFrameWnd 類別
提供 Windows 多重文件介面 (MDI) 框架視窗的功能,以及管理視窗的成員。
語法
class CMDIFrameWnd : public CFrameWnd
成員
公用建構函式
名稱 | 描述 |
---|---|
CMDIFrameWnd::CMDIFrameWnd | 建構 CMDIFrameWnd 。 |
公用方法
名稱 | 描述 |
---|---|
CMDIFrameWnd::CreateClient | 為此 CMDIFrameWnd 建立 Windows MDICLIENT 視窗。 由 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
衍生類別。 將成員變數新增至衍生類別,以儲存應用程式特定的數據。 實作訊息處理常式成員函式,和衍生類別中對應的訊息,以指定訊息被導向至視窗時會發生什麼事。
您可以呼叫 的 Create 或 LoadFrame 成員函 CFrameWnd
式,以建構 MDI 框架視窗。
在呼叫 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 子框架視窗的直接父代。 在 上
CMDIFrameWnd
指定的WS_HSCROLL和WS_VSCROLL視窗樣式會套用至 MDI 用戶端視窗,而不是主框架視窗,讓使用者可以捲動 MDI 工作區(例如在 Windows Program Manager 中)。當沒有作用中的 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
,請參閱 Frame Windows。
繼承階層架構
CMDIFrameWnd
需求
標題: afxwin.h
CMDIFrameWnd::CMDIFrameWnd
建構 CMDIFrameWnd
物件。
CMDIFrameWnd();
備註
Create
呼叫 或 LoadFrame
成員函式,以建立可見的 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
建立管理 CMDIChildWnd
物件的 MDI 用戶端視窗。
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
呼叫此成員函式,以取得目前名為 「Window」 之快捷功能表的句柄(具有 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 子視窗,包括已停用的子視窗。 如果您為 nType 參數指定MDITILE_SKIPDISABLED,則第二個版本選擇性地不會串聯停用的 MDI 子視窗。
範例
// 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 的範例。
另請參閱
MFC 範例 MDI
MFC 範例 MDIDOCVW
MFC 範例 SNAPVW
CFrameWnd 類別
階層架構圖表
CWnd 類別
CMDIChildWnd 類別