2012-10-09 33 views
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; 
     } 

OK,我已经编辑这个和它的作品正是在这里呈现的方式,但问题仍然有效,并能有人向我解释什么是与焦点小组的东西在这里,为什么,如果我送而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; 
    } 
+0

我不太明白:你把MFC和原始的WINAPI混合在一起。重点是什么?尝试首先保持一致:无论是所有的MFC还是所有的WINAPI,但是将两者混合并不是一个好主意。 –

+0

我根本不使用MFC。我使用WTL和winapi。 –

+0

哎呀,对不起,我误导了MESSAGE_HANDLER宏,它看起来像ON_MESSAGE MFC宏...并且通过将问题标记为MFC!你应该删除这个标签 –

回答

2

NM_RCLICK是你的朋友。

但它不能解决所有问题,例如用户在键盘上点击Windows菜单键时显示上下文菜单。这个KB article展示了如何结合NM_RCLICK和WM_CONTEXTMENU。 (这是为CTreeCtrl,但适应代码CListView是微不足道的)。

2

您将有OnContextMenu处理程序列表视图中,无论点击位置调用。现在您的任务是查看发生了完全点击的位置并决定您想要的操作。

你的问题让我觉得你从互联网上抓取了ListView_GetFocusedGroup的代码,而不是你自己写的。然而,你需要做的是发送“命中测试”消息回到列表视图提供的兴趣点(这是点击点):ListView_HitTest,ListView_HitTestEx

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

+0

我没有从互联网上抓取代码,它只是他们我认为它会工作..我试图检测Listview是什么时候焦点,并在搜索函数和属性时,我发现该函数。但我认为我没有以正确的方式做到这一点。 –

+0

也没关系。你不明白为什么你精确地寻找焦点小组。相反,您首先要查看发生点击的位置。 *手上有物品编号*,你可以检查它是否被聚焦,被选中,属于一组等。 –

+0

我只是在学习。 –

相关问题