我基于CGridCtrl做了一个网格控件,但将控件镶嵌入IE里,不能响应回车键或左右键,有哪一位高手能告诉我具体原因吗?万分感激!

解决方案 »

  1.   

    还有BkSpace键、HOME键等等,都被IE处理掉了
      

  2.   

    下面使我当时屏蔽BackeSpace时写的心得
    你参考一下,屏蔽<- 一个道理没时间整理了,见凉如果仅仅是用键盘钩子,则在输入VK_BACK键的情况下向焦点窗口(EDIT)
    发送WM_KEYUP事件并且返回1,则只有Edit响应而IE不响应,返回0,二者都响应,页面退回上一页面!发WM_KEYDOWN无论返回1与否,只有IE响应退回前一页面。由此得出结论:二者均响应WM_KEYUP事件,第一种情况将此消息过滤掉了,IE接受不到,其他三种IE均接受到了,所以退回上一页面。正确代码如下:
            LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

    switch(wParam)
               {
                  case VK_BACK:
                 ::PostMessage(GetFocus(),WM_KEYUP,wParam,lParam);
              return 1;
              break;
              }

                   LRESULT RetVal = CallNextHookEx( g_hhook, nCode, wParam, lParam ); 
                   return RetVal;
    }       如果不用钩子,而是用昨天找到的资料所显示,则需要在3个地方加代码
    1:在CActivexCtl::OnCreate()中加代码OnActivateInPlace (TRUE, NULL);:
    int CFtpSeviceCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (COleControl::OnCreate(lpCreateStruct) == -1)
    return -1;
    OnActivateInPlace (TRUE, NULL);           // == UI-Activate the control
    return 0;
    }
    注:经测试加了这一句以后所有的Edit都可以响应BackSpace按键的消息了
    重载PreTranslateMessage和OnMouseActivate两个虚拟函数,代码如下:
    int CFtpSeviceCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) 
    {
        if (!m_bUIActive)
              OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
        
    return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
    }
           BOOL CFtpSeviceCtrl::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:
    case VK_BACK:
                      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);
    }  注意:1:在case VK_END: 后面千万不要加case VK_BACK: 不然BackSpace按键消息会被过滤掉。
    2:将SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);这一句替换成
    ::SendMessage (GetFocus()->GetSafeHwnd(), pMsg->message, pMsg->wParam, pMsg->lParam);或
    m_pFtpDlg->SendMessage(WM_TRANSMESSAGW, pMsg->message, pMsg->wParam);
    其中后面一种需要在m_pFtpDlg中再将消息传递给具有焦点的控件,我采用的后者。
         
      

  3.   

    为什么??error C2065: 'OnActivateInPlace' : undeclared identifier
    我怎么没找到他的定义文件在哪里呀
      

  4.   

    重载 PreTranslateAccelerator 处理返回TRUE
    不处理返回FALSE
      

  5.   

    我以前也遇到过, 原因是那几个键都是系统键它的消息被你的ie(你控件的容器)提前截获了,解决办法是添加一个:
    MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode)
    在处理中只要改变返回值就可以了:
    LRESULT OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. 
    return DLGC_WANTARROWS;//截获上下左右键,很简单吧!没问题的!
    }
      

  6.   

    非常感谢各位!问题已解决。
    总结:
    1.如控件窗口为继承COleControl的窗口,则用wangweixing2000(星)的解答即可;
    2.如控件窗口用其它窗口作为显示窗口,比如我的程序里用CGridCtrl作为显示窗口,则需要用Ariesman(超然)的解答。再次感谢各位!
      

  7.   

    为什么??error C2065: 'OnActivateInPlace' : undeclared identifier
    我怎么没找到他的定义文件在哪里呀这个怎么回事?