2009-10-18 88 views
1

我有VC++ MFC应用程序,我需要在CMainFrame菜单栏上显示上下文菜单。我在CMainFrame中增加了一个处理程序WM_CONTEXTMENU,我能够在工具栏中(也窗口标题)上,即可显示我的上下文菜单,但是手柄,当我在菜单栏在MFC应用程序主机上显示上下文菜单菜单栏

回答

3

右键点击使用间谍++实用程序不被调用和关于在以下消息跟踪信息的一个典型应用的结果的客户机,工具栏或标题区域右击:在菜单上

<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 

但是右击产生在间谍++消息窗口没有相应的跟踪信息。所以它看起来像这是标准的Windows行为。

我怀疑的Windows响应生成WM_CONTEXTMENU消息给WM_RBUTTONDOWNWM_RBUTTONUP消息,并因为这些当你右击菜单上,不显示弹出式上下文菜单中也不会产生。

但是,如果你真的想这样的行为,你可以做的是陷阱WM_NCRBUTTONDOWN客户端鼠标消息,此消息处理程序中发布自己的WM_CONTEXTMENU消息框架窗口。

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