MDI チャイルド ウィンドウの振る舞いを実装しているクラスです。
通常、このクラスを継承して、独自のウィンドウの振る舞いを実装するクラスを作成します。
その際、テンプレート引数 T にはそのクラス自身を渡します。
このように、基本クラスのテンプレート引数に派生クラス自身を渡して継承することは、CRTP (Curiously Recurring Template Pattern : 奇妙に再帰したテンプレート パターン) と呼ばれます。
通常、このクラスを利用して MDI チャイルド ウィンドウを作成するには、次のクラスを作成する必要があります。
・CMDIFrameWindowImpl クラスを継承して MDI フレーム ウィンドウの振る舞いを実装した独自のクラス(以下、MDI フレーム ウィンドウ実装クラス)
・このクラスを継承した独自のクラス(以下、MDI チャイルド ウィンドウ実装クラス)
そして、MDI チャイルド ウィンドウ実装クラスから new 演算子を利用して新規にオブジェクトを生成し、Create メソッドまたは CreateEx メソッドを呼び出します。
その際、親ウィンドウとして MDI クライアント ウィンドウを指定しなければならないため、MDI フレーム ウィンドウ実装クラスの m_hWndMDIClient メンバをメソッドに渡します。
テンプレート引数 TBase は、既定では CMDIWindow です。TWinTraits は、ATL::CMDIChildWinTraits です。
これらは、ウィンドウの基本的な振る舞い、およびウィンドウの特徴(スタイル)を定義するものです。
通常これらを変更する必要はありません。
つまり、特別な場合でない限り、テンプレート引数には T を指定するのみです。
CMDIWindow
CMDIFrameWindowImpl
タイプ : テンプレート
継承クラス : CFrameWindowImplBase
ヘッダ : atlframe.h
Create
ウィンドウを作成します。
CreateEx
共通リソース ID によって、ウィンドウを作成します。
CreateSimpleToolBar
ウィンドウ上にツール バーを作成します。
UpdateClientEdge
MDI クライアント ウィンドウの縁を必要に応じて再描画します。
OnChevronPushed
RBN_CHEVRONPUSHED 通知のハンドラです。
OnDestroy
WM_DESTROY メッセージのハンドラです。
OnMDIActivate
WM_MDIACTIVATE メッセージのハンドラです。
OnMenuSelect
WM_MENUSELECT メッセージのハンドラです。
OnMouseActivate
WM_MOUSEACTIVATE メッセージのハンドラです。
OnReBarAutoSize
RBN_AUTOSIZE 通知のハンドラです。
OnSize
WM_SIZE メッセージのハンドラです。
OnWindowPosChanged
WM_WINDOWPOSCHANGED メッセージのハンドラです。
ウィンドウを作成します。
HWND hWndParent
親ウィンドウを指定します。親ウィンドウは、必ず MDI クライアント ウィンドウでなければなりません。
ATL::_U_RECT rect = NULL
ウィンドウの位置情報を示す RECT 構造体を指定します。既定では NULL で、TBase::rcDefault になります。
LPCTSTR szWindowName = NULL
ウィンドウの名前を指定します。既定では NULL です。
DWORD dwStyle = 0
ウィンドウ スタイルを指定します。既定では 0 で、TWinTraits の持つスタイルになります。
DWORD dwExStyle = 0
拡張ウィンドウ スタイルを指定します。既定では 0 で、TWinTraits の持つスタイルになります。
UINT nMenuID = 0
メニューのリソース ID を指定します。既定では 0 です。
LPVOID lpCreateParam = NULL
ユーザー定義のパラメータを指定します。既定では NULL です。
作成に成功した場合、ウィンドウ ハンドルを返します。
このメソッドは、現在アクティブな MDI チャイルド ウィンドウが最大化されている場合、作成したウィンドウも最大化します。
共通リソース ID によって、ウィンドウを作成します。
HWND hWndParent
親ウィンドウを指定します。親ウィンドウは、必ず MDI クライアント ウィンドウでなければなりません。
ATL::_U_RECT rect = NULL
ウィンドウの位置情報を示す RECT 構造体を指定します。既定では NULL で、TBase::rcDefault になります。
LPCTSTR lpcstrWindowName = NULL
ウィンドウの名前を指定します。既定では NULL で、共通リソース ID によって読み込まれた文字列リソースになります。
DWORD dwStyle = 0
ウィンドウ スタイルを指定します。既定では 0 で、TWinTraits の持つスタイルになります。
DWORD dwExStyle = 0
拡張ウィンドウ スタイルを指定します。既定では 0 で、TWinTraits の持つスタイルになります。
LPVOID lpCreateParam = NULL
ユーザー定義のパラメータを指定します。既定では NULL です。
作成に成功した場合、ウィンドウ ハンドルを返します。
共通リソース ID は、DECLARE_FRAME_WND_CLASS マクロ、または DECLARE_FRAME_WND_CLASS_EX マクロで定義します。
これによって、ウィンドウの名前、メニュー、アクセラレータ キーがこのメソッドで自動的に設定されます。
ウィンドウ上にツール バーを作成します。
UINT nResourceID = 0
リソース ID を指定します。既定では 0 で、共通リソース ID になります。
DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE
ウィンドウ スタイルを指定します。既定では ATL_SIMPLE_TOOLBAR_STYLE です。
UINT nID = ATL_IDW_TOOLBAR
ID を指定します。既定では ATL_IDW_TOOLBAR です。
作成に成功したかどうかを返します。
作成に成功した場合、m_hWndToolBar にウィンドウ ハンドルが格納されます。
MDI クライアント ウィンドウの縁を必要に応じて再描画します。
LPRECT lpRect = NULL
更新された MDI クライアント ウィンドウのクライアント領域が格納される RECT 構造体を指定します。既定では NULL です。
再描画を行ったかどうかを返します。
このメソッドは、OnWindowPosChanged ハンドラ、および OnDestroy ハンドラが呼び出します。通常呼び出す必要はありません。
このメソッドは、自ウィンドウの拡張スタイルに WS_EX_CLIENTEDGE フラグが設定されておらず、かつ最大化された状態でアクティブである場合、MDI クライアント ウィンドウは WS_EX_CLIENTEDGE スタイルを持つべきでないと判断します。
上記の条件が一つでも満たされない場合は、WS_EX_CLIENTEDGE スタイルを持つべきであると判断します。
そして、その結果が今まで持っていた拡張スタイルと異なっていた場合にのみ、MDI クライアント ウィンドウの縁を再描画します。
RBN_CHEVRONPUSHED 通知のハンドラです。
int /*idCtrl*/
コントロールの ID です。このハンドラでは使用されません。
LPNMHDR pnmh
NMHDR 構造体へのポインタです。
BOOL& bHandled
メッセージを処理したかどうかを示します。
メニューを表示した場合、0 を返します。表示の準備に失敗した場合、1 を返します。
WM_DESTROY メッセージのハンドラです。
UINT /*uMsg*/
WM_DESTROY メッセージです。このハンドラでは使用されません。
WPARAM /*wParam*/
メッセージに付加されたパラメータです。このハンドラでは使用されません。
LPARAM /*lParam*/
メッセージに付加されたパラメータです。このハンドラでは使用されません。
BOOL& bHandled
メッセージを処理したかどうかを示します。
常に 1 を返します。
このハンドラは、m_hMenu メンバが有効である場合にそれを破棄し、UpdateClientEdge メソッドを呼び出します。
WM_MDIACTIVATE メッセージのハンドラです。
UINT /*uMsg*/
WM_MDIACTIVATE メッセージです。このハンドラでは使用されません。
WPARAM /*wParam*/
メッセージに付加されたパラメータです。このハンドラでは使用されません。
LPARAM lParam
メッセージに付加されたパラメータです。
BOOL& bHandled
メッセージを処理したかどうかを示します。
常に 1 を返します。
このハンドラは、m_hWnd メンバのウィンドウ(自分自身が管理しているウィンドウ)がアクティブにされようとしており、かつ m_hMenu メンバが有効である場合、CMDIWindow クラスの SetMDIFrameMenu メソッドを呼び出して MDI フレーム ウィンドウにメニューを設定します。
また、アクティブな MDI チャイルド ウィンドウが存在しなくなった場合、MDI フレーム ウィンドウに対してそれ自身が持っているメニュー(CMDIWindow クラスの m_hMenu メンバ)を新しいメニューに設定するよう通知する目的で、MDI フレーム ウィンドウに WM_MDISETMENU メッセージを送信します。
WM_MENUSELECT メッセージのハンドラです。
UINT uMsg
WM_MENUSELECT メッセージです。
WPARAM wParam
メッセージに付加されたパラメータです。
LPARAM lParam
メッセージに付加されたパラメータです。
BOOL& /*bHandled*/
メッセージを処理したかどうかを示します。このハンドラでは使用されません。
SendMessage API の戻り値を返します。
このハンドラは、MDI フレーム ウィンドウに同じ内容のメッセージを送信し、その戻り値を返します。
WM_MOUSEACTIVATE メッセージのハンドラです。
UINT uMsg
WM_MOUSEACTIVATE メッセージです。
WPARAM wParam
メッセージに付加されたパラメータです。
LPARAM lParam
メッセージに付加されたパラメータです。
BOOL& /*bHandled*/
メッセージを処理したかどうかを示します。このハンドラでは使用されません。
MDI フレーム ウィンドウがこのメッセージを処理した結果を、CFrameWindowImplBase クラスの DefWindowProc メソッドの戻り値を介して返します。
このハンドラは、CFrameWindowImplBase クラスの DefWindowProc メソッドを呼び出して MDI フレーム ウィンドウにこのメッセージの処理を依頼し、その戻り値を返します。
DefWindowProc メソッドの戻り値が MA_ACTIVE または MA_ACTIVEANDEAT であった場合、CMDIWindow クラスの MDIActivate メソッドを呼び出して m_hWnd メンバのウィンドウをアクティブにします。
RBN_AUTOSIZE 通知のハンドラです。
int /*idCtrl*/
コントロールの ID です。このハンドラでは使用されません。
LPNMHDR /*pnmh*/
NMHDR 構造体へのポインタです。このハンドラでは使用されません。
BOOL& /*bHandled*/
メッセージを処理したかどうかを示します。このハンドラでは使用されません。
常に 0 を返します。
このハンドラは、派生クラスがオーバーライドしていない限り、CFrameWindowImplBase クラスの UpdateLayout メソッドを呼び出します。
WM_SIZE メッセージのハンドラです。
UINT uMsg
WM_SIZE メッセージです。
WPARAM wParam
メッセージに付加されたパラメータです。
LPARAM lParam
メッセージに付加されたパラメータです。
BOOL& /*bHandled*/
メッセージを処理したかどうかを示します。このハンドラでは使用されません。
常に 0 を返します。
このハンドラは、子ウィンドウのために CFrameWindowImplBase クラスの DefWindowProc メソッドを呼び出します。
また、ウィンドウが最小化されていない場合において、派生クラスがオーバーライドしていない限り、CFrameWindowImplBase クラスの UpdateLayout メソッドを呼び出します。
WM_WINDOWPOSCHANGED メッセージのハンドラです。
UINT /*uMsg*/
WM_WINDOWPOSCHANGED メッセージです。このハンドラでは使用されません。
WPARAM /*wParam*/
メッセージに付加されたパラメータです。このハンドラでは使用されません。
LPARAM lParam
メッセージに付加されたパラメータです。
BOOL& bHandled
メッセージを処理したかどうかを示します。
常に 1 を返します。
このメソッドは、ウィンドウのサイズが変更され、UpdateClientEdge メソッドが NULL でない値を返し、かつウィンドウが最大化された場合、AdjustWindowRectEx API を呼び出してウィンドウに必要な領域を計算し、lParam の指す WINDOWPOS 構造体に値を設定します。
注 : WM_WINDOWPOSCHANGED メッセージの lParam が指す WINDOWPOS 構造体は書き換えても何ら影響を及ぼしませんので、このコードは実質無意味です。
もしかしたら WM_WINDOWPOSCHANGING メッセージと混同されているのかもしれません。
ページの先頭へ戻る
リファレンスへ戻る
WTL へ戻る
トップ ページへ戻る