MFC单文档程序,我在视图上放了一个子对话框。为什么焦点在对话框上的控件上时,View类不响应OnKeyDown消息??怎么让无论焦点在哪,View都能响应OnKeyDown消息???

解决方案 »

  1.   

    这种情况下,截取消息呀!
    截取所有的keydown消息!得到有用的
      

  2.   

    重载 virtual BOOL PreTranslateMessage(MSG* pMsg);
    在里面
    if(pMsg->message==WM_KEYDOWN)
    {}
      

  3.   

    不好意思,我还是不明白
    View的PreTranslateMessage(MSG* pMsg)还是子对话框的PreTranslateMessage(MSG* pMsg)???
      

  4.   


    那还用View的OnKeyDown消息响应函数吗?
      

  5.   

    用这个,你已经得到了你的消息,所以,不用OnKeyDown,完全可以的!
      

  6.   


    我试了,点击对话框上的控件后,View的PreTranslateMessage不响应
      

  7.   

    BOOL CXXView::PreTranslateMessage(MSG* pMsg)
    {
     if(WM_KEYDOWN = pMsg->message)
     {
      // Handler WM_KEYDOWN 
      // If you handle this messsage and not to continue, please return TRUE directly.
     }
     return CView::PreTranslateMessage(pMsg);
    }
      

  8.   


    点击了对话框上的控件后,再按键进不到View的PreTranslateMessage里
      

  9.   

    那你就在对话框中处理,然后转发给View类
      

  10.   

    GetParent()->PostMessage/SendMessage(WM_KEYDOWN, ...);
      

  11.   


    消息传过去了。可是还有一个奇怪的现象,我想在CXXView::PreTranslateMessage(MSG* pMsg)里处理方向键按下的消息,不响应,前面加了个MessageBox就响应了。好奇怪啊!怎么回事?
      

  12.   

    代码是这样的
    BOOL CARappView::PreTranslateMessage(MSG* pMsg) 
    {
        if( pMsg->message==WM_KEYDOWN )
        {
            MessageBox("View KeyDown");//不加这句,按右键不弹出“Right”;加上这句,第一次按右键不弹出“Right”,之后再按才弹出“Right”

    switch( pMsg->wParam )
    {
                case VK_RIGHT:
            MessageBox("Right");
            break;
        case VK_LEFT:
    break;
        case VK_UP:
    break;
        case VK_DOWN:
    break;
    }
        }
        return CView::PreTranslateMessage(pMsg);
    }