最近编写Atl的ActiveX控件遇到一个问题就是无窗口的ActiveX怎么响应Tab及方向键的激活,有窗口没问题,无窗口时很多原来在框架的事件无效了
知道的高手请不吝赐教!最好给出代码段,100分奉上!

解决方案 »

  1.   

    http://support.microsoft.com/kb/318034
    参考了这个帖子
    但是代码放入后STDMETHOD(OnFrameWindowActivate)(BOOL fActivate);
    用来响应的这个函数一直没有反应,从来不调用,怎么回事???
      

  2.   

    无窗体控件自己不包含窗口句柄,不能像窗体控件一样被激活,但是可以捕获Windows消息进行定制处理。
      

  3.   

    无窗口的框架的窗口句柄无效,但是他内部含有CContainedWindow的句柄,现在主要是有个问题在occdlg.cpp中有段代码
    BOOL COccManager::IsDialogMessage(CWnd* pWndDlg, LPMSG lpMsg)
    {
            ...............
    case WM_KEYDOWN:
    code = _AfxGetDlgCode(pWndMsg, lpMsg);
    switch (LOWORD(lpMsg->wParam))
    {
    case VK_TAB:
    {
    if (code & DLGC_WANTTAB)    // If control wants tabs, bail out.
    break; bBack = GetKeyState(VK_SHIFT) < 0;
    pSiteOrWnd = pWndDlg->GetNextDlgTabItem((COleControlSiteOrWnd*)NULL, bBack);
             ...............
    }
    GetNextDlgTabItem无法取得预定无窗口的ActiveX的Tab键顺序,直接把无窗口的ActiveX控件给跳过去了,
    难道真没有解决办法?
      

  4.   

    无窗口控件应该实现IOleInPlaceObjectWindowless接口,通过OnWindowMessage方法来处理消息
      

  5.   

    有个问题就是无法得知Tab键按下是否激活我的当前控件?因为调试跟踪时发现pSiteOrWnd = pWndDlg->GetNextDlgTabItem((COleControlSiteOrWnd*)NULL, bBack); 在此处调用过程中取得的激活控件不是预期的或是在资源编辑时预先设置的顺序!!然则,实现IOleInPlaceObjectWindowless接口,通过OnWindowMessage方法是否真的能解决问题?
      

  6.   

    重载 COleControl 的消息预处理函数 PreTranslateMessage(MSG* pMsg)
    PreTranslateMessage(MSG* pMsg)
    {
      if(pMsg->message == WM_KEYUP)
      {
        if(pMsg->wParam == VK_TAB)
          Beep(1000,100);
      }
      …… 
    }
      

  7.   

    其实无窗口控件只要实现了IOleInPlaceObjectWindowless接口,TAB或方向键激活就是自动的,因为这是通过IOleInPlaceSiteWindowless容器接口来完成的,跟控件无关。OnWindowMessage方法只是提供了一个机会来处理其它窗口消息而已,不像有窗口控件能直接处理消息。
      

  8.   

    在此先感谢jameshooo的不断关注,此贴现先挂一段时间,希望能有各位达人能给出更简单有效的方法,两天后结帖
      

  9.   

    既然无窗口,哪里来的响应tab键?