wm_rbuttondown
wm_contextmenu这个2个消息是怎么回事, 怎么不响应,别粘贴网上的东西,希望亲自做过实验回复我,多谢。我试过了,  有时候只有一个ie消息相应, 另一个不响应。这是怎么回事

解决方案 »

  1.   


    不需要,你新建一个单文档工程,然后再CMainFrame里 添加 2个函数:OnContextMenuOnRbuttonDown然后 右键 就可以验证问题了void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
    {
    // TODO: 在此处添加消息处理程序代码
    char buf[100]={0};
    sprintf(buf,"OnContextMenu\r\n");
    if(g_File.m_hFile!=INVALID_HANDLE_VALUE)
    {
    g_File.Write(buf,strlen(buf));
    }
    }void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 char buf[100]={0};
    sprintf(buf,"OnRButtonDown");
    if(g_File.m_hFile!=INVALID_HANDLE_VALUE)
    {
    g_File.Write(buf,strlen(buf));
    } CFrameWnd::OnRButtonDown(nFlags, point);
    }这是我的测试代码 日志里记录OnContextMenu ,说明只有这个函数被执行!!
    但是我再其他项目中发现 ,OnRButtonDown也会被相应,怎么回事?
      

  2.   

    http://bbs.csdn.net/topics/10322443
      

  3.   


    你看吧:
    void CsssView::OnRButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnRButtonDown(nFlags, point);
    }void CsssView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
    {
    // TODO: 在此处添加消息处理程序代码
    AfxMessageBox(_T("OnContextMenu"));
    }
    结果 oncontextmenu不会响应了,怎么回事?我已经把  cmainframe里的 相应宏注释掉了
      

  4.   

    http://blog.csdn.net/shuilan0066/article/details/7678747
      

  5.   


    因此,若程序还响应了鼠标右键按下的消息OnRButtonDown,且在此响应函数中有模特对话框出现的话,则不会响应WM_CONTEXTMENU消息。亲,你看我的,有模式对话框?没有。你的文章,我昨天就看过了
    虽然没有解决问题,依然感谢你
      

  6.   

    不要用“AfxMessageBox(_T("OnContextMenu"));”
    使用 afxDump << "OnContextMenu" << "\n";
    AfxMessageBox 改变了 鼠标 点击。
      

  7.   


    多谢,修改测试结果:1. 2个消息相应函数均在view中的话,那么都执行。代码为:void CsssView::OnRButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 afxDump<<_T("OnRButtonDown\r\n");
    CView::OnRButtonDown(nFlags, point);
    }void CsssView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/)
    {
    // TODO: 在此处添加消息处理程序代码
    afxDump<<_T("OnContextMenu\r\n");
    }2. 如果两个都放在 mainframe里, 发现wm_rbuttondown不会响应。可能被view拦截了。
    结论:对于从sdk一路过来的人很迷惑, 有的消息不是你有响应代码了,就会运行, 可能会被其他窗口给拦截了。具体拦截原因,可能与mfc的设计有关
    在做实验1的时候, 两个消息均放在view中处理, 用afxDump来打印,发现一个奇怪的问题
    OnRButtonDownOnContextMenu注意一共有3行,第2行是空白行 ,为什么会有第2行的产生呢?按照windows的规定,  '\r\n'所做的仅仅是换行, 所以按理来推论: 不应该有3行,只有有2行,仅此而已。
      

  8.   

    “2. 如果两个都放在 mainframe里, 发现wm_rbuttondown不会响应。”
    是有这个问题。
    3. 如果两个都放在 view 里, 2个 都会执行。
      

  9.   

    OnRButtonDownOnContextMenu
    这里如何解释呢?  第二行是空白行,  按照windows的规定,  '\r\n'所做的仅仅是换行, 所以按理来推论: 不应该有3行,只有2行,仅此而已。 可是afxdump的结果是3行,很是不解。
      

  10.   

    afxDump<<_T("OnRButtonDown\r\n");
    不需要用 \r\n
    只要 \n 就够了。
    \r 被 当 成 \n 了mainframe 通常 是 被 view 覆盖了, 
    所以 只是 在 toolbar 附近 可以 OnContextMenu
      

  11.   


    这个结论不对吧,  你试试右键点击view区域, CMainfram也会收到wm_contextmenu的。(前提是: 当framewnd来拦截 wm_contextmenu)
    可以结贴了,多谢
      

  12.   

    你 view里 没有 就会“CMainfram收到wm_contextmenu的”
    直接 让 CMainfram 收到 wm_contextmenu ,要在 工具条 附近 R点击!
      

  13.   

    直接 让 CMainfram 收到 wm_contextmenu ,要在 工具条 附近 R点击我的win7, vs2008做的实验, 并不需要在你说的那个地方点击,  很多只要在客户区域就可以了。你的可能是老系统吧
      

  14.   

    vc6 xp
    道理上 如果 view 里 响应,那么 mainframe 里 就不需要响应,这是 消息 的 传递路径。
     win7 改了 ?