CMDIChildWnd クラス

ウィンドウ管理用のメンバーも含めて、Windows のマルチ ドキュメント インターフェイス (MDI: multiple document interface) の子ウィンドウの機能が用意されています。

構文

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 子ウィンドウを構築するには、次の 3 つの方法があります。

  • Createを使用して直接構築します。

  • LoadFrameを使用して直接構築します。

  • ドキュメント テンプレートを使用して間接的に構築します。

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

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

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

CMDIChildWnd オブジェクトにビューとドキュメントが含まれている場合、プログラマが直接作成するのではなく、フレームワークによって間接的に作成されます。 CDocTemplate オブジェクトは、フレームの作成、含まれているビューの作成、および適切なドキュメントへのビューの接続を調整します。 CDocTemplate コンストラクターのパラメーターは、関係する 3 つのクラス (ドキュメント、フレーム、ビュー) のCRuntimeClassを指定します。 CRuntimeClass オブジェクトは、ユーザーが指定した場合に新しいフレームを動的に作成するためにフレームワークによって使用されます (たとえば、File New コマンドまたは MDI Window New コマンドを使用)。

上記のRUNTIME_CLASSメカニズムが正しく機能するためには、 CMDIChildWnd から派生したフレーム ウィンドウ クラスをDECLARE_DYNCREATEで宣言する必要があります。

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

  • CMultiDocTemplate クラスと組み合わせて、同じドキュメント テンプレートの複数のCMDIChildWnd オブジェクトが同じメニューを共有し、Windows システム リソースを保存します。

  • 現在アクティブな MDI 子ウィンドウ メニューは、MDI フレーム ウィンドウのメニューを完全に置き換え、現在アクティブな MDI 子ウィンドウのキャプションが MDI フレーム ウィンドウのキャプションに追加されます。 MDI フレーム ウィンドウと組み合わせて実装される MDI 子ウィンドウ関数のその他の例については、 CMDIFrameWnd クラスの説明を参照してください。

C++ delete 演算子を使用してフレーム ウィンドウを破棄しないでください。 代わりに CWnd::DestroyWindow を使用してください PostNcDestroyCFrameWnd実装では、ウィンドウが破棄されたときに 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 クラス ( WNDCLASS 構造体) に名前を付ける null で終わる文字列を指します。 クラス名には、 AfxRegisterWndClass グローバル関数に登録されている任意の名前を指定できます。 標準 CMDIChildWndの場合は NULL にする必要があります。

lpszWindowName
ウィンドウ名を表す null で終わる文字列を指します。 タイトル バーのテキストとして使用されます。

dwStyle
ウィンドウの style 属性を指定します。 WS_CHILD スタイルが必要です。

rect
ウィンドウのサイズと位置を格納します。 rectDefault値を使用すると、Windows は新しいCMDIChildWndのサイズと位置を指定できます。

pParentWnd
ウィンドウの親を指定します。 NULL の場合は、メイン アプリケーション ウィンドウが使用されます。

pContext
CCreateContext 構造体を指定します。 このパラメーターは、NULL でもかまいません。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 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

このコード例では、CMDIChildWndから派生したクラスである CHelloWndCreate メソッドを呼び出します。

// 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
}

この例では、CHelloWnd クラスのCreate実装を示します。

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 から削除された 2 つの親であり、 CMDIChildWnd オブジェクトを管理する MDICLIENT 型のウィンドウの親です。 GetParent メンバー関数を呼び出して、CMDIChildWnd オブジェクトの即時 MDICLIENT 親を一時的な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 クラス