【问题标题】:List box context menu列表框上下文菜单
【发布时间】:2009-10-02 12:02:27
【问题描述】:

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

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

【问题讨论】:

    标签: c++ mfc listbox contextmenu


    【解决方案1】:

    由于我的编辑以“更改过多”为理由被拒绝,我将把我的建议放在这里,因为在我看来,原始代码会促进糟糕的编码实践。

    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】:

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

      编辑要添加OnContextMenu 处理程序,请将事件处理程序添加到父窗口(即不是列表类)。这可以通过资源编辑器轻松完成。转到属性页面,然后转到消息部分。然后为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.
          }
      }
      

      【讨论】:

        【解决方案3】:

        您需要采取以下步骤:

        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 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.
            }
        }
        
        

        【讨论】:

          【解决方案4】:

          为您的对话窗口添加一个处理程序。这将生成:

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

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

          【讨论】:

          • 但是我在哪里添加呢?我的意思是列表框没有类
          • 我在我的源代码中看不到列表框的类。只有两个类CDialog,CWinApp
          • @Manzoor Ahmed,我编辑了我的答案。该方法将放置在您的对话框类中。
          • 为什么要在对话框类中添加handler,列表框类在哪里?请看我的编辑
          • @Manzoor Ahmed,您实际上不必为每个需要上下文菜单的控件派生一个类。 Goz 给你写了一个例子,试试看。
          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-09
            • 2012-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多