📄 bcgpbasetabbedbar.cpp
字号:
if (!CBCGPDockingControlBar::FloatControlBar (rectFloat, dockMethod, bShow))
{
return FALSE;
}
CBCGPMiniFrameWnd* pParentFrame = GetParentMiniFrame ();
if (pParentFrame != NULL)
{
pParentFrame->SetIcon (m_pTabWnd->GetTabHicon (m_pTabWnd->GetActiveTab ()), FALSE);
}
return TRUE;
}
//**************************************************************************************
void CBCGPBaseTabbedBar::Serialize (CArchive& ar)
{
CBCGPDockingControlBar::Serialize (ar);
if (ar.IsLoading ())
{
ar >> m_bAutoDestroy;
}
else
{
ar << m_bAutoDestroy;
}
}
//**************************************************************************************
void CBCGPBaseTabbedBar::SerializeTabWindow (CArchive& ar)
{
if (m_pTabWnd != NULL)
{
m_pTabWnd->Serialize (ar);
}
}
//**************************************************************************************
void CBCGPBaseTabbedBar::LoadSiblingBarIDs (CArchive& ar, CList<UINT, UINT>& lstBarIDs)
{
ASSERT (ar.IsLoading ());
if (ar.IsLoading ())
{
int nTabsNum = 0;
ar >> nTabsNum;
for (int i = 0; i < nTabsNum; i++)
{
int nBarID = -1;
ar >> nBarID;
ASSERT (nBarID != -1);
lstBarIDs.AddTail (nBarID);
}
}
}
//**************************************************************************************
void CBCGPBaseTabbedBar::SaveSiblingBarIDs (CArchive& ar)
{
ASSERT_VALID (this);
ASSERT (ar.IsStoring ());
ASSERT_VALID (m_pTabWnd);
if (ar.IsStoring () && m_pTabWnd != NULL)
{
int nTabsNum = m_pTabWnd->GetTabsNum ();
// DO NOT SAVE empty tabbed bars
if (nTabsNum > 0)
{
ar << nTabsNum;
for (int i = 0; i < nTabsNum; i++)
{
CBCGPBaseControlBar* pWnd =
DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_pTabWnd->GetTabWnd (i));
ASSERT_VALID (pWnd);
ar << pWnd->GetDlgCtrlID ();
}
}
}
}
//**************************************************************************************
BOOL CBCGPBaseTabbedBar::LoadState (LPCTSTR lpszProfileName, int nIndex, UINT uiID)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pTabWnd);
// if initially tabbed bars were detached by user and exist only as regular
// docking control bars we need to give them a chance to load their state
// from the registry
CBCGPDockingControlBar::LoadState (lpszProfileName, nIndex, uiID);
int nTabsNum = m_pTabWnd->GetTabsNum ();
for (int i = 0; i < nTabsNum; i++)
{
CBCGPBaseControlBar* pWnd =
DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_pTabWnd->GetTabWnd (i));
if (pWnd != NULL)
{
ASSERT_VALID (pWnd);
pWnd->LoadState (lpszProfileName, nIndex, uiID);
}
}
return TRUE;
}
//**************************************************************************************
BOOL CBCGPBaseTabbedBar::SaveState (LPCTSTR lpszProfileName, int nIndex, UINT uiID)
{
ASSERT_VALID (this);
ASSERT_VALID (m_pTabWnd);
CBCGPDockingControlBar::SaveState (lpszProfileName, nIndex, uiID);
int nTabsNum = m_pTabWnd->GetTabsNum ();
for (int i = 0; i < nTabsNum; i++)
{
CBCGPBaseControlBar* pWnd =
DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_pTabWnd->GetTabWnd (i));
if (pWnd != NULL)
{
ASSERT_VALID (pWnd);
if (!pWnd->SaveState (lpszProfileName, nIndex, uiID))
{
return FALSE;
}
}
}
return TRUE;
}
//**************************************************************************************
void CBCGPBaseTabbedBar::ApplyRestoredTabInfo ()
{
ASSERT_VALID (this);
if (m_pTabWnd != NULL)
{
m_pTabWnd->ApplyRestoredTabInfo ();
}
}
//**************************************************************************************
void CBCGPBaseTabbedBar::RecalcLayout ()
{
ASSERT_VALID (this);
CBCGPDockingControlBar::RecalcLayout ();
if (m_pTabWnd != NULL)
{
m_pTabWnd->RecalcLayout ();
}
}
//**************************************************************************************
BOOL CBCGPBaseTabbedBar::CanFloat () const
{
ASSERT_VALID (this);
return CBCGPDockingControlBar::CanFloat ();
}
//**************************************************************************************
void CBCGPBaseTabbedBar::OnSetFocus(CWnd* pOldWnd)
{
CBCGPDockingControlBar::OnSetFocus(pOldWnd);
// Pass the focus to the tab window
CWnd* pWndChild = GetUnderlinedWindow();
if (pWndChild != NULL)
pWndChild->SetFocus();
}
//**************************************************************************************
CBCGPAutoHideToolBar* CBCGPBaseTabbedBar::SetAutoHideMode (BOOL bMode, DWORD dwAlignment,
CBCGPAutoHideToolBar* pCurrAutoHideBar,
BOOL bUseTimer)
{
CBCGPAutoHideToolBar* pAutoHideBar = pCurrAutoHideBar;
CBCGPDockingControlBar* pActiveBar = NULL;
int nActiveTab = m_pTabWnd->GetActiveTab ();
int nTabsNum = m_pTabWnd->GetTabsNum ();
CObList lstTmp;
ShowControlBar (FALSE, TRUE, FALSE);
int nNonDetachedCount = 0;
for (int nNextTab = nTabsNum - 1; nNextTab >= 0; nNextTab--)
{
CBCGPDockingControlBar* pBar = DYNAMIC_DOWNCAST (CBCGPDockingControlBar,
m_pTabWnd->GetTabWnd (nNextTab));
ASSERT_VALID (pBar);
BOOL bIsVisible = m_pTabWnd->IsTabVisible (nNextTab);
BOOL bDetachable = m_pTabWnd->IsTabDetachable (nNextTab);
if (pBar != NULL && bIsVisible && bDetachable)
{
m_pTabWnd->RemoveTab (nNextTab, FALSE);
pBar->EnableGripper (TRUE);
pBar->StoreRecentTabRelatedInfo ();
CWnd* pOldParent = pBar->GetParent ();
pBar->OnBeforeChangeParent (m_pDockSite);
pBar->SetParent (m_pDockSite);
pBar->SetOwner (m_pDockSite);
pBar->OnAfterChangeParent (pOldParent);
lstTmp.AddHead (pBar);
if (nNextTab == nActiveTab)
{
pActiveBar = pBar;
}
}
else
{
nNonDetachedCount++;
}
}
BOOL bActiveSet = FALSE;
CBCGPControlBar* pNewAHBar = NULL;
for (POSITION pos = lstTmp.GetHeadPosition (); pos != NULL;)
{
CBCGPDockingControlBar* pBar = DYNAMIC_DOWNCAST (CBCGPDockingControlBar,
lstTmp.GetNext (pos));
BOOL bUseTimerForActiveBar = (pBar == pActiveBar) && bUseTimer;
pNewAHBar = pBar->SetAutoHideMode (TRUE, dwAlignment, NULL, bUseTimerForActiveBar);
if (pNewAHBar != NULL)
{
pNewAHBar->m_bFirstInGroup = (lstTmp.GetHead () == pBar);
pNewAHBar->m_bLastInGroup = (lstTmp.GetTail () == pBar);
pNewAHBar->m_bActiveInGroup = (pBar == pActiveBar);
if (!bActiveSet && pNewAHBar->m_bActiveInGroup)
{
bActiveSet = TRUE;
}
}
}
if (pNewAHBar != NULL)
{
if (!bActiveSet)
{
pNewAHBar->m_bActiveInGroup = TRUE;
}
CRect rect (0, 0, 0, 0);
pNewAHBar->GetParentDockBar ()->RepositionBars (rect);
}
if (nNonDetachedCount > 0)
{
if (m_pTabWnd->GetVisibleTabsNum () == 0)
{
ShowControlBar (FALSE, TRUE, FALSE);
}
else
{
if (m_pTabWnd->GetActiveTab () == -1)
{
int nVisibleTab = -1;
GetFirstVisibleTab (nVisibleTab);
m_pTabWnd->SetActiveTab (nVisibleTab);
}
m_pTabWnd->RecalcLayout ();
ShowControlBar (TRUE, TRUE, FALSE);
pAutoHideBar = CBCGPDockingControlBar::SetAutoHideMode (bMode, dwAlignment, pCurrAutoHideBar, bUseTimer);
}
}
if (pAutoHideBar != NULL)
{
pAutoHideBar->UpdateVisibleState();
}
return pAutoHideBar;
}
//**************************************************************************************
CWnd* CBCGPBaseTabbedBar::GetFirstVisibleTab (int& iTabNum)
{
iTabNum = -1;
if (m_pTabWnd == NULL)
{
return NULL;
}
return m_pTabWnd->GetFirstVisibleTab (iTabNum);
}
//**************************************************************************************
HICON CBCGPBaseTabbedBar::GetBarIcon (BOOL bBigIcon)
{
HICON hIcon = GetIcon (bBigIcon);
if (hIcon == NULL && m_pTabWnd != NULL)
{
CWnd* pWnd = m_pTabWnd->GetActiveWnd ();
if (pWnd != NULL)
{
hIcon = pWnd->GetIcon (bBigIcon);
}
}
return hIcon;
}
//**************************************************************************************
LRESULT CBCGPBaseTabbedBar::OnChangeActiveTab (WPARAM wp, LPARAM)
{
int iTabNum = (int) wp;
CString strLabel;
if (m_pTabWnd != NULL && m_pTabWnd->GetTabLabel (iTabNum, strLabel) &&
m_bSetCaptionTextToTabName)
{
SetWindowText (strLabel);
}
OnActivateTab (iTabNum);
return 0;
}
//**************************************************************************************
BOOL CBCGPBaseTabbedBar::Dock (CBCGPBaseControlBar* pTargetBar, LPCRECT lpRect,
BCGP_DOCK_METHOD dockMethod)
{
if (dockMethod != DM_DBL_CLICK)
{
return CBCGPDockingControlBar::Dock (pTargetBar, lpRect, dockMethod);
}
BOOL bFloating = (GetParentMiniFrame () != NULL);
if (bFloating && m_recentDockInfo.GetRecentContainer (TRUE) != NULL ||
!bFloating && m_recentDockInfo.GetRecentContainer (FALSE) != NULL)
{
return CBCGPDockingControlBar::Dock (pTargetBar, lpRect, dockMethod);
}
int nTabsNum = m_pTabWnd->GetTabsNum ();
ShowControlBar (FALSE, TRUE, FALSE);
int nNonDetachedCount = 0;
for (int nNextTab = nTabsNum - 1; nNextTab >= 0; nNextTab--)
{
CBCGPDockingControlBar* pBar = DYNAMIC_DOWNCAST (CBCGPDockingControlBar,
m_pTabWnd->GetTabWnd (nNextTab));
ASSERT_VALID (pBar);
BOOL bIsVisible = m_pTabWnd->IsTabVisible (nNextTab);
BOOL bDetachable = m_pTabWnd->IsTabDetachable (nNextTab);
if (pBar != NULL && bIsVisible && bDetachable)
{
m_pTabWnd->RemoveTab (nNextTab, FALSE);
pBar->EnableGripper (TRUE);
pBar->StoreRecentTabRelatedInfo ();
pBar->DockControlBar (pBar, lpRect, dockMethod);
}
else
{
nNonDetachedCount++;
}
}
if (nNonDetachedCount > 0)
{
if (m_pTabWnd->GetVisibleTabsNum () == 0)
{
ShowControlBar (FALSE, TRUE, FALSE);
}
else
{
if (m_pTabWnd->GetActiveTab () == -1)
{
int nVisibleTab = -1;
GetFirstVisibleTab (nVisibleTab);
m_pTabWnd->SetActiveTab (nVisibleTab);
}
m_pTabWnd->RecalcLayout ();
ShowControlBar (TRUE, TRUE, FALSE);
return CBCGPDockingControlBar::Dock (pTargetBar, lpRect, dockMethod);
}
}
else
{
DestroyWindow ();
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -