winapi - 检测在 ListView 内单击并显示上下文菜单

标签 winapi visual-c++ atl wtl

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

 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 ?它不是仅适用于 ListView 吗?

编辑:

这是我根据您的回复制定的另一个替代方案:

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

最佳答案

NM_RCLICK是你的 friend 。

但这并不能解决整个问题,例如当用户点击键盘上的 Windows 菜单键时显示上下文菜单。这个KB article显示如何组合 NM_RCLICK 和 WM_CONTEXTMENU。 (它适用于 CTreeCtrl,但将代码调整为 CListView 很简单)。

关于winapi - 检测在 ListView 内单击并显示上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12796501/

相关文章:

python - 使用 python 的带有按钮的 Windows 通知

c++ - Visual C++ 读取整个文件

c++ - wcstombs_s 无法正常工作

wpf - 有没有办法使用 native C++ 从 WPF 窗口捕获位图?

c++ - VB6 GUI 在多线程 COM 环境中不工作

C++游戏训练器进程监控

c++ - 如何将简单的几何图形组合在一个物体中?

winapi - 如何防止 MFC 中基于 CScrollView/CFormView 的类中的滚动条 (Windows Mobile 6)

c++ - 将 _TCHAR* 转换为 char*

c++ - 使用 COM 进行异常安全的内存处理