|
ダイアログにポップアップメニューをつける
今回はダイアログにポップアップメニューをつけてみましょう。ポップアップメニューというのは、通常、右クリックをしたときに出てくる動的なメニューです。
今回もダイアログベースでプロジェクトを作成します。ポップアップメニューを追加するために、まずはメニューリソースを作成します。リソースエディタから、リソースの追加で「Menu」を選択し、新規作成します。

メニューエディタで、「新しい項目を挿入」を選択します。

ここで出てくる上下方向に並んだメニューがポップアップメニューになります。ウインドウの上部に置かれる通常のメニューは、左右方向に並んだメニューを選択したときにポップアップメニューが表示されますが、今回はポップアップメニューしか使わないので、左右方向のメニューは空欄で大丈夫です。今回は「OK」と「キャンセル」の2つの項目を追加しました。

次にメニュー項目のプロパティを設定します。ここではIDを設定します。他はデフォルトでOKです。

次はダイアログを右クリックしたときのイベントハンドラを追加します。右クリックはボタンダウン、ボタンアップの2種類のイベントがありますが、ボタンアップでポップアップメニューを出すのが一般的です。ダイアログのプロパティから、「WM_RBUTTONUP」を選択し、イベントハンドラを追加します。

では、右クリックしたときのイベントハンドラを実装していきましょう。次のようなコードを追加します。
// "右クリック"
void CMenuDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
CMenu *popupMenuP = NULL;
CMenu cMenu;
int err = 0;
// メニューをロード
if (!err) if (!cMenu.LoadMenu(IDR_MENU1)) err = 1;
// サブメニューを取得
if (!err) if ((popupMenuP = cMenu.GetSubMenu(0)) == NULL) err = 1;
// メニューをポップアップ
if (!err)
{
ClientToScreen(&point);
if (!popupMenuP->TrackPopupMenu(
TPM_LEFTBUTTON, point.x, point.y, this)) err = 1;
}
// メニューを破棄
cMenu.DestroyMenu();
CDialog::OnRButtonUp(nFlags, point);
}
|
メニューの操作はCMenuクラスのオブジェクトを使います。まずは、CMenu::LoadMenu()関数で、メニューリソースからメニューを読み込みます。
| BOOL CMenu::LoadMenu(UINT nIDResource); |
| 説明: |
メニューリソースからメニューを読み込む |
| 引数: |
nIDResource :メニューリソースID |
| 戻り値: |
正常に読み込んだ場合は0以外。それ以外の場合は0 |
次はCMenu::GetSubMenu()関数で、ポップアップメニューを取得します。
| CMenu* CMenu::GetSubMenu(int nPos) const; |
| 説明: |
ポップアップメニューを取得 |
| 引数: |
nPos :メニュー内のポップアップメニューの位置。最初の位置は0 |
| 戻り値: |
CMenuオブジェクトへのポインタ。取得できなかった場合はNULL |
次はCMenu::TrackPopupMenu()関数で、ポップアップメニューを表示しますが、表示する位置を指定するために、WM_RBUTTONUPのパラメータ、pointを使います。このパラメータはクライアント座標(ダイアログのクライアント領域の左上からの座標)なので、CWnd::ClientToScreen()関数で、スクリーン座標(デスクトップの左上からの座標)に変換しておきます。
CMenu::TrackPopupMenu()関数はポップアップメニューを表示します。この関数はメニューが閉じられるまで制御を返しません。
| BOOL CMenu::TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = 0); |
| 説明: |
ポップアップメニューの表示 |
| 引数: |
nFlags :表示位置とマウスボタンに関するフラグ。TPM_LEFTALIGNの場合、指定したx座標に左辺を合わせる。
x:表示位置のx座標。nFlagsにより左辺、右辺、中央は変わる。(スクリーン座標)
y:表示位置のy座標(上辺の座標)。(スクリーン座標)
pWnd:ポップアップメニューを所有するウィンドウ |
| 戻り値: |
正常終了した場合は0以外。それ以外の場合は0 |
メニューが閉じられたら、CMenu::DestroyMenu()関数でメニューを破棄します。
次は、各メニューが選択されたときのイベントハンドラを追加しましょう。メニューエディタから、「イベントハンドラの追加」を選択します。

「メッセージの種類」に「COMMAND」を選択し、「クラスの一覧」でダイアログクラスを選択します。

イベントハンドラの内容は次のようにしました。今回は、"OK"、"キャンセル"ボタンと同じ動作をさせるだけなので、OnOK()、OnCancel()をそのまま呼び出しています。
// メニュー"OK"
void CMenuDlg::OnMenuOk()
{
OnOK();
}
// メニュー"キャンセル"
void CMenuDlg::OnMenuCancel()
{
OnCancel();
} |
では、ビルドして実行してみましょう。ダイアログ上で右クリックすると、ポップアップメニューが表示されます。メニューを選択すると、"OK"、"キャンセル"ボタンと同じ動作をします。

|