列表框上下文菜单

时间:2009-10-02 12:02:28

标签: c++ mfc listbox contextmenu

如何在MFC的列表框中添加上下文菜单?我没有在列表框的属性中看到任何WM_CONTEXTMENU处理程序。有什么想法吗?

编辑:我按照本教程MFC List Control: How to use a context menu in a list control?进行了操作。教程说从CListBox派生我自己的类,但是现在如何将我派生类的列表框添加到对话框中?

5 个答案:

答案 0 :(得分:4)

在父类中放置一个OnContextMenu处理程序。然后添加一个弹出菜单

编辑要添加OnContextMenu处理程序,请将事件处理程序添加到PARENT窗口(即不是列表类)。这最容易通过资源编辑器完成。转到属性页面,然后转到消息部分。然后为WM_CONTEXTMENU添加一个函数。

void CYourDialog::OnContextMenu(CWnd* pWnd, CPoint point)
{
    CListCtrl* pList = (CListCtrl*)GetDlgItem( ID_YOUR_LIST );

    if ( (CWnd*)pList == pWnd )
    {
        CMenu menu;
        // Create your menu items.

        int retVal  = menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this );

        // Handle your returns here.
    }
}

答案 1 :(得分:2)

由于我的编辑因“改变太多”的理由被拒绝,我会在此提出我的建议,因为在我看来,原始代码会促进不良的编码实践。

void CYourDialog::OnContextMenu(CWnd* pWnd, CPoint point)
{
    int CtrlID = pWnd->GetDlgCtrlID();

    if (CtrlID == ID_YOUR_LIST) {
        CMenu menu;
        // Create your menu items...
        int retVal = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this);
        // Handle selected options here...
    }
}

答案 2 :(得分:1)

您需要执行以下步骤:

  1. 添加

    ON_WM_CONTEXTMENU()

BEGIN_MESSAGE_MAP()

所以你会有类似的东西

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_QUERYDRAGICON()
    ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
  1. 在头文件中添加上下文菜单功能:

afx_msg void OnContextMenu(CWnd* pWnd, CPoint point)
  1. 然后按照文章中的建议添加“上下文菜单”功能:

    void CMyDialog :: OnContextMenu(CWnd * pWnd,CPoint点) { CListCtrl * pList =(CListCtrl *)GetDlgItem(ID_YOUR_LIST);

     if ( (CWnd*)pList == pWnd )
     {
         CMenu menu;
         // Create your menu items.
    
         int retVal  = menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD, point.x, point.y, this );
    
         // Handle your returns here.
     }
    

    }

答案 3 :(得分:0)

为对话框窗口添加处理程序。这将产生这个:

void YourDialogClass::OnContextMenu(CWnd* pWnd, CPoint point) {
  ...
}

pWnd将指向用户右键单击鼠标的窗口/控件。

答案 4 :(得分:0)

如果您按照教程派生自己的类,请确保将ON_WM_CONTEXTMENU()添加到新的类消息映射中。

要添加派生类的列表框,只需为ListBox控件添加一个变量,并将变量类指定为派生类。

但是我认为@Goz的答案也是一个有效的解决方案,而且更简单。