- ベストアンサー
タスクトレイから出したメニューの実行について
- タスクトレイから出したメニューの実行について分かりにくい点があります。
- メニューの実装をダイアログクラスに書くと問題ないですが、CMainFrameクラスに書くと実行されません。
- なぜCMainFrameクラスでの実装では実行されないのか、理由が分かりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>メニューの実装をCMainFrameクラスに書いても意味がないのに、 別に意味がないわけではありません。 >>この行の最後のthisはなに(どこ)でしょうか? >thisはダイアログクラスのオブジェクトのことだと思います。 と、いうふうに、VitaminBBさんが、ダイアログクラスのオブジェクト(CWnd*の派生クラス)に対してメッセージを送るようなコードを書いているだけです。 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxMainWnd()); こうすればメインウィンドウにメッセージが飛んで来るようになるのはわかりますよね。 >どうしてクラスウィザードのクラス名でCMainFrameを選ぶとオブジェクトIDにID_Myxxxが選択できるようになっているのですか? メニューエディタで作成されているメニューの項目だから。 というのが回答です。 メニューはひとつのウィンドウに紐づいているものではないので、全てのウィンドウに対するウィザードで表示されないとだめですよね。 ><質問2> >ただし、モードレスダイアログをメインウィンドウの子供にしてやると、 >CMainFrame内にメッセージが飛ぶようになります。 >これはどうしてなのですか? こっちはわかりませんねぇ。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
> pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); ヒントです。 この行の最後のthisはなに(どこ)でしょうか? http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_cmenu.3a3a.trackpopupmenu.htm
お礼
回答ありがとうございます。 thisはダイアログクラスのオブジェクトのことだと思います。 済みませんが、ちょっと質問を変えさせてください。 <質問1> メニューの実装をCMainFrameクラスに書いても意味がないのに、どうしてクラスウィザードのクラス名でCMainFrameを選ぶとオブジェクトIDにID_Myxxxが選択できるようになっているのですか? そういう仕様だと言われればそれまでですが。 <質問2> ただし、モードレスダイアログをメインウィンドウの子供にしてやると、CMainFrame内にメッセージが飛ぶようになります。 これはどうしてなのですか?
お礼
いつも回答ありがとうございます。 <質問1> 良く分かりました。 タスクトレイのことに囚われて、分かってしまえば愚かな質問だった気がします。 しかしながら、改めて別の状況についてお聞きしたいのですが、 メインウィンドウとボタンを1個配置したダイアログの場合において、 クラスウィザードを使うと、CMainFrameクラスとダイアログクラスのどちらを選んでも オブジェクトIDの欄からIDC_BUTTON1が選択できます。 でも、CMainFrameクラスのIDC_BUTTON1を選ぶと当然のことながら、ダイアログのボタンを押してもCMainFrameクラスのvoid CMainFrame::OnButton1() が実行されることは有りません。 なのにどうして選択できるようになっているのでしょうか?
補足
お礼の記述後に書いています。 ウィザードの件は、よくよく考えるとウィザードが作り出すコードがどうなるかを考えてうまく使えば良いだけのことでありこだわるべき疑問ではないことがようやく分かって来ました。 と言うことで、これで一旦終わりにしたいと思います。