一个对话框
对话框里有一个子窗口,是我自定义的类,继承CWnd
我在这个自定义的类中相应WM_KEYDOWN和WM_CHAR消息,但发现OnKeyDown 和 OnChar并没有进入
但这个派生类的PreTransMessage中能捕捉到.
现在我只能在PreTransMessage拦截WM_KEYDOWN,再调用OnKeyDown,问题是处理完之后如果没有return TRUE,比如如果按了方向键,就会把焦点移到另外的控件上(这应该是对话框默认的行为吧),这不是我想要的
如果return TRUE,WM_CHAR就根本不会捕捉到了。
尽管有一系列方法,比如拦截WM_KEYDOWN判断键值决定是要不要return TRUE,或者直接转化后调用OnChar但我总觉得这不是好办法。

解决方案 »

  1.   

    1、重载PreTranslateMessage函数BOOL    CXXXDlg::PreTranslateMessage(MSG*    pMsg)   
       {   
           if(pMsg->message==WM_KEYDOWN    &&    pMsg->wParam==VK_RETURN)   
                   return    TRUE;   
            
           return    CDialog::PreTranslateMessage(pMsg);   
       }
    2、映射WM_GETDLGCODE消息BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
                ON_WM_GETDLGCODE()
                ON_WM_KEYDOWN()
           END_MESSAGE_MAP()       UINT CMyEdit::OnGetDlgCode()
           {            return DLGC_WANTARROWS|DLGC_WANTALLKEYS|DLGC_WANTCHARS;
           }
    void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
          {
                //Check if the key pressed was a DOWN ARROW key
                if (nChar == VK_DOWN)
                     AfxMessageBox("It is a down arrow key!");
                if (nChar == VK_RIGHT)
                     AfxMessageBox("It is a right arrow key!");
                if (nChar == VK_LEFT)
                     AfxMessageBox("It is a left arrow key!");
                if (nChar == VK_UP)
                     AfxMessageBox("It is a up arrow key!");
                CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
           }
      

  2.   

    对话框默认是不直接处理WM_KEYDOWN消息的,你可以重载PreTranslateMessage虚函数,在它里面处理WM_KEYDONW或者WM_CHAR消息
      

  3.   

    恩,刚刚也在网上看到了OnGetDlgCode这个方式
    谢谢