ウィンドウ管理用のメンバーも含めて、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 を使用してください PostNcDestroyのCFrameWnd実装では、ウィンドウが破棄されたときに C++ オブジェクトが削除されます。 ユーザーがフレーム ウィンドウを閉じると、既定の OnClose ハンドラーは DestroyWindowを呼び出します。
CMDIChildWndの詳細については、「Frame Windows」を参照してください。
継承階層
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から派生したクラスである CHelloWnd の Create メソッドを呼び出します。
// 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 クラス