[kaze's test] プログラミングメモ →目次

マウス右クリックでのポップアップメニュー(VC++MFC)

Windowのクライアント領域を右クリックすると、ポップアップメニューを表示する方法についてのメモです。



1.リソースエディターで、ポップアップ用のメニューを作成します。

2.マウス右クリックのメッセージ(ON_WM_RBUTTONDOWN)ハンドルで、ポップアップメニューを出す処理を実装します。

void CPopMenuTestView::OnRButtonDown(UINT nFlags, CPoint point) 
{
    CMenu Menu;
    CPoint pt = point;
    ClientToScreen(&pt);
    if (Menu.LoadMenu(IDR_MENU_POPTEST))
    {
        CMenu* pSubMenu = Menu.GetSubMenu(0);
        if (pSubMenu != NULL)
        {
            pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
        }
    }
    CView::OnRButtonDown(nFlags, point);
}

3.MFCを利用する場合は、WM_CONTEXTMENUのメッセージハンドルを実装すれば一般的で便利です。

void CPopMenuTestView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
    CMenu Menu;
    CPoint pt = point;
    //ClientToScreen(&pt);
    if (Menu.LoadMenu(IDR_MENU_POPTEST))
    {
        CMenu* pSubMenu = Menu.GetSubMenu(0);
        if (pSubMenu != NULL)
        {
            pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
        }
    }    
}

4.注意点。ON_WM_RBUTTONDOWNのメッセージハンドルで実装する時に、ポップアップする場所の座標を自分でグローバルに変換しなければなりません。MFCのOnContextMenu()をオーバライドして実装すれば、座標の変換は既に行ったのです。