在MFC应用程序主机菜单栏上显示上下文菜单

时间:2009-10-18 15:26:44

标签: mfc

我有VC ++ MFC应用程序,我需要在CMainFrame菜单栏上显示上下文菜单。我在CMainFrame中为WM_CONTEXTMENU添加了一个处理程序,我可以在工具栏上显示我的上下文菜单(也是窗口标题),但是当我在菜单栏中右键单击时,不会调用句柄

2 个答案:

答案 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
  ....
}