モードレスダイアログのメニューで、ちゃんとOnUpdateCommandUIを処理したいのですが・・

[戻る]
ごっほ 2003/10/31(金) 20:13:54
ごっほと申します。
開発環境はWindows2000、VisualC++.netでMFCを使っています。

1.CDialogから派生させたクラスCDisplay(IDは、IDD_DISPLAY)を作ります。
2.リソースエディタで新規にメニュー(IDは、ID_MENU1)を作ります。
3.CDisplayのプロパティでメニューにID_MENU1を指定します。
4.以下のようにモードレスダイアログとしてCDisplayを
表示させます。

CDisplay display1;
display1.Create(IDD_DISPLAY, GetDesktopWindow());
display1.ShowWindow(SW_SHOW);

5.このプログラムを実行し、表示されたモードレスダイアログの
メニュー(ID_MENU1)をプルダウンさせてもOnUpdateCommandUIを
受け取ることが出来ません。プルダウンメニューの中から1つ選んで
クリックするとOnUpdateCommandUIを受け取り、直後にOnCommandを
受け取るようです。

※CxxxViewのメニューのように、メニューがプルダウンさせたときに
OnUpdateCommandUIを受け取ることは出来ないのでしょうか。

よろしくお願いします。

オメガ 2003/10/31(金) 21:27:36
出来ません

NEG(ねぐ) [E-Mail] [HomePage] 2003/10/31(金) 23:22:00
 以下でうまくいくかな?(?_?)

 ダイアログのソースにWM_INITMENUPOPUPの処理OnInitMenuPopupを作成します。
 MFCのソースwinfrm.cppのCFrameWnd::OnInitMenuPopupの処理を
「// TODO : ここにメッセージ ハンドラ コードを追加します。」の後ろにコピーしま
す。
 「AfxCancelModes」「if (m_pNotifyHook〜」はエラーになるのでコメントにします。
 「pMenu」は存在しないので「pPopupMenu」に置き換えます。

NEG(ねぐ) [E-Mail] [HomePage] 2003/10/31(金) 23:31:45
 抜けがひとつ。(^_^;

 「m_bAutoMenuEnable」は「TRUE」にします。

ごっほ 2003/11/01(土) 02:57:30
オメガさん、NEG(ねぐ)さん、回答ありがとうございました。
お二人の回答からすると、CxxxViewでメニューがプルダウンされた時に
OnUpdateCommandが呼ばれるのはCMainFrameのはたらきによるものということですか?

そこでオメガさんは「できない」(CxxxViewに対するCMainFrameが、
CDisplayには存在しないから)と回答されて、
NEG(ねぐ)さんは「winfrm.cpp・・」(このはたらきをしている
CMainFrameの一部分のソースをコピーしてはどうか)と回答されたのでしょうか。

NEG(ねぐ)さんの回答を試してみました。その結果、うまく動作させることが
できました。ありがとうございました。

できればCMainFrameとの関連についても私の考えている通りかどうか教えてください。

NEG(ねぐ) [E-Mail] [HomePage] 2003/11/01(土) 09:26:50
 そうです、CFrameWnd::OnInitMenuPopup(WM_INITMENUPOPUP)で該当の処理が行われ
ています。
 なので、CDialog(CDisplay)に同様の処理を入れることにより同じ動きになると。

 CMainFrameはCFrameWndもしくはCMDIFrameWndから派生しています。
 CMDIFrameWndはCFrameWndから派生しています。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_mfc_hierarchy_chart.asp

 また、CFrameWndもm_bAutoMenuEnableをFALSEにすることにより動作を変更できます。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_mfc_cframewnd.3a3a.m_bautomenuenable.asp

ごっほ 2003/11/01(土) 21:18:12
[[解決]]
NEG(ねぐ)さん。ありがとうございました。
納得しました。

あの後、CFrameWndから派生させたクラスCDisplayFrameを作って
CxxxViewに対するCMainFrameと同じように
CDisplayに対するCDisplayFrameという形にできないかなと
試そうと思いましたが、・・・ハナから行き詰りました。

少し考えてみます。

古いスレッドには追加発言できません。