- ベストアンサー
MDI frame_windowのsize変更後にMSGが届かない
- Windowsプログラミングにおいて、MDIのフレームウィンドウのサイズを変更すると、ダブルクリックのメッセージが届かなくなる問題についての質問です。
- フレームウィンドウのサイズを変更してしまうと、クライアントウィンドウのダブルクリックによるMDI子ウィンドウの生成ができなくなります。
- ダブルクリックのメッセージが届かなくなる理由について詳しくご教示いただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 何となく想像がつくのですが、MDIフレーム側のプロシージャでWM_LBUTTONDBLCLKメッセージを処理しているのではないでしょうか。 メッセージが来なくなったのは、リサイズされた時にMDIクライアントがサイズ調整されてMDIフレームのクライアント領域に覆いかぶさった為だと思います。 MDIフレーム→MDIクライアント→MDIチャイルド(複数)と言う構成になるので、MDIクライアント側のプロシージャ側で処理すれば出来るのではないでしょうか。 上記URLで言えば、 hWndClient = CreateWindow("MDICLIENT", NULL, ...) で作成しているhWndClientのプロシージャ内でWM_LBUTTONDBLCLKメッセージを処理すると言う事です。 また、MDIクライアントはシステム側に登録されているウィンドウですので、プロシージャをフックする必要があります。 実行していないのですが、以下のような感じでしょうか。 static WNDPROC _S_wndProcMDIClientOrg = NULL; LRESULT CALLBACK WndProcMDIClient(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_LBUTTONDBLCLK: { //此処でMDIチャイルドを作成する break; } } return ::CallWindowProc(_S_wndProcMDIClientOrg, hWnd, uMsg, wParam, lParam); } //MDIフレーム側 LRESULT CALLBACK WndProcMDIFrame(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; CLIENTCREATESTRUCT ccs; ccs.hWindowMenu = GetSubMenu(lpcs->hMenu,IDMC_WINDOW); ccs.idFirstChild = ID_MDICHILD; RECT crc = {0}; ::GetClientRect(hWnd, &rc); //MDIクライアントの作成 HINSTANCE hInst = (HINSTANCE)::GetWindowLong(hWnd, GWL_HINSTANCE); HWND hWndClient = ::CreateWindowEx(0, "MDICLIENT",NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0, 0, rc.right, rc.bottom, hWnd, lpcs->hMenu, hInst, (LPVOID)&ccs); const DWORD dwClsStyle = ::GetClassLong(hWndClient, GCL_STYLE); ::SetClassLong(hWndClient, GCL_STYLE, dwClsStyle | CS_DBLCLKS); //MDIクライアントのプロシージャフック _S_wndProcMDIClientOrg = (WNDPROC)::SetWindowLong(hWndClient, GWL_WNDPROC, (LONG)&::WndProcMDIClient); } } //... }
お礼
回答ありがとうございます。 [machongola]様の回答で問題解決しました。 私の勘違いは以下の通りでした。 (1)MDIクライアントウィンドウに対してはMDIフレームウィンドウの ウィンドウプロシージャが適用されていると勘違いしていた所。 回答を参照し以下の不足点を補い、問題解決しました。 (1)MDIクライアントのウィンドウスタイルでダブルクリックメッセージも 受け付けるように対応 (2)MDIクライアントウィンドウのデフォルトウィンドウプロシージャの アドレスをフックし、ダブルクリックメッセージは新規ウィンドウ プロシージャで対応、それ以外はフックしたウィンドウプロシージャで 対応 今までWINDOWS系OSでプログラムを組んできましたが、組込み系のソフトで、独自に用意されているクラスライブラリを使用してのプログラム開発ばかりでしたので、勉強になりました。 これで、独自のクラスライブラリを作って遊んでみようと頑張ってみている夢を続けられます。 質問自体が少ない情報で申し訳ありませんでした。 本当にありがとうございます。