ホームに戻る
 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 で元のプロシージャを呼びディフォルトの処理をさせる。

inserted by FC2 system