程序里有一个Dialog,运行时会new一个自定义的CTabCtrl,在这个CTabCtrl中会new一个CWnd,然后这个CWnd会CreateControl一个WebBrowser,最后,这个WebBrowser会导航到某一个页面。
现在发现当焦点在WebBrowser浏览的页面上的时候,如果按下Tab键,焦点会直接跳转到Dialog的其他控件上。
请问如何才能防止焦点从子控件跳出到父控件,让它在WebBrowser浏览的页面内跳转呢。PS:如果是在Dialog中直接拉一个WebBrowser,就不会出这样的问题~~

解决方案 »

  1.   

    猜测一下,你的WebBrowser在创建的时候有没有指定;WS_TABSTOP样式啊
      

  2.   

    指定了WS_TABSTOP样式,并且用SetWindowPos设置了Tab顺寻,可是还是不行啊,郁闷
      

  3.   

    在PreTranslateMessage中处理WM_KEYDOWN事件,当pMsg->wParam == VK_TAB就处理一下
      

  4.   

    没做过,提供个思路,你可以试下
    捕捉tab按键消息,当焦点在web时不再往下传,直接返回,这样父窗口就不会收到tab按键消息
      

  5.   

    先enum说有的子窗口HWND,保存到m_hWndArray[MAX_HWND],然后在pMsg->wParam = VK_TAB处理中SetFocus(m_hWndArray[(m_nIndex++)%MAX_HWND]);这样应该可以的
      

  6.   

    试了一下,当捕获到Tab按键事件的时候,不管是返回TRUE还是FALSE,虽然焦点不会跳出到父控件,但是子控件也无法响应该事件。看来还是需要把这个事件发送给子控件。该怎么发送呢?
      

  7.   

    没有试,且不说效率问题,ENUM所有子窗口的HWnd应该不能枚举到WebBrowser浏览的页面内的元素吧?
    而且就算能枚举到页面内的元素,如果当前焦点在页面的最后一个控件上,应该还是会跳出来吧~
      

  8.   

    在CTabCtrl的PreTranslateMessage里捕获的。
    刚才说错了,当返回FALSE的时候,还是会跳出到父控件。只有当返回TRUE的时候才不会跳出,但子控件自身也不会响应。
      

  9.   

    pretranslate这个点不对,在这个地方处理,子控件是收不到消息的
    应该是在本控件处理完之后来捕捉,然后返回true,截断消息链
      

  10.   

    必须在 PreTranslateMessage 里给浏览器控件一个处理的机会,不然键盘鼠标消息都是主窗口在控制。不光是浏览器控件,任何ActiveX控件都要这样做。BOOL CxxxWnd::PreTranslateMessage(LPMSG lpMsg)
    {
      IOleInPlaceActiveObject* pActiveObject; // 从浏览器控件查询这个接口
      if (pActiveObject->TranslateAccelerator(lpMsg) == S_OK) // 给控件机会处理键盘鼠标消息
        return TRUE;
      return __super::PreTranslateMessage(lpMsg);
    }
      

  11.   

    谢谢jameshooo大帅哥,就是这么搞定滴~~太帅了结贴~