在MFC中使用CDockablePane时,隐藏CPaneDivider 的方法:
一、在CMainFrame定义函数 GetDockingManagerEx()
CDockingManager* CMainFrame::GetDockingManagerEx()
{
return GetDockingManager();
}
(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;
}
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;
}