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

2017年2月21日

自前でプルダウンメニューを作った際のログ.
ここで掲載するのは,任意の領域を左マウスクリックすると,ポップアップメニューが表示され,
メニューから選択した項目のリソース ID をメンバ変数に格納するところまでのサンプルです
リソースをちゃんと作れば,プルダウンメニューっぽくできます

リソースエディタから,メニューを追加します
メニューリソースの作り方は省略します
ここでは,メニュー自体のリソース ID を「IDR_POPUP」, メニュー項目を ID_POPUP_1 ~ ID_POPUP_5 となるように 5 項目作成しました

Popup1

ポップアップメニューの表示処理を実装します

// ポップアップメニューを表示する.
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;
    }
}

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

Popup2

スポンサーリンク

MFCMFC

Posted by peliphilo