我有一个用ATL编写的基本应用程序,使用VS2008的向导。我在应用程序的左侧有一个树视图。我看到如何(痛苦地)添加树项目。问题是当鼠标右键单击时如何显示菜单?如何在每个可以选择的项目上捕获任何点击事件?
答案 0 :(得分:3)
您应该按WM_CONTEXTMENU
检测specifying a handler in your message map个窗口消息。然后在处理程序中,您可以显示上下文菜单。然后,您需要确保在从上下文菜单中选择命令时也处理消息映射中的菜单命令。在消息地图中使用此COMMAND_HANDLER
宏。
答案 1 :(得分:-1)
杰夫·耶茨(Jeff Yates)的回答给了我指导。由于我使用的是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);