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; } }
ウィンドウ上でマウスクリックすると,以下のように表示されます
ディスカッション
コメント一覧
まだ、コメントがありません