询问者
如何判断CDockablePane的是被关掉还是隐藏在Tab中?

问题
全部回复
-
-
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 YuMSDN 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. -
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 YuMSDN 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.