The Tips for Developers > ポップアップメニューの表示

ポップアップメニューの表示(最終更新日 2002/04/11)

メニューリソースの作成
まず、MFC で適当なプロジェクトを作成し、リソースタブを選択し、「リソースフォルダ」を右クリックし、「挿入」を選択する。
次に、「リソースの挿入」ダイアログボックスより、「Menu」を選択し、「新規作成」ボタンを押下する。
リソースの設定
表示されたメニューを選択し、「プロパティ」を選択する。
プロパティの設定
表示された「メニューアイテムプロパティ」の「キャプション」テキストボックスに適当な文字を入力する
メニューバーに適当な文字を入力しないと、プルダウンメニューを編集が不可能なためである。。
(下の例では、「s」を入力しているが、どのような文字でもよい。)
メニューキャプションの設定
プルダウンメニューを選択し、「ID」、「キャプション」を入力する。
メニューの作成
イベント関数の作成
以下の例では、ビューエリアにおいて右クリックされた場合にポップアップメニューを表示することとする。
他の場合においても、イベントメッセージを受け取る関数に同様の記述を行うことで対応が可能である。

以下は、右クリック時のイベント関数の例である。
1:void CSampletipsView::OnRButtonDown(UINT nFlags, CPoint point)
2:
{
3:
CMenu menu;
4:
VERIFY(menu.LoadMenu(IDR_POPUP));
5:
CMenu* pPopup = menu.GetSubMenu(0);
6:
ASSERT(pPopup != NULL);
7:
8:
ClientToScreen(&point);
9:
pPopup->TrackPopupMenu
9:    
(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
10:
    AfxGetMainWnd());
11:
}
CMenu クラスを宣言し、ポップアップメニュー(例の場合は、「IDR_POPUP」)をロードする。

次に、GetSubMenu メソッドを呼び出し、ポップアップメニューのハンドルを持つ CMenu オブジェクトへのポインタを取得する。この場合、GetSubMenu の引数は常に「0」にする。

8 行目において、イベントから通知されたクライアント座標をスクリーン座標に変換している。これは、9 行目の TrackPopupMenu の 2 番目と 3 番目の引数がスクリーン座標にする必要があるためである。

その TrackPopupMenu メソッドだが、指定された位置にポップアップメニューを表示する CMenu クラスのメソッドである。
1 番目の引数には、メニューの表示位置の指定方法とポップアップメニューの選択方法を指定する。
(上記例の場合は、指定された x 座標の左側に表示し、マウス右クリックで指定するように設定している。)
2 番目、3 番目は前述したが、ポップアップメニューの表示されるスクリーン座標を指定する。
4 番目の引数には、ポップアップメニューを所有する画面を指定する。この画面が、ポップアップメニューからの WM_COMMAND メッセージを受け取る。
メニュー関数の実装
メニューを右クリックし、ClassWizard を起動する。その際、既存クラスの流用を指定する。

ポップアップメニューのオブジェクトIDを指定し、メッセージリストボックスから、「COMMAND」を選択する。
そして、「関数の追加」ボタンを押下すると、関数名の確認ののち、メニュー関数が実装される。
MFCでは、メニュー関数を実装しない場合、当該メニューが選択不可になるので注意が必要である。

以下の例では、ビューエリアにおいて右クリックされた場合にポップアップメニューを表示することとする。
他の場合においても、イベントメッセージを受け取る関数に同様の記述を行うことで対応が可能である。
1:void CSampletipsView::OnPopup1()
2:
{
3:
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
4:
5:
}
メニュー関数に適当な業務ロジックを作成し、ポップアップメニューの表示が可能になる。