CMDIChildWnd クラス

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

構文

class CMDIChildWnd : public CFrameWnd

メンバー

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

名前 説明
CMDIChildWnd::CMDIChildWnd CMDIChildWnd オブジェクトを構築します。

パブリック メソッド

名前 説明
CMDIChildWnd::Create オブジェクトに関連付けられている Windows MDI 子ウィンドウを CMDIChildWnd 作成します。
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

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

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

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

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

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

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

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

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

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

C++ delete 演算子を使用してフレーム ウィンドウを破棄しないでください。 CWnd::DestroyWindow を代わりに使用します。 の実装PostNcDestroyではCFrameWnd、ウィンドウが破棄されたときに C++ オブジェクトが削除されます。 ユーザーがフレーム ウィンドウを閉じると、既定 OnClose のハンドラーが呼び出 DestroyWindowします。

詳細についてはCMDIChildWnd、「フレーム ウィンドウ」を参照してください

継承階層

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
ウィンドウ スタイル 属性を指定します。 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

このコード例では、 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する MDICLIENT 型のウィンドウの親である 2 つの親からCMDIChildWnd削除されます。 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 クラス