基于static的一个atl com控件,我想让它能接受'-','+' 还有上下左右箭头,共6个。
我处理了控件的WM_KEYDOWN消息,但发现根本没有进入我的处理函数,我在使用控件时也Focus()了,??喂啥?怎么做才能实现这个功能?
谢谢诶!

解决方案 »

  1.   

    Knowledge Base  
    PRB: MFC ActiveX Control in IE Doesn't Detect Keystrokes
    This article was previously published under Q168777
    PRB: TranslateAccelerator() Not Called for ActiveX Controls
    This article was previously published under Q183167
    HOWTO: Add Toolbars and Tooltips to ActiveX Controls
    This article was previously published under Q194294
    PRB: Enabling Menu Mnemonics in an MFC ActiveX Control
    This article was previously published under Q199431
    PRB: MFC ActiveX Control Ignores ARROW Keys on VB Container
    This article was previously published under Q180402
    PRB: ActiveX Control Is the Parent Window of Modeless Dialog
    This article was previously published under Q187988
    // Trap keys and forward on to the control.
       BOOL CMyEditCtrl::PreTranslateMessage(MSG* pMsg)
       {
          switch (pMsg->message)
          {
             case WM_KEYDOWN:
             case WM_KEYUP:
                switch (pMsg->wParam)
                {
                   case VK_UP:
                   case VK_DOWN:
                   case VK_LEFT:
                   case VK_RIGHT:
                   case VK_HOME:
                   case VK_END:
                      SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
                      // Windowless controls won't be able to call SendMessage.
                      // Instead, just respond to the message here.
                      return TRUE;
                }
                break;
          }
          return COleControl::PreTranslateMessage(pMsg);
       }
      

  2.   

    谢谢两位!1)PRB: TranslateAccelerator() Not Called for ActiveX Controls??why?
    我在消息重写那儿只有TranslateAccelerator()可选,没有PreTranslateMessage!
    2)我的控件是基于static的,不是edit的,它能得到键盘输入吗?和edit的有不同吗?
    我用VS2003 c++的。
      

  3.   

    基于Edit, LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    switch(wParam ) {
    case VK_LEFT:
    ::MessageBox(NULL,"VK_LEFT","",MB_OK);
    break;
    case VK_RIGHT:
    ::MessageBox(NULL,"VK_RIGHT","",MB_OK);
    break;
    case VK_UP:
    ::MessageBox(NULL,"VK_UP","",MB_OK);
    break;
    case VK_DOWN:
    ::MessageBox(NULL,"VK_DOWN","",MB_OK);
    break;
    default:
    ;
    } return 0;
    }
      

  4.   

    搞定,我是基于static的,也可以的!
    处理这两个就可以了:
    TranslateAccelerator()
    OnKeyDown()
    谢谢两位星星!谢谢!!