[MFC] 左クリックで開くプルダウンメニューを作る
自前でプルダウンメニューを作った際のログです。
概要
- 任意の領域を左マウスクリックすると、ポップアップメニューが表示される
- メニューから選択した項目のリソース ID をメンバ変数に格納する
リソースをちゃんと作れば、プルダウンメニューっぽくできます。
サンプル
リソースエディタからメニューを追加する
メニューリソースの作り方は省略します。
ここでは、以下のようにリソースIDを設定します。
- メニュー自体: IDR_POPUP
- メニュー項目: ID_POPUP_1 ~ ID_POPUP_5 となるように 5 項目
ポップアップメニューの表示処理
// ポップアップメニューを表示する. void CChildView::ShowPopupMenu() { // 表示位置の設定. // ここでは,サンプルとしてマウス位置を渡します. // なお,ここで指定する座標は,スクリーン座標になっている必要があります. POINT point; GetCursorPos(&point); // 表示するメニューの取得します. CMenu menu; menu.LoadMenu(IDR_POPUP); CMenu* pPopup = NULL; pPopup = menu.GetSubMenu(0); if (!pPopup) { ASSERT(pPopup); return; } // メニューを表示します. CWnd* pWnd = AfxGetMainWnd(); if (!pWnd) { ASSERT(pWnd); return; } pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWnd); } // 左マウスダウンすると,ポップアップウィンドウの表示処理を実行します. void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { ShowPopupMenu(); }
選択状態の管理
このままだと、ただ表示するだけなので選択状態を管理できるようにします。
選択されているメニュー ID を保存するメンバ変数を追加します。
初期値として「ID_POPUP_1」を設定しておきます。
int m_selectedPopupMenuID;
ポップアップメニューの機能実装
ポップアップメニューを開く際と、値の確定時の処理を実装します。
メソッドを宣言します。
afx_msg void OnUpdatePopupMenu(CCmdUI* pCmdUI); afx_msg void OnPopupMenu(UINT nID);
メッセージマップにも追加します。
ON_UPDATE_COMMAND_UI_RANGE(ID_POPUP_1, ID_POPUP_5, OnUpdatePopupMenu) ON_COMMAND_RANGE(ID_POPUP_1, ID_POPUP_5, OnPopupMenu)
メソッドの実装は以下のようにします。
// メニューを開く際に呼び出されます. void CChildView::OnUpdatePopupMenu(CCmdUI *pCmdUI) { if (!pCmdUI->m_pMenu) { return; } // m_selectedPopupMenuID を渡すことで,開いた際に選択されている項目を指定します. pCmdUI->m_pMenu->CheckMenuRadioItem(ID_POPUP_1, ID_POPUP_5, m_selectedPopupMenuID, MF_BYCOMMAND|MF_CHECKED); } // メニューで項目を選択した際に呼び出されます. void CChildView::OnPopupMenu(UINT nID) { if ((ID_POPUP_1 <= nID) && (nID <= ID_POPUP_5)) { // 選択した項目のリソース ID が引数で渡されるので,これを格納します. m_selectedPopupMenuID = nID; } }
動作
ウィンドウ上でマウスクリックすると、以下のように表示されます。
おしまい。
ディスカッション
コメント一覧
まだ、コメントがありません