3

我有一个作为资源创建的列表视图并加载到对话框窗口中。我只想在单击列表视图中的项目时检测并显示上下文菜单。

 MESSAGE_HANDLER(WM_CONTEXTMENU,OnContextMenu)

        LRESULT OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
            {
                int iSelected = -1;
    int iFocusGroup = -1;
    iSelected = SendMessage((HWND)wParam, LVM_GETNEXTITEM, -1,LVNI_SELECTED);
    iFocusGroup = ListView_GetFocusedGroup((HWND)wParam);
    if( iSelected != -1 && iFocusGroup == -1) {
                    hPopupMenu = CreatePopupMenu();
                    Insert

Menu(hPopupMenu,  0,     MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_SHREDTASK_CTXMENU_DELETE, TEXT("Delete"));
                TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, m_hWnd, NULL); 
            }
            return 0;
        }

好的,我已经编辑了它,它的工作方式与此处显示的方式相同,但问题仍然存在,有人可以向我解释这里的焦点小组是什么以及为什么如果我在对话框中发送 LVM_GETNEXTITEM 消息它返回!= -1?不只是为了 Listviews 吗?

编辑 :

这是我根据您的回答制定的另一种选择:

LRESULT OnNotifyRClick(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
          switch (uMsg)
        {
            case WM_NOTIFY:
                switch (((LPNMHDR)lParam)->code)
                {
                case NM_RCLICK:
                    if (((LPNMHDR)lParam)->idFrom == IDC_LISTTASKFILES)
                    {                       
                         int iSelected = -1;
                         iSelected = SendMessage(GetDlgItem(IDC_LISTTASKFILES), LVM_GETNEXTITEM, -1,LVNI_SELECTED);

                        if( iSelected != -1 ) {
                            hPopupMenu = CreatePopupMenu();
                            InsertMenu(hPopupMenu,  0,     MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_SHREDTASK_CTXMENU_DELETE, TEXT("Delete"));
                            TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, ((CPoint)GetMessagePos()).x, ((CPoint)GetMessagePos()).y, 0, m_hWnd, NULL); 
                        }
                         bHandled = true;

                        return TRUE;
                    }
                    break; 

                break;
                }

        }
          return false;
    }
4

2 回答 2

2

无论列表视图中的单击位置如何,您都将OnContextMenu调用处理程序。现在您的任务是查看点击的确切位置并决定您想要的操作。

您的问题让我认为您是ListView_GetFocusedGroup从互联网上获取代码的,而不是自己故意编写的。但是,您需要做的是将“命中测试”消息发送回列表视图,提供兴趣点(即点击点):ListView_HitTest, ListView_HitTestEx.

完成此操作后,您将在此位置获得项目和/或子项目,然后您可以决定下一步做什么。

于 2012-10-09T16:28:54.257 回答
2

NM_RCLICK是你的朋友。

但这并不能解决整个问题,例如当用户按下键盘上的 Windows 菜单键时显示上下文菜单。这篇知识库文章展示了如何组合 NM_RCLICK 和 WM_CONTEXTMENU。(它适用于 CTreeCtrl,但将代码适应 CListView 是微不足道的)。

于 2012-10-09T19:13:45.783 回答