- 締切済み
MFCのメニューバーのイベント取得
イベント取得に苦戦しております。 環境は、 Microsoft Visual Studio 2008 Professional Edition - JPN MDIです。 取得したいイベントなのですが、 メニューバーの「Windows」の各ファイル名称を選択した時の イベントを取得して処理を行いたいのですが、どうすれば取得できるのでしょうか? Windows Tile Cascade ----------- Project_1 ←ここのイベントを取得したい Project_2 ←ここのイベントを取得したい afxres.h AFX_IDM_FIRST_MDICHILD いろいろと調べた結果上記のヘッダの「AFX_IDM_FIRST_MDICHILD 」がProject_1のIDとなっており、Project_2は+1したIDとなっております。 メッセージマップで ON_COMMAND(AFX_IDM_FIRST_MDICHILD,&CMainFrame::~~~~~ とすれば、とりあえずはイベントは取れるのですが、 正規の動作が予想のごとくできませんでした。 何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 できるのでしょうか? 何か方法があればご教授御願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- BLK314
- ベストアンサー率55% (84/152)
>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 >できるのでしょうか? メッセージハンドラ内でCWnd::Default()を呼ぶのではだめですか? サブクラス化しなくてもデフォルト・ウィンドウ・プロシージャが呼ばれる はずですが... http://msdn.microsoft.com/ja-jp/library/ww9f7hst(VS.80).aspx
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、できるのでしょうか? メッセージマップでは、受け取ったメッセージはデフォルトのウィンドゥプローシジャ関数に渡されないので、既存のデフォルト処理は行われません。 メニューバーを付けたメインのフレームウィンドゥをサブクラス化し、ウィンドゥプローシジャ関数を乗っ取る必要があります。 #include <windows.h> WNDPROC DefStaticProc; //元のウィンドゥプローシジャ関数のアドレスを記憶する変数。 //新しく呼ばれるウィンドゥプローシジャ関数 LRESULT CALLBACK StaticProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { switch(msg) { case WM_COMMAND: switch(LOWORD(wp)) { case AFX_IDM_FIRST_MDICHILD: //ここで何かを処理 break; //このbreak文を「return 0;」に変えると、デフォルトの処理をしなくなる。 case AFX_IDM_FIRST_MDICHILD + 1: //ここで何かを処理 break; //このbreak文を「return 0;」に変えると、デフォルトの処理をしなくなる。 } } //元のウィンドゥプローシジャ関数をCallWindowProc関数を用いて呼び出し、デフォルトの処理をさせる。 return CallWindowProc(DefStaticProc , hwnd , msg , wp , lp); } (中略) //プログラムの初期化をする場所、メニューバーを付けたメインのフレームウィンドゥが作成された後に1度だけ通る場所で行う。 //hWndはメニューバーを付けたメインのフレームウィンドゥのウィンドゥハンドルを指定する。 //hWndはWinMainに渡されて来るプロセスのハンドルではない事に注意。 // //元のウィンドゥプローシジャ関数のアドレスを取得する。 DefStaticProc = (WNDPROC)GetWindowLong(hWnd , GWL_WNDPROC); //ウィンドゥプローシジャ関数を挿げ替える。 SetWindowLong(hWnd , GWL_WNDPROC , (LONG)StaticProc); (中略)
- redfox63
- ベストアンサー率71% (1325/1856)
> 正規の動作が予想のごとくできませんでした とは どのような動作なのでしょう 選択した 項目のウィンドウをActiveにしたいってことでしょうか?
お礼
返答ありがとうございます。 上記の通りCWnd::Default()が呼ぶと既存の処理が行われました。 有難う御座います。