1、在不重载CEDIT的情况下,怎样屏蔽CEDIT的右键菜单。
2、CEDIT的右键菜单没有触发WM_INITMENUPOPUP事件,怎样才能在CEDIT右键菜单中加入自己的项目

解决方案 »

  1.   

    在PreTranslateMessage中拦截并过滤消息?
      

  2.   

    没有用,在CEDIT所在的CWND中的WindowProc,DefWindowProc,PreTranslateMessage和重载的CEDIT类的WindowProc,DefWindowProc,PreTranslateMessage中都没有拦截到WM_INITMENU 、WM_INITMENUPOPUP 消息。
    如果在重载的CEDIT类中响应了ON_WM_CONTEXTMENU的事件后,就可以拦截到WM_INITMENU 、WM_INITMENUPOPUP 消息,但响应了ON_WM_CONTEXTMENU的事件后,CEDIT就不出来原来自带的右键菜单了。
      

  3.   

    //我这里有个思路,代码如下BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if(WM_RBUTTONDOWN == pMsg->message)
    {
    //HandleEditRButtonDown(...)是右键单击处理函数,自己定义
    if(HandleEditRButtonDown(pMsg->pt.x,pMsg->pt.y))
    return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
    //处理右键单击
    BOOL CTestDlg::HandleEditRButtonDown(int x, int y)
    {
    RECT rect;
    CMenu menu;
    CMenu *pSubMenu=NULL;
    m_edit.GetClientRect(&rect);//m_edit就是要处理的编辑框关联变量
    m_edit.ClientToScreen(&rect);
    //确保右键单击是在编辑框内
    if(x >= rect.left && x <= rect.right &&
    y >= rect.top && rect.bottom)
    {
    //in edit
    VERIFY(menu.LoadMenu(IDR_MENU));
    if(menu.m_hMenu)
    {
    pSubMenu=menu.GetSubMenu(0);
    pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,x,y,this);
    pSubMenu->Detach();
    }
    else return FALSE;
    return TRUE;
    }
    return FALSE;
    }
      

  4.   

    试过用GetSysMenu, GetMenu,取不了句柄,否则倒不是难事。
      

  5.   

    支持在PreTranslateMessage里面做手脚.
      

  6.   

    谢谢qifa()的建议,我再试试
    第一个问题还有没有更简单的方法来屏闭掉CEDIT的右键菜单,比如设置CEDIT的属性
    第二个问题是能不能在CEDIT的右键上加上自己的菜单