共用方式為


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 框架視窗。

在呼叫 CreateLoadFrame 之前,您必須使用 C++ new 運算子在堆積上建構框架視窗物件。 呼叫 Create 之前,您也可以使用 AfxRegisterWndClass 全域函式註冊視窗類別,以設定框架的圖示和類別樣式。

Create使用成員函式,將框架的建立參數當做立即引數傳遞。

LoadFrame引數比 Create 少,而是從資源擷取大部分的預設值,包括框架的標題、圖示、快速鍵資料表和功能表。 若要存取 LoadFrame ,所有這些資源都必須具有相同的資源識別碼(例如,IDR_MAINFRAME)。

雖然 MDIFrameWnd 衍生自 ,但衍生自 CFrameWndCMDIFrameWnd 的框架視窗類別不需要使用 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。 當視窗終結時,的 CFrameWndPostNcDestroy 實作將會刪除 C++ 物件。 當使用者關閉框架視窗時,預設 OnClose 處理常式會呼叫 DestroyWindow

如需 的詳細資訊 CMDIFrameWnd ,請參閱 Frame Windows

繼承階層架構

CObject

CCmdTarget

CWnd

CFrameWnd

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_MDIACTI加值稅E訊息傳送至正在啟動的 子視窗和停用的子視窗。

如果使用者使用滑鼠或鍵盤將焦點變更為 MDI 子視窗,就會傳送這個訊息。

注意

MDI 子視窗獨立于 MDI 框架視窗啟動。 當框架變成使用中時,上次啟動的 子視窗會傳送 WM_NCACTI加值稅E訊息來繪製活動視窗框架和標題列,但不會收到另一則WM_MDIACTI加值稅E訊息。

範例

請參閱 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 類別