隐藏 CPaneDivider

本文介绍了一种在MFC框架下使用CDockablePane时隐藏分割条的方法。通过自定义CMyDockablePane类并重载SetAutoHideMode函数,可以实现窗口自动隐藏模式下隐藏分割条的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     在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;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值