我有VC ++ MFC应用程序,我需要在CMainFrame菜单栏上显示上下文菜单。我在CMainFrame中为WM_CONTEXTMENU添加了一个处理程序,我可以在工具栏上显示我的上下文菜单(也是窗口标题),但是当我在菜单栏中右键单击时,不会调用句柄
答案 0 :(得分:3)
使用 Spy ++ 实用程序并右键单击典型应用程序的客户端,工具栏或标题区域会产生以下消息跟踪信息:
<02620> 005503AE P WM_RBUTTONDOWN fwKeys:MK_RBUTTON xPos:1048 yPos:7
<02621> 005503AE P WM_RBUTTONUP fwKeys:0000 xPos:1048 yPos:7
<02622> 005503AE S WM_CONTEXTMENU hwnd:005503AE xPos:1174 yPos:63
但右键单击菜单会在Spy ++消息窗口中不生成相应的跟踪信息。因此,我认为这是标准的Windows行为。
我怀疑Windows正在生成 WM_CONTEXTMENU 消息以响应 WM_RBUTTONDOWN 和 WM_RBUTTONUP 消息,因为当您右键单击时不会生成这些消息在菜单上,不显示弹出上下文菜单。
但是如果你真的想要这种行为,你可以做的是捕获 WM_NCRBUTTONDOWN 客户端鼠标消息并在此消息处理程序中将你自己的 WM_CONTEXTMENU 消息发布到框架窗口
答案 1 :(得分:1)
感谢您指点我正确的方向。我能够通过处理WM_NCRBUTTONUP消息并在处理程序内部检查该点是否在菜单栏上来完成。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CONTEXTMENU() ON_WM_NCRBUTTONUP() END_MESSAGE_MAP() void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point) { // do not display our popup menu for title bar, etc CRect rcClient; GetClientRect(rcClient); ClientToScreen(rcClient); if (rcClient.PtInRect(point)) PopupMenu(point); else __super::OnContextMenu(pWnd, point); } void CMainFrame::OnNcRButtonUp(UINT nHitTest, CPoint point) { if (nHitTest == HTMENU) PopupMenu(point); CFrameWnd::OnNcRButtonUp(nHitTest, point); } int CMainFrame::PopupMenu(CPoint &point) { // display popup menu .... }