質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

ポップアップ

一般的に、ポップアップは、ウィンドウやアプリケーションに上に浮かぶUIエレメントを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

5208閲覧

ポップアップメニューをクリックして、exeを開けるようにしたい

Grayi

総合スコア26

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

ポップアップ

一般的に、ポップアップは、ウィンドウやアプリケーションに上に浮かぶUIエレメントを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/04 14:43

右クリックでポップアップメニューを表示する→ポップアップメニューの1つを選択→あるexeを開く
という機能を作りたいです。

開発環境はVC++, MFCを使ってます。
ポップアップメニューを出すところまでは出来たのですが、現在はメニューを選択しても、何も起こりません。
ポップアップメニューを表示するコードは以下のようになっています。
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING|MF_ENABLED,ID_EDIT_UNDO ,"xxx.exe");
//exeの名前が表示されるようにしている。ID_EDIT_UNDOは適当に入れただけ。他に何を入れたら良いのかは分からない。

ClientToScreen(&point);
menu.TrackPopupMenu(
TPM_LEFTALIGN | //クリック時のX座標をメニューの左辺にする
TPM_RIGHTBUTTON, //右クリックでメニュー選択可能とする
point.x,point.y, //メニューの表示位置
this //このメニューを所有するウィンドウ
);

ID_EDIT_UNDOを別のものに変えれば、exeを開くように出来るような気がして色々試したのですが、出来ませんでした。お力をお貸しください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2018/11/05 00:29

開発環境を書いてください。visual studio 2017等
Grayi

2018/11/05 12:32

visual studio2015です。書いてなくてすみません。
takabosoft

2018/11/06 01:22

右クリックメニューの項目からEXEを開く機能を付けたいのは理解しましたが、これはメニュー項目は1つだけですか?(例えばユーザーが自由に何個も登録できるようにしたいといった事はないですか?)
Grayi

2018/11/06 10:36

メニュー項目は一つだけです。ユーザーが編集することができるような機能などは、今のところ予定していません。質問はちゃんと細かく書いた方が良いのですね。以後気を付けます。ご指摘ありがとうございます。
guest

回答3

0

ベストアンサー付いちゃていますが、一応私がいつもやっている手順を書いておきます。

まず今回のように固定のポップアップメニューを表示するだけなら、
リソースとしてメニューを定義します。

イメージ説明
イメージ説明

ポップアップ専用のリソースは無いので(?)メニューバーの1つ目の項目をポップアップとして使うイメージです。
下の図のように、項目名とIDを指定してあげます。

イメージ説明

で、リソースエディタでこのようにIDをしっかり付けることで、Visual StudioがこのIDをコマンドIDとして認識してくれます。これが重要です。
(※コマンドIDの番号とかは勝手に振ってくれます)

次にここで作ったポップアップメニューの表示方法ですが、以下のように実装してください。

cpp

1 CMenu menu; 2 if (menu.LoadMenu(IDR_POPUPMENU)) { 3 CMenu* pPopupMenu = menu.GetSubMenu(0); 4 if (pPopupMenu != NULL) { 5 ClientToScreen(&point); 6 pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); 7 } 8 }

リソースを読み込んで表示しているだけです。
ここまでで、リソースで定義したポップアップメニューが正しく表示されることを確認してください。


次に、ダイアログベースなら自分のダイアログクラス(SDIとかMDIならViewまたはMainFrame)の「クラスウィザード」を開きます。
イメージ説明

すると、さっき作ったID_BOOT_HOGEに対して「ハンドラーの追加」が実行できます。

イメージ説明

ハンドラーがcppファイル側に作成されますので、中身を実装してください。
※コマンド「ID_BOOT_HOGE」が実行されたときにOnBootHoge()が呼ばれるようになります。

cpp

1void CMFCApplication20Dlg::OnBootHoge() 2{ 3 AfxMessageBox(_T("あとはここにEXEを起動するコードを書く")); 4}

これでどうでしょうか。
可能であればMFC入門の書籍等を一冊買って読んでもらった方が良いかと思います。

投稿2018/11/07 01:53

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Grayi

2018/11/07 13:27

ご丁寧な回答、ありがとうございます。スクリーンショットまで見ることができ、とても分かりやすく、勉強になります。コマンドIDの設定の仕方などがなかなか分からず、結局resourse.hに手入力してしまったのですが、こんな便利な方法があったのですね。明日早速試してみます。 MFCの書籍は先輩から貸していただいたものを参考にしたりしているのですが、10年以上前に発行されたもののためか今回のケースでは参考にすることが出来ませんでした(私の理解力不足が原因かもしれません)。やっぱ購入するなどして、勉強した方がいいですね。色々教えてくださって、本当にありがとうございます。
guest

0

StandAlyさんが書いたのは、ポップアップメニュー表示に関することまでです。
ポップアップメニューの選択した項目にコマンドIDを登録しているので、
そのコマンドID用の処理を別途書けということです。
それが、ttyp03さんの言っていることです。

投稿2018/11/05 00:54

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Grayi

2018/11/05 12:51

回答ありがとうございます。 教えて頂いた通りコマンドID用の処理を書いたら、右クリックでexeが起動できるようになりました。困ったことに、ポップアップメニューを選択しなくても、右クリックのみで起動してしまうのですが。
guest

0

ベストアンサー

ID_EDIT_UNDOのイベント処理はどうなっているのでしょうか?
そこに実行する処理を書かない限りは何も起こりません。
手元に環境が無いのでサンプルを提示することができませんが、MFC AppendMenuで検索すれば色々出てくると思います。

投稿2018/11/05 00:27

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Grayi

2018/11/05 12:49

回答ありがとうございます。 ID_EDIT_UNDOのイベント処理は何も書いてませんでした。 頂いたアドバイスを参考に、以下のように書き直しました。 //CTest.h #define IDS_STARTEXE ShellExcute(GetHwnd(),NULL,TEXT("exeの絶対パス"),NULL,(“exeが置いてあるディレクトリのパス”)SW_SHOWNORMAL) //CTest.cpp void CTest::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING|MF_ENABLED,IDS_STARTEXE ,"xxx.exe"); ClientToScreen(&point); menu.TrackPopupMenu( TPM_LEFTALIGN | //クリック時のX座標をメニューの左辺にする TPM_RIGHTBUTTON, //右クリックでメニュー選択可能とする point.x,point.y, //メニューの表示位置 this //このメニューを所有するウィンドウ ); menu.DestroyMenu(); } とりあえず、右クリックしたらexeを起動できるようになりました!ありがとうございます。 問題は、今のままだとポップアップメニューを選択しなくても、右クリックしただけでexeが起動してしまうことです。
Grayi

2018/11/06 10:40

教えて頂いたサイトを参考にしたら、ちゃんと 右クリック→ポップアップメニュー表示→左クリックメニューを選択→exeを起動 が出来るようになりました! イベントハンドラを作るというのが分かっていなかったので、大変助かりました。ttype03さん、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問