こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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::~~~~~
とすれば、とりあえずはイベントは取れるのですが、
正規の動作が予想のごとくできませんでした。

何か他の方法で、取得して、既存の処理を損なうことなく動作することは、
できるのでしょうか?

何か方法があればご教授御願い致します。

投稿日時 - 2009-02-20 21:47:49

QNo.4734916

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>何か他の方法で、取得して、既存の処理を損なうことなく動作することは、
>できるのでしょうか?

メッセージハンドラ内でCWnd::Default()を呼ぶのではだめですか?
サブクラス化しなくてもデフォルト・ウィンドウ・プロシージャが呼ばれる
はずですが...
http://msdn.microsoft.com/ja-jp/library/ww9f7hst(VS.80).aspx

投稿日時 - 2009-02-21 22:24:30

お礼

返答ありがとうございます。

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

投稿日時 - 2009-02-23 09:28:12

ANo.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);
(中略)

投稿日時 - 2009-02-21 11:44:12

ANo.1

> 正規の動作が予想のごとくできませんでした
とは どのような動作なのでしょう

選択した 項目のウィンドウをActiveにしたいってことでしょうか?

投稿日時 - 2009-02-21 07:10:23