在子窗口最大化后当前只有一个子窗口是可见的,但是可以通过ctrl+tab来进行切换,我的目的是:
1、在程序中调用函数来切换;
2、禁止ctrl+tab切换。请问应该如何实现?

解决方案 »

  1.   

    在CMainFrame::PreTranslateMessage中可以捕获到所有属于该窗口和下属窗口的消息,所以你可以检查WM_KEYDOWN消息,然后判断是不是属于其中MDI子窗口的,就可以实现屏蔽Ctrl-TAB了。实现起来有点麻烦。
      

  2.   

    另一个办法是子类化MDIClient。只有发送WM_MDIACTIVATE消息给MDIClient,才会切换子窗口。按下CTRL-TAB键也是通过发送这个消息来切换子窗口的,所以可以截获WM_MDIACTIVATE消息,并检查是否满足某种条件,满足条件才切换。这样可以做到只有通过调用自己的函数才切换子窗口。
      

  3.   

    或者在CChildFrame::PreTranslateMessage中处理,这比在CMainFrame::PreTranslateMessage中处理要方便很多。
      

  4.   

    比如在CChildFrame::PreTranslateMessage中是这样的:
    BOOL CChildFrame::PreTranslateMessage(MSG* pMsg) 
    {
    // if ((pMsg->hwnd == m_hWnd))
    {
    if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
    if (pMsg->wParam == VK_TAB) // 还要判断是否按下CTRL
    {
    TRACE(_T("%x %x\n"), pMsg->hwnd, m_hWnd);
    return TRUE;   // 该消息已处理,不要DispatchMessage了
    }
    }
    }
    return CMDIChildWnd::PreTranslateMessage(pMsg);
    }
      

  5.   

    子类化mdi client有意思。我用这个方法试一试。谢谢了。结贴