none
如何判断CDockablePane的是被关掉还是隐藏在Tab中? RRS feed

  • 问题

  • 程序中,很多CDockablePane。有的被X掉以后需要显示出来。

    然后做了一个对话框,里面用列表显示所有CDockablePane的显示状态。但是如果用CDockablePane->IsVisible/IsWindowVisible的话,虽然被X掉的Pane是False,但是有一些在Tab中没有显示的也是False。

    就是说IsVisible对于那些处于Tab状态下没有激活显示的Tab也是False。

    如何区分这种情况:被关掉的CDockablePane与Tab中被隐藏的CDockablePane?

    2017年2月11日 12:25

全部回复

  • 看看CDockablePane::ShowPane里面的代码……


    Visual C++ MVP

    2017年2月11日 12:56
    版主
  • Hi BruceLiu_sh,

    感谢在MSDN论坛发帖。

    >>如何区分这种情况:被关掉的CDockablePane与Tab中被隐藏的CDockablePane?

    对于这种情况,我建议你通过CDockablePane::HitTest检测AFX_HTCLOSE消息。查看用户是否按下了关闭键。记录CDockablePane的显示状态。然后再通过IsVisible和CDockablePane::IsHideInAutoHideMode 属性判断CDockablePane是否激活。

    如果可停靠窗格处于自动隐藏模式并且IsHideInAutoHideMode返回FALSE,则IsVisible始终为FALSE。

    如果可停靠窗格处于自动隐藏模式并且IsHideInAutoHideMode返回TRUE,则IsVisible取决于相关自动隐藏工具栏的可见性状态。

    如果可停靠窗格不处于自动隐藏模式,则可见性状态由CBasePane :: IsVisible方法确定。

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年2月13日 3:03
  • 看了ShowPane中的源码,没有启发。里面连续用了:IsAutoHide/IsTabbed/IsFloating/IsMDITabbed,均返回为假时,调用了ShowWindow,然后在调整位置到Container。

    还是无法判别:是处于非活动的Tab页面,还是已关闭的Pane。如何区分这两种情况?

    2017年2月13日 3:07
  • Hi BruceLiu_sh,

    >>还是无法判别:是处于非活动的Tab页面,还是已关闭的Pane。如何区分这两种情况?

    在MFC中,关闭CDockablePane也只是隐藏起来,并不是彻底关闭。

    你可以尝试重载CMainFrame::OnCloseDockingPane函数,彻底关闭CDockablePane,并记录状态。例如:

    BOOL CMainFrame::OnCloseDockingPane(CDockablePane* pWnd)
     {
         //处理关闭事件
         if(pWnd->IsKindOf(RUNTIME_CLASS(CTabbedPane))){ //多个窗口
             CTabbedPane* tabpane = (CTabbedPane *)pWnd;
    
             CMFCBaseTabCtrl* pTabWnd = tabpane->GetUnderlyingWindow();
             int num = pTabWnd->GetActiveTab();
             if(num >= 0){ //这里仅仅关闭活动的面板
                 CDockablePane* pBar = DYNAMIC_DOWNCAST(CDockablePane, pTabWnd->GetTabWnd(num));
                 if (pBar != NULL)
                 {
                     ASSERT_VALID(pBar);
                       //将关闭消息加入该DockPane队列,等待完成本函数后关闭
                     ::PostMessageA(pBar->m_hWnd ,WM_CLOSE, 0 , 0);
                 }
             }
         }
         else{ //单个窗口
             CDockablePane* pane = (CDockablePane*)pWnd;
             if(pane->IsKindOf(RUNTIME_CLASS(CDockablePane)) || pane->IsKindOf(RUNTIME_CLASS(CPane)) && !pane->IsKindOf(RUNTIME_CLASS(CMFCToolBar))){
                 //将关闭消息加入该DockPane队列,等待完成本函数后关闭
                 ::PostMessageA(pane->m_hWnd ,WM_CLOSE, 0 , 0);
             }
         }
        
         return TRUE;
     }

    详细内容可以参考以下文档。

    http://blog.csdn.net/songshu1007/article/details/25394869

    希望对你有所帮助。

    Best Regards,
    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年2月21日 8:38