CMDIFrameWnd クラス

Windows のマルチ ドキュメント インターフェイス (MDI: Multiple Document Interface) のフレーム ウィンドウの機能が用意されています。さらに、ウィンドウを管理するメンバーも用意されています。

構文

class CMDIFrameWnd : public CFrameWnd

メンバー

パブリック コンストラクター

名前 説明
CMDIFrameWnd::CMDIFrameWnd CMDIFrameWnd を構築します。

パブリック メソッド

名前 説明
CMDIFrameWnd::CreateClient この CMDIFrameWndの Windows MDICLIENT ウィンドウを作成します。 CWndOnCreate メンバー関数によって呼び出されます。
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 フレーム ウィンドウを構築するには、CFrameWndCreate または LoadFrame メンバー関数を呼び出します。

CreateまたはLoadFrameを呼び出す前に、C++ new 演算子を使用して、ヒープ上にフレーム ウィンドウ オブジェクトを構築する必要があります。 Createを呼び出す前に、ウィンドウ クラスを AfxRegisterWndClass グローバル関数に登録して、フレームのアイコンとクラス スタイルを設定することもできます。

Create メンバー関数を使用して、フレームの作成パラメーターを即時引数として渡します。

LoadFrame は、 Createよりも少ない引数を必要とします。代わりに、フレームのキャプション、アイコン、アクセラレータ テーブル、メニューなど、リソースから既定値の大部分を取得します。 LoadFrameによってアクセスするには、これらすべてのリソースに同じリソース ID (たとえば、IDR_MAINFRAME) が必要です。

MDIFrameWndCFrameWndから派生していますが、CMDIFrameWndから派生したフレーム ウィンドウ クラスをDECLARE_DYNCREATEで宣言する必要はありません。

CMDIFrameWnd クラスは、既定の実装の多くを CFrameWnd から継承します。 これらの機能の詳細な一覧については、 CFrameWnd クラスの説明を参照してください。 CMDIFrameWnd クラスには、次の追加機能があります。

  • MDI フレーム ウィンドウは、MDICLIENT ウィンドウを管理し、コントロール バーと組み合わせて位置を変更します。 MDI クライアント ウィンドウは、MDI 子フレーム ウィンドウの直接の親です。 CMDIFrameWndで指定されたWS_HSCROLLおよびWS_VSCROLL ウィンドウ スタイルは、メイン フレーム ウィンドウではなく MDI クライアント ウィンドウに適用されるため、ユーザーは (Windows プログラム マネージャーのように) MDI クライアント領域をスクロールできます。

  • 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 を使用してください PostNcDestroyCFrameWnd実装では、ウィンドウが破棄されたときに 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 以外を返します。それ以外の場合は 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
子ウィンドウに関連付けられている共有リソースの ID。

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などの標準のウィンドウ メニュー コマンドを含むポップアップ メニューが検索されます。

標準メニュー コマンド ID を使用しないウィンドウ メニューがある場合は、このメンバー関数をオーバーライドします。

// 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 子ウィンドウにフォーカスを変更した場合に送信されるメッセージと同じです。

Note

MDI 子ウィンドウは、MDI フレーム ウィンドウとは別にアクティブ化されます。 フレームがアクティブになると、最後にアクティブ化された子ウィンドウに、アクティブなウィンドウ フレームとキャプション バーを描画する WM_NCACTIVATE メッセージが送信されますが、別のWM_MDIACTIVATE メッセージは受信されません。

CMDIFrameWnd::GetWindowMenuPopup の例を参照してください。

CMDIFrameWnd::MDICascade

すべての MDI 子ウィンドウをカスケード形式で配置します。

void MDICascade();
void MDICascade(int nType);

パラメーター

nType
カスケード フラグを指定します。 指定できるのは、無効な MDI 子ウィンドウがカスケードされないようにするMDITILE_SKIPDISABLEDフラグのみです。

解説

パラメーターのない MDICascadeの最初のバージョンでは、無効になっているものも含め、すべての MDI 子ウィンドウがカスケードされます。 nType パラメーターにMDITILE_SKIPDISABLEDを指定した場合、2 番目のバージョンでは、必要に応じて無効な 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を呼び出した後、アプリケーションはメニュー バーを更新するために、CWndDrawMenuBar メンバー関数を呼び出す必要があります。

この呼び出しは、ウィンドウのポップアップ メニューを置き換える場合、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 1 つのウィンドウが別のウィンドウの上に表示されるように MDI 子ウィンドウをタイルします。

  • MDITILE_SKIPDISABLED 無効な MDI 子ウィンドウがタイル化されないようにします。

  • MDITILE_VERTICAL 1 つのウィンドウが別のウィンドウの横に表示されるように、MDI 子ウィンドウをタイルします。

解説

パラメーターのない最初のバージョンの MDITileは、Windows バージョン 3.1 以降でウィンドウを垂直方向にタイル表示します。 2 番目のバージョンでは、 nType パラメーターの値に応じて、ウィンドウが垂直方向または水平方向にタイル表示されます。

CMDIFrameWnd::MDICascade の例を参照してください。

関連項目

MFC サンプル MDI
MFC サンプル MDIDOCVW
MFC サンプル SNAPVW
CFrameWnd クラス
階層図
CWnd クラス
CMDIChildWnd クラス