以前的问题还没解决,重开一贴,继续问:
往一个CEdit中输入字符,并在窗口中显示。当用
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    MyShowMessage(UINT nChar, UINT nRepCnt, UINT nFlags);
}
由于CEdit截获键盘输入,故主窗口收不到WM_KEYDOWN。
1若是通过从CEdit派生一个类解决,应该怎么做?
2若是用加速键解决,应该怎么做?
3怎么把OnKeyDown的参数传递给PreTranslateMessage?

解决方案 »

  1.   

    1)over ride PretranslateMessage hold up the messages
    if( GetFocus()->GetDlgCtrlID() == IDC_EDIT1 )
    {
         if( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN )
         {
               ...
         }
         else if
               ...
         else
               return TRUE;
         return CDialog::Pre...
    }
    2)::PostMessage
      

  2.   

    不用吧,拦Edit的UPDATA消息,每当里面的内容改变都会触发这个消息。
    另外,你的对话框要做成多线程的。
      

  3.   

    这样只能取得一部分的,消息,比如按钮,只能响应click事件等,绝大部分的基于window的消息都无法用这样的办法取得,总觉得要更方便,还是用hook,要不就控件自己放一个消息循环体
      

  4.   

    to  jennyvenus() 
     1.if( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN )
         {
               ...//这里边应该写什么?怎么能把OnKeyDown的三个参数UINT nChar, UINT nRepCnt, UINT nFlags传进pretranslatemessage?
         }
     2.能讲一下VK_RETURN 是做什么的?MSDN上面查不到这个东东。
      

  5.   

    to zswzwy(←圣骑士!帕迪拉斯!) 
    多线程还没学呢,能换种方法吗?
    现在我最想知道PreTranslateMessage
    的用法。MSDN上讲的不详细。
    我想在窗口上显示OnKeyDown的参数
    信息,怎么能传入PreTranslateMessage??
      

  6.   

    VK_RETURN是回车键的虚拟键值
    pMsg->message表示消息
    pMsg->wParam当为WM_KEYDOWN消息时,这表示是哪一个键被按下
    当你确定为那个键时,你就可以用PostMessage()把这个消息发给主窗口
      

  7.   

    使用WM_NOTIFY通知消息是个不错的办法,MFC与定义了很多通知消息,都很好用哟
      

  8.   

    PreTranslateMessage( MSG* pMsg );的pMSG中包括了你想要的参数
    具体请查看MSDN中WM_KEYDOWN的解释
      

  9.   

    to LinHanLao(凌寒):
    我的窗口是这样显示的:
    void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    CWnd *pframewnd=AfxGetMainWnd();

    ShowMessage(_T("WM_KEYDOWN"),nChar,nRepCnt,nFlags);
    }
    void CChildView::ShowMessage(LPCTSTR pmessage, UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    CString string;
    string.Format("%s%u%u%u",pmessage,nChar,nRepCnt,nFlags);
    CClientDC dc(this);
    dc.DrawText(string,&m_scroll,DT_CENTER);
    }
    现在再加上PreTranslateMessage(MSG *pMsg)
    如下:不行啊?
      

  10.   

    to LinHanLao(凌寒):
    你的意思是这样写吗?
    BOOL CChildView::PreTranslateMessage(MSG *pMsg)
    {
    if(GetFocus()->GetDlgCtrlID()==IDC_EDIT)
    if( pMsg->message == WM_KEYDOWN&&pMsg->message==VK_RETURN)
    {
    PostMessage(WM_KEYDOWN,pMsg->wParam);
    return TRUE;
    }
    return CWnd::PreTranslateMessage(pMsg);
    }不行啊,问题仍然是CEdit一得到焦点,窗口就不接受消息了。
      

  11.   

    怎样可以把OnKeyDown的参数UINT nChar, UINT nRepCnt, UINT nFlags
    传给PretranslateMessage????
    各位帮帮忙
      

  12.   

    BOOL CExpEnrollView::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    //    以下是捕捉回车消息的代码
    int keycode=pMsg->wParam;
    CEdit *pEdit=(CEdit *)pListDlg->GetDlgItem(IDC_EDIT_STUDENTID);
    if (pEdit==(CEdit *)FromHandle(pMsg->hwnd)) 
     if (pMsg->message==WM_KEYDOWN&&keycode==13) //13是回车键的代码
         AfxMessageBox("OK by PreTranslateMessage");

    return CRecordView::PreTranslateMessage(pMsg);
    }
      

  13.   

    to shofar(热爱祖国) 
    OnKeyDown的另外两个参数UINT nRepCnt, UINT nFlags还是没有传到
    PreTranslateMessage中阿!
    我要用AfxMessageBox显示UINT nRepCnt, UINT nFlags怎么办?