[MFC] 左クリックで開くプルダウンメニューを作る

2022年12月21日

自前でプルダウンメニューを作った際のログです。

スポンサーリンク

概要

  • 任意の領域を左マウスクリックすると、ポップアップメニューが表示される
  • メニューから選択した項目のリソース 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;
    }
}

動作

ウィンドウ上でマウスクリックすると、以下のように表示されます。

おしまい。

スポンサーリンク

C++,MFCC++,MFC

Posted by peliphilo