说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

CMainFrame 中为什么不能响应切分视右键弹出的菜单消息?

编辑:说三道四文库 发布时间:2018-08-20 06:18
HTML文档下载 WORD文档下载 PDF文档下载
切分成两个视图,我在右边视图响应右键弹出一个菜单,然后在CMainFrame中映射了该事件的响应,可捕捉不到该事件,为什么?有什么方法解决?
直接在视图中响应,用PostMessage或SendMessage将消息传送到CMainFrame中。
那你一定是把消息接受对象搞错拉
在CView中加入WM_RBUTTONUP的响应函数OnRButtonUp,在其中加入代码:

{
ClientToScreen(&point);
GetParent()->GetMenu()->GetSubMenu(4)->TrackPopupMenu(
TPM_LEFTALIGN,point.x,point.y,GetParent());
}
jnxulei(石头) 你说的方法我试过,但PostMessage或SendMessage的消息,CMainFrame没收到。
没有搞清楚你说的,但我想应该是这样做的:
void CTreeViewClass::OnRButtonDown(UINT nFlags, CPoint point)
{
CMenu menu;
CMenu *ptrMenu;
         CTreeCtrl& m_tree = GetTreeCtrl();
                  m_tree.ScreenToClient( &point);
menu.LoadMenu(IDR_FUN_POPUP);
ptrMenu=menu.GetSubMenu(0);
ptrMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x,
point.y,
this,
NULL);
}

并在同一个类中添加弹出菜单项的消息响应函数:

ON_COMMAND(IDR_FUNPOPUP_TEST, OnFunTest)
void CTreeViewClass::OnFunTest()
{
  ****;
  ......
}
至少有两类方法,一种是右键鼠标消息来处理,另一种是处理WM_CONTEXTMENU窗口消息(推荐使用)。范例代码如下:IDR_GISPROPERTY为指定的菜单资源。
1.右键鼠标消息
void CRightView::OnRButtonDown(UINT nFlags, CPoint point) 
{

// TODO: Add your message handler code here and/or call default
CMenu menuMain;
if(!menuMain.LoadMenu(IDR_GISPROPERTY))
return;
    CMenu* pRecordMenu = menuMain.GetSubMenu(2);    
    ASSERT(pRecordMenu);
    ClientToScreen(&point);
    pRecordMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_LEFTBUTTON, point.x, 
      point.y, this);

CScrollView::OnRButtonDown(nFlags, point);
}
2.处理WM_CONTEXTMENU窗口消息
void CRightView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
// TODO: Add your message handler code here
CMenu menuMain;
if(!menuMain.LoadMenu(IDR_GISPROPERTY))
return;
    CMenu* pRecordMenu = menuMain.GetSubMenu(2);    
    ASSERT(pRecordMenu);
    pRecordMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON| TPM_RIGHTBUTTON, point.x, 
      point.y, this);

}
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘