隐藏 CPaneDivider

    技术2022-05-19  21

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

     

     


    最新回复(0)