ホームに戻る
7、ウィンドウ間通信
基本的にウィンドウはメインウィンドウを最上の親とし、
ツリー状に親を持つべきである。
子から親は GetParent を用いて親ウィンドウを得ることができ、
親は子ウィンドウの ID を用いて子ウィンドウを識別できる。
メッセージ処理は新たにウィンドウクラスを登録するか、
別のプロシージャへ分離することによって新たなプロシージャを作成できる。
プロシージャの分離はサブクラス化とも呼ばれる。
規模が大きくなるとプロシージャの分離は必須にならざるを得ない。
親ウィンドウのハンドルを得る
HWND GetParent(
HWND hWnd // 子ウィンドウのハンドル
);
親ウィンドウのハンドルを返す。
失敗時には NULL を返す。
親ウィンドウと子ウィンドウの ID から子ウィンドウのハンドルを得る
HWND GetDlgItem(
HWND hDlg, // 親ウィンドウのハンドル
int nIDDlgItem // 子ウィンドウの ID
);
子ウィンドウの ID は任意の 32 ビット整数値。
ID は CreateWindow の第9引数で登録する。
子ウィンドウのメッセージを取得する
新たに子ウィンドウにウィンドウクラスを割り当てる場合は、
割り当てられたウィンドウクラスのプロシージャで取得する。
親ウィンドウのウィンドウクラスを使用する場合は、
親のプロシージャから WM_COMMAND メッセージを拾う。
wParam の下位ワードが子ウィンドウの ID で、
lParam が子ウィンドウのハンドルである。
既に登録されているボタンやエディットからプロシージャを分離
LONG SetWindowLong(
HWND hWnd, // ウィンドウハンドル
int nIndex, // 変更するデータの指定
LONG dwNewLong // 新しい値
);
nIndex:GWL_WNDPROC を指定。
dwNewLong:新しいプロシージャ
OldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)NewProc);
戻り値はもともとあった古いプロシージャ。
失敗すると 0 が返る。
元に戻す場合、
SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)OldProc);
ディフォルトの処理
LRESULT CallWindowProc(
WNDPROC lpPrevWndFunc, // 元のウィンドウプロシージャ
HWND hWnd, // ウィンドウのハンドル
UINT Msg, // メッセージ
WPARAM wParam, // メッセージの最初のパラメータ
LPARAM lParam // メッセージの 2 番目のパラメータ
);
新しいプロシージャで処理をしなかった場合は、
CallWindowProc で元のプロシージャを呼びディフォルトの処理をさせる。