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
を使用してください 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 クラス