CMDIChildWnd 類別
提供 Windows 多重文件介面 (MDI) 子視窗的功能,以及管理視窗的成員。
語法
class CMDIChildWnd : public CFrameWnd
成員
公用建構函式
名稱 | 描述 |
---|---|
CMDIChildWnd::CMDIChildWnd | 建構 CMDIChildWnd 物件。 |
公用方法
名稱 | 描述 |
---|---|
CMDIChildWnd::Create | 建立與 CMDIChildWnd 對象相關聯的 Windows MDI 子視窗。 |
CMDIChildWnd::GetMDIFrame | 傳回 MDI 用戶端視窗的父 MDI 框架。 |
CMDIChildWnd::MDIActivate | 啟動此 MDI 子視窗。 |
CMDIChildWnd::MDIDestroy | 終結此 MDI 子視窗。 |
CMDIChildWnd::MDIMaximize | 最大化這個 MDI 子視窗。 |
CMDIChildWnd::MDIRestore | 從最大化或最小化的大小還原此 MDI 子視窗。 |
CMDIChildWnd::SetHandles | 設定功能表和快捷鍵資源的句柄。 |
備註
MDI 子視窗看起來很像一般框架視窗,不同之處在於 MDI 子視窗會出現在 MDI 框架視窗內,而不是在桌面上。 MDI 子視窗沒有自己的功能表欄,而是共用 MDI 框架視窗的功能表。 架構會自動變更 MDI 框架功能表,以代表目前作用中的 MDI 子視窗。
若要為您的應用程式建立有用的 MDI 子視窗,請從 CMDIChildWnd
衍生類別。 將成員變數新增至衍生類別,以儲存應用程式特定的數據。 實作訊息處理常式成員函式,和衍生類別中對應的訊息,以指定訊息被導向至視窗時會發生什麼事。
建構 MDI 子視窗的方法有三種:
使用
Create
直接建構它。使用
LoadFrame
直接建構它。透過文件範本間接建構它。
在呼叫 Create
或 LoadFrame
之前,您必須使用 C++ new
運算子,在堆積上建構框架窗口物件。 呼叫 Create
之前,您也可以使用 AfxRegisterWndClass 全域函式註冊窗口類別,以設定框架的圖示和類別樣式。
Create
使用成員函式,將框架的建立參數當做立即自變數傳遞。
LoadFrame
自變數比 Create
少,而是從資源擷取大部分的預設值,包括框架的標題、圖示、快捷鍵數據表和功能表。 若要存取 LoadFrame
,所有這些資源都必須具有相同的資源標識元(例如,IDR_MAINFRAME)。
CMDIChildWnd
當物件包含檢視和檔時,架構會間接建立它們,而不是由程式設計人員直接建立。 物件 CDocTemplate
會協調框架的建立、建立包含的檢視,以及檢視與適當文件的連接。 建構函式的參數 CDocTemplate
會指定 CRuntimeClass
涉及的三個類別 (檔案、框架和檢視) 的 。 CRuntimeClass
架構會使用 物件,在使用者指定時動態建立新的框架(例如,使用 [檔案新增] 命令或 [MDI 視窗新] 命令)。
衍生自 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
,請參閱 Frame 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
指向將 Windows 類別命名為 Null 終止的字元字串( WNDCLASS 結構)。 類別名稱可以是向 AfxRegisterWndClass 全域函式註冊的任何名稱。 標準應為 CMDIChildWnd
NULL。
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
的兩個父系,而且是管理 CMDIChildWnd
物件的 MDICLIENT 類型視窗的父代。 呼叫 GetParent 成員函式,將物件的直接 MDICLIENT 父系傳回CMDIChildWnd
為暫存CWnd
指標。
範例
請參閱 CMDIFrameWnd::MDISetMenu 的範例。
CMDIChildWnd::MDIActivate
呼叫此成員函式,以獨立於 MDI 框架視窗來啟動 MDI 子視窗。
void MDIActivate();
備註
當畫面變成使用中時,最後一次啟動的子視窗也會啟動。
範例
請參閱 CMDIFrameWnd::GetWindowMenuPopup 的範例。
CMDIChildWnd::MDIDestroy
呼叫此成員函式以終結 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 子視窗物件所使用的功能表和快速鍵資源。
另請參閱
MFC 範例 MDI
MFC 範例 MDIDOCVW
MFC 範例 SNAPVW
CFrameWnd 類別
階層架構圖表
CWnd 類別
CMDIFrameWnd 類別