• 締切済み

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::~~~~~ とすれば、とりあえずはイベントは取れるのですが、 正規の動作が予想のごとくできませんでした。 何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 できるのでしょうか? 何か方法があればご教授御願い致します。

みんなの回答

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 >できるのでしょうか? メッセージハンドラ内でCWnd::Default()を呼ぶのではだめですか? サブクラス化しなくてもデフォルト・ウィンドウ・プロシージャが呼ばれる はずですが... http://msdn.microsoft.com/ja-jp/library/ww9f7hst(VS.80).aspx

hir0yuki
質問者

お礼

返答ありがとうございます。 上記の通りCWnd::Default()が呼ぶと既存の処理が行われました。 有難う御座います。

回答No.2

>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、できるのでしょうか? メッセージマップでは、受け取ったメッセージはデフォルトのウィンドゥプローシジャ関数に渡されないので、既存のデフォルト処理は行われません。 メニューバーを付けたメインのフレームウィンドゥをサブクラス化し、ウィンドゥプローシジャ関数を乗っ取る必要があります。 #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)
回答No.1

> 正規の動作が予想のごとくできませんでした とは どのような動作なのでしょう 選択した 項目のウィンドウをActiveにしたいってことでしょうか?

専門家に質問してみよう