分享方式:


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直接建構它。

  • 透過文件範本間接建構它。

在呼叫 CreateLoadFrame之前,您必須使用 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

繼承階層架構

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
指向將 Windows 類別命名為 Null 終止的字元字串( WNDCLASS 結構)。 類別名稱可以是向 AfxRegisterWndClass 全域函式註冊的任何名稱。 標準應為 CMDIChildWndNULL。

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 類別