首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理WTL/Win32应用程序中的树视图右击?

如何处理WTL/Win32应用程序中的树视图右击?
EN

Stack Overflow用户
提问于 2009-03-25 19:43:53
回答 2查看 1.6K关注 0票数 1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-26 18:07:02

您应该可以通过specifying a handler in your message map检测到WM_CONTEXTMENU窗口消息。在处理程序中,您可以显示上下文菜单。然后,您需要确保还处理消息映射中的菜单命令,以便在从上下文菜单中选择命令时使用。在此部件的消息映射中使用COMMAND_HANDLER宏。

票数 3
EN

Stack Overflow用户

发布于 2020-11-10 20:01:20

Jeff Yates的回答给了我方向。由于我使用的是C语言,所以解决方案有点不同(而且像往常一样,有点复杂):

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

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

代码语言:javascript
复制
    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;
    }

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

代码语言:javascript
复制
        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);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/683132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档