• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:タスクトレイから出したメニューの実行について)

タスクトレイから出したメニューの実行について

このQ&Aのポイント
  • タスクトレイから出したメニューの実行について分かりにくい点があります。
  • メニューの実装をダイアログクラスに書くと問題ないですが、CMainFrameクラスに書くと実行されません。
  • なぜCMainFrameクラスでの実装では実行されないのか、理由が分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>メニューの実装をCMainFrameクラスに書いても意味がないのに、 別に意味がないわけではありません。 >>この行の最後のthisはなに(どこ)でしょうか? >thisはダイアログクラスのオブジェクトのことだと思います。 と、いうふうに、VitaminBBさんが、ダイアログクラスのオブジェクト(CWnd*の派生クラス)に対してメッセージを送るようなコードを書いているだけです。 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxMainWnd()); こうすればメインウィンドウにメッセージが飛んで来るようになるのはわかりますよね。 >どうしてクラスウィザードのクラス名でCMainFrameを選ぶとオブジェクトIDにID_Myxxxが選択できるようになっているのですか? メニューエディタで作成されているメニューの項目だから。 というのが回答です。 メニューはひとつのウィンドウに紐づいているものではないので、全てのウィンドウに対するウィザードで表示されないとだめですよね。 ><質問2> >ただし、モードレスダイアログをメインウィンドウの子供にしてやると、 >CMainFrame内にメッセージが飛ぶようになります。 >これはどうしてなのですか? こっちはわかりませんねぇ。

VitaminBB
質問者

お礼

いつも回答ありがとうございます。 <質問1> 良く分かりました。 タスクトレイのことに囚われて、分かってしまえば愚かな質問だった気がします。 しかしながら、改めて別の状況についてお聞きしたいのですが、 メインウィンドウとボタンを1個配置したダイアログの場合において、 クラスウィザードを使うと、CMainFrameクラスとダイアログクラスのどちらを選んでも オブジェクトIDの欄からIDC_BUTTON1が選択できます。 でも、CMainFrameクラスのIDC_BUTTON1を選ぶと当然のことながら、ダイアログのボタンを押してもCMainFrameクラスのvoid CMainFrame::OnButton1() が実行されることは有りません。 なのにどうして選択できるようになっているのでしょうか?

VitaminBB
質問者

補足

お礼の記述後に書いています。 ウィザードの件は、よくよく考えるとウィザードが作り出すコードがどうなるかを考えてうまく使えば良いだけのことでありこだわるべき疑問ではないことがようやく分かって来ました。 と言うことで、これで一旦終わりにしたいと思います。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

> 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

VitaminBB
質問者

お礼

回答ありがとうございます。 thisはダイアログクラスのオブジェクトのことだと思います。 済みませんが、ちょっと質問を変えさせてください。 <質問1> メニューの実装をCMainFrameクラスに書いても意味がないのに、どうしてクラスウィザードのクラス名でCMainFrameを選ぶとオブジェクトIDにID_Myxxxが選択できるようになっているのですか? そういう仕様だと言われればそれまでですが。 <質問2> ただし、モードレスダイアログをメインウィンドウの子供にしてやると、CMainFrame内にメッセージが飛ぶようになります。 これはどうしてなのですか?

関連するQ&A