隐藏 CPaneDivider

     在MFC中使用CDockablePane时,隐藏CPaneDivider 的方法:

     一、在CMainFrame定义函数 GetDockingManagerEx()

CDockingManager* CMainFrame::GetDockingManagerEx()
{
	return GetDockingManager();

}

     二、创建 类 CMyDockablePane,继承自 CDockablePane

     (1) 定义函数 CreateDefaultPaneDividerEx


CPaneDivider* __stdcall CMyDockablePane::CreateDefaultPaneDividerEx(DWORD dwAlignment, CWnd* pParent, CRuntimeClass* pSliderRTC, int nWidth/* = 0*/)
{
	CRect rectSlider(0, 0, nWidth, nWidth);
	WORD dwSliderStyle = CPaneDivider::SS_HORZ;

	if (dwAlignment & CBRS_ALIGN_LEFT || dwAlignment & CBRS_ALIGN_RIGHT)
	{
		dwSliderStyle = CPaneDivider::SS_VERT;
	}

	// create a slider with a control bar container
	CPaneDivider* pSlider = NULL;
	if (pSliderRTC != NULL)
	{
		pSlider = DYNAMIC_DOWNCAST(CPaneDivider, pSliderRTC->CreateObject());
		ASSERT_VALID(pSlider);
		//pSlider->SetDefaultMode(TRUE);
	}
	else
	{
		pSlider = DYNAMIC_DOWNCAST(CPaneDivider, CPaneDivider::m_pSliderRTC->CreateObject());
		ASSERT_VALID(pSlider);

		if (pSlider)
		{
			pSlider->Init(TRUE);
		}
	}

	if (pSlider && !pSlider->CreateEx(0, dwSliderStyle | WS_VISIBLE, rectSlider, pParent, (UINT) -1, NULL))
	{
		TRACE0("Can't create default slider while docking\n");
		delete pSlider;
		return NULL;
	}

	if (pSlider)
	{
		pSlider->SetPaneAlignment(dwAlignment);
	}

	return pSlider;
}

     (2)重载SetAutoHideMode,调用上面的CreateDefaultPaneDividerEx、GetDockingManagerEx

CMFCAutoHideBar* CMyDockablePane::SetAutoHideMode(BOOL bMode, DWORD dwAlignment, CMFCAutoHideBar* pCurrAutoHideBar, BOOL bUseTimer)
{
	if( !m_bCreated )
	{
		return NULL;
	}

	ASSERT_VALID(this);
	ASSERT(dwAlignment & CBRS_ALIGN_ANY);

	if (bMode == IsAutoHideMode())
	{
		return pCurrAutoHideBar;
	}

	CDockingManager* pDockManager =  ((CMainFrame*)AfxGetMainWnd())->GetDockingManagerEx();

	if (bMode)
	{
		m_bPinState = TRUE;

		CRect rectBeforeUndock;
		GetWindowRect(rectBeforeUndock);
		GetDockSiteFrameWnd()->ScreenToClient(rectBeforeUndock);

		StoreRecentDockSiteInfo();
		// set autohide mode
		UndockPane(FALSE);

		CPaneDivider* pDefaultSlider = GetDefaultPaneDivider();
		ENSURE(pDefaultSlider == NULL);
		pDefaultSlider = CreateDefaultPaneDividerEx(dwAlignment, GetDockSiteFrameWnd(), 0, 0);

		if (pDefaultSlider == NULL)
		{
			TRACE0("Failed to create default slider\n");
			DockPane(this, NULL, DM_DBL_CLICK);
			return NULL;
		}

		m_hDefaultSlider = pDefaultSlider->m_hWnd;
		pDefaultSlider->SetAutoHideMode(TRUE);
		pDefaultSlider->AddPane(this);
		SetPaneAlignment(dwAlignment);
		pDefaultSlider->SetPaneAlignment(dwAlignment);

		pCurrAutoHideBar = pDockManager->AutoHidePane(this, pCurrAutoHideBar);

		if (IsPaneVisible())
		{
			pDefaultSlider->RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
			RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);

			GetDockSiteFrameWnd()->RedrawWindow(rectBeforeUndock,  NULL, RDW_INVALIDATE | RDW_UPDATENOW |  RDW_ALLCHILDREN);
		}
		else
		{
			ShowWindow(SW_SHOW);
		}

		if (bUseTimer)
		{
			m_nAutoHideConditionTimerID = SetTimer(AFX_ID_CHECK_AUTO_HIDE_CONDITION, m_nTimeOutBeforeAutoHide, NULL);
			Slide(FALSE, TRUE);
			GetDockSiteFrameWnd()->SetFocus();
		}
		else
		{
			Slide(FALSE, FALSE);
		}

		SetWindowPos(NULL, -1, -1, -1, -1, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW | SWP_FRAMECHANGED);
	}
	else if (m_pAutoHideBar != NULL)
	{
		CAutoHideDockSite* pParentDockBar = DYNAMIC_DOWNCAST(CAutoHideDockSite, m_pAutoHideBar->GetParentDockSite());

		if (pParentDockBar != NULL)
		{
			pParentDockBar->UnSetAutoHideMode(m_pAutoHideBar);
		}
	}

	return pCurrAutoHideBar;
}

 

 

你可能感兴趣的:(开发应用)