对话框上有编辑框(RichEdit),其他按钮,在编辑框输入后,本意是回车键就将输入内容发送出去,但是回车键就是捕不到,始终响应的换行。编辑框用一个CWnd包装,加到对话框上,在对话框中PreTranslateMessage,根本就不进来。我不太明白这个消息流程是怎么的。比如说一个对话框,上面添加一个控件,那么按键时,消息是先走对话框,然后再排到具体的控件上去?好心人,解释下,谢谢。

解决方案 »

  1.   


    BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: Add your specialized code here and/or call the base class
    if(GetDlgItem(IDC_EDIT1)->GetSafeHwnd() == pMsg->hwnd && WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
    {
    AfxMessageBox(_T("Enter Press!"));
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    你的是正确的,没错。
    但是我这里,情况可能特殊些,PreTranslateMessage根本就不进来,这点不是很明白。
    PreTranslateMessage是必然执行的?怎么做可以让消息不进来?
      

  3.   


    if (pMsg->message == WM_KEYDOWN) {
    if (GetDlgItem(IDC_EDIT1)==GetFocus())
    {
    if( pMsg->wParam==VK_RETURN)
    {
                                AfxMessageBox(_T("按键成功")); }

    }
    }
      

  4.   


    你的意思,明白,只是怎么去响应按钮点击?焦点在EDIT的时候,根本都不响应按钮,那岂不是还是没有效果?
      

  5.   

    .h中应该有:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    .cpp中是:
    BOOL CxxxxDlg::PreTranslateMessage(MSG* pMsg) 
    微软为了产生PreTranslateMessage(MSG* pMsg)在MFC中让所有的对话框都用Create,即都是非模态的,MFC的模态对话框是模拟出来的。所以PreTranslateMessage(MSG* pMsg)是一定有的。 
     
      

  6.   

    这个虚函数是有,我也重写了,就是断点不进来,对话框都创建了,也执行动作了,就是没反应,不知啥情况。我做了个测试,生成一个简单的对话框,然后重写PreTranslateMessage,断点都能进来。所以我想问的是,这个函数是不是必须执行的?如果是,为什么没有进来!
      

  7.   

    没用过richedit,不排除richedit直接将回车截获的可能。否则正常都会过主框架的PreTranslateMessage的。不成就下个钩子,判断下焦点在richedit上然后自己钩。
      

  8.   

    我很想知道,对于一个窗口,最前端截获按键等消息?WindowProc?PreTranslateMessage?
      

  9.   

    WindowProc应该早于PreTranslateMessage
    可以用OnKeyDown捕获到回车消息
      

  10.   

    还是不知道什么原因,没有进PreTranslateMessage函数,不过找了另外的解决方式。在richedit子类化中,WindowProc中捕捉回车键,然后扔给父窗口处理。这里效果实现了,可能是不太好的处理方式。先这样了。