我想捕获下EDIT的回车事件。
看了几篇前人发的帖子大部分是用PreTranslateMessage()做的我是对EDIT控件添加了一个类,在Cpp文件里直接写:
BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
{
  if(pMsg->wParam==VK_RETURN)   
  {   
  MessageBox("adsf");
  }   
  return   CEdit::PreTranslateMessage(pMsg);  
}
结果编译说:没申明我就又在。H文件里添加:
virtual bool PreTranslateMessage(MSG *pMsg);
结果编译说:重写虚函数返回类型有差异,且不是来自“CDialog::PreTranslateMessage”的 covariant我在对话框类里也试了结果一样。请问要怎么改?拜求前人指点~~我用的是VS2003~~

解决方案 »

  1.   

    如果是EDIT控件,你可以在WM_KEYDOWN中捕获
      

  2.   

    如果是EDIT控件,你可以在WM_KEYDOWN中捕获
      

  3.   

    怎么捕获?WM_KEYDOWN是对话框的消息吧,怎么弄的?VS2003没有像VC6.0那样有类向导搞得我好像少了很多事件~
      

  4.   

    BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
    {
     if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
     {
     AfxMessageBox(_T("Return key is down"));
    }
     return CEdit::PreTranslateMesage(pMsg);
    }
      

  5.   

    头文件的声明
    virtual BOOL PreTranslateMessage(MSG* pMsg);
      

  6.   

    我在头文件里加过了 virtual BOOL PreTranslateMessage(MSG* pMsg);声明了。
    报错:重写虚函数返回类型有差异,且不是来自“CDialog::PreTranslateMessage”的 covariant这是这句话的报错。也就是光在头文件里添加这句就有错误了
    virtual BOOL PreTranslateMessage(MSG* pMsg);这句话在afxwin.h里面有,我include了下也没用
      

  7.   


    等等
    我在前面说过这个函数应该是可以通过向导生成的
    你为什么要手动加
    我给你的这句代码就是我通过向导生成的
    没有任何问题
    而且你在前面也说过类型差异的问题
    你那里BOOL是小写的
    所以我才又给你贴了一遍
    virtual BOOL PreTranslateMessage(MSG* pMsg);
      

  8.   

    恩 我通过添加函数向导来添加这个函数编译是通过了。但一运行就会有个异常中断:
                       text.exe 中的 0x00413679 处未处理的异常: 0xC00000FD: Stack overflow 。
    你的可以运行的?我的代码如下:
    BOOL CtextDlg::PreTranslateMessage(MSG* pMsg)
    {
      if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)   
      {   
            MessageBox("adsf");
      }   
      return CtextDlg::PreTranslateMessage(pMsg);//一开始创建函数时这里是return 0;
    }
    在头文件里是:
    virtual BOOL PreTranslateMessage(MSG* pMsg);唉~昨天搞了一天没搞明白,换了一种方法来捕获回车事件了。这贴还留着请教吧,总归弄明白是最好的了。
      

  9.   

    BOOL CMyEdit::PreTranslateMessage(MSG* pMsg)
    {
     if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
     {
     AfxMessageBox(_T("Return key is down"));
    }
     return CEdit::PreTranslateMesage(pMsg);
    }
      

  10.   


    如果你是用向导添加的
    return CtextDlg::PreTranslateMessage(pMsg);//一开始创建函数时这里是return 0;
    这个位置不可能这么写吧?
    这里应该返回父窗口的PreTranslateMessage
    你这样处理不是递归调用了么?
    怎么能不出错
      

  11.   

    void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
      

  12.   

    void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
    }
      

  13.   


    BOOL CtextDlg::PreTranslateMessage(MSG* pMsg)
    {
      if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam && GetFocus() == GetDlgItem(控件ID))   
      {   
      MessageBox("adsf");
      }   
      return false;
    }还是用窗口的WM_KEYDOWN,只不过加个焦点判断
      

  14.   

    昨天有点事没有上
    呵呵,原来就是return的问题,我前面看的几篇前人发的帖子,就写的
    return CEdit::PreTranslateMessage(pMsg);虽然添加虚函数后是return 0;但我还是改了。
    现在可以了。能捕获回车事件了,不过捕获的时候界面上的回车事件,不能特别指定是莫一控件的回车事件。这里正好17-18楼的wutaozhao 写了一个参数  GetFocus() == GetDlgItem(控件ID) 这里控件ID写EDIT控件ID后就能只捕获EDIT的回车事件了,其它地方的回车则不会响应。
    完整的代码如下:
    BOOL Ctext1Dlg::PreTranslateMessage(MSG* pMsg)
    {
       if(WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam && GetFocus() == GetDlgItem(IDC_EDIT1))   
      {   
         MessageBox(_T("adsf"));
      } 
    return 0;
    }
    注意这是现在对话框类里面的,我试过现在EDIT增加的一个类里面 捕获不到。 
      

  15.   

    ONKeyDown 这个消息函数是怎么添加的?可以的话写下完整的过程吧,再留个技术方案~~
    虽然没什么分,就当学习讨论贴吧~
      

  16.   

    控制变量?一个好陌生的名词啊~~~~
    现在改成return 0 可以正确运行了。能正常捕获回车事件了。
      

  17.   

    从PreTranslateMessage捕获或是从OnKeyDown中捕获都可以,不过你要搞明白在Windows SDK中
    BOOL是int类型,而bool是编译器支持的布尔逻辑类型。
    bool PreTranslateMessage(MSG* pMSG)是错误的。
    BOOL PreTranslateMessage(MSG* pMSG)是正确的。BOOL CMyEdit::PreTranslateMessage(MSG* pMSG)
    {
    if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN))
    {
    TRACE(traceAppMsg, "return pressed\n");
    return TRUE;
    }
    return CEdit::PreTranslateMessage(pMsg);
    }void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    {
    if (nChar == VK_RETURN)
    {
    TRACE(traceAppMsg, "return pressed\n");
    return;
    }
    CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
    }