1

我有一个用 ATL 编写的基本应用程序,使用 VS2008 的向导。我在应用程序的左侧有一个树视图。我看到了如何(痛苦地)添加树项。问题是如何在鼠标右键单击时显示菜单?如何捕获每个可以选择的项目上的任何点击事件?

4

2 回答 2

3

您应该通过在消息映射中指定处理程序来WM_CONTEXTMENU检测Windows 消息。然后,您可以在处理程序中显示上下文菜单。然后,您需要确保在从上下文菜单中选择命令时还处理消息映射中的菜单命令。在这部分使用消息映射中的宏。COMMAND_HANDLER

于 2009-03-26T18:07:02.313 回答
-1

杰夫耶茨的回答给了我方向。因为我使用的是 C,所以解决方案有点不同(而且像往常一样,有点复杂):

这个想法是计算树视图中执行右键单击的点,然后获取项目。现在您可以检查项目的类型并显示相应的上下文菜单。为了防止用户混淆,下面还选择了树形视图中被右键单击的节点。

该示例假定您的对话框中有一个树视图。您可能需要循环浏览对话框中的树视图。

    case WM_CONTEXTMENU:
    {
        RECT rcTree;
        HWND hwndTV;
        HTREEITEM htvItem;
        TVHITTESTINFO htInfo = {0};

        long xPos = GET_X_LPARAM(lParam);   // x position from message, in screen coordinates
        long yPos = GET_Y_LPARAM(lParam);   // y position from message, in screen coordinates 

        hwndTV=GetDlgItem(hDlg, IDC_TREE1);         // get the tree view 
        GetWindowRect(hwndTV,&rcTree);              // get its window coordinates
        htInfo.pt.x= xPos-rcTree.left;              // convert to client coordinates
        htInfo.pt.y= yPos-rcTree.top;

        if (htvItem=TreeView_HitTest(hwndTV, &htInfo)) {    // hit test
            TreeView_SelectItem(hwndTV, htvItem);           // success; select the item
            /* display your context menu */
        }
        break;
    }

下面显示一个上下文菜单:

        RECT winPos, itemPos;

        HMENU hCtxtMenuBar= LoadMenu(ghInst,MAKEINTRESOURCE(ID_CTXTMENUS_RESOURCE));
        HMENU hCtxtMenu= GetSubMenu(hCtxtMenuBar, MY_CTXMENU);

        TreeView_GetItemRect(hwndTV, htvItem, &itemPos, TRUE);
        GetWindowRect(hwndTV, &winPos);

        SendMessage (hDlg, WM_COMMAND, 
            TrackPopupMenuEx(hCtxtMenu,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_NONOTIFY|TPM_RETURNCMD,
                winPos.left+itemPos.left, winPos.top+itemPos.bottom, hDlg,0),
            (LPARAM)hwndTV);
于 2020-11-10T12:01:19.853 回答