📄 tabdockbar.cpp
字号:
// TabDockBar.cpp: implementation of the CTabDockBar class
/////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TabDockBar.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTabDockBar::CTabDockBar()
{
m_nActiveTab = 0;
}
CTabDockBar::~CTabDockBar()
{
while(!m_xList.IsEmpty())
{
TCB_ITEM * lpPage = m_xList.RemoveHead();
delete lpPage;
}
}
#define IDC_TABCTRLBAR 1000
BEGIN_MESSAGE_MAP(CTabDockBar, CDockBarEx)
//{{AFX_MSG_MAP(CTabDockBar)
ON_WM_CREATE()
ON_WM_WINDOWPOSCHANGED()
ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRLBAR, OnTabSelChange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabDockBar message handlers
// *** K.Stowell
void CTabDockBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
CWnd * lpWnd;
if( IsFloating() )
{
m_tabctrl.MoveWindow(5, 5, lpwndpos->cx - 10, lpwndpos->cy - 7);
for(POSITION pos = m_xList.GetHeadPosition(); pos; m_xList.GetNext(pos))
{
lpWnd = m_xList.GetAt(pos)->lpWnd;
lpWnd->MoveWindow(8, 8, lpwndpos->cx - 16, lpwndpos->cy - 34);
}
}
else if( IsHorzDocked() )
{
m_tabctrl.MoveWindow(17, 5, lpwndpos->cx - 25, lpwndpos->cy - 17);
for(POSITION pos = m_xList.GetHeadPosition(); pos; m_xList.GetNext(pos))
{
lpWnd = m_xList.GetAt(pos)->lpWnd;
lpWnd->MoveWindow(20, 8, lpwndpos->cx - 31, lpwndpos->cy - 44);
}
}
else
{
m_tabctrl.MoveWindow(5, 20, lpwndpos->cx - 17, lpwndpos->cy - 31);
for(POSITION pos = m_xList.GetHeadPosition(); pos; m_xList.GetNext(pos))
{
lpWnd = m_xList.GetAt(pos)->lpWnd;
lpWnd->MoveWindow(8, 23, lpwndpos->cx - 23, lpwndpos->cy - 58);
}
}
CDockBarEx::OnWindowPosChanged(lpwndpos);
}
// *** xinjiajun ****
CImageList* CTabDockBar::SetTabImageList(CImageList *pImageList)
{
return m_tabctrl.SetImageList (pImageList);
}
// *** K.Stowell ****
BOOL CTabDockBar::ModifyTabStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags)
{
return m_tabctrl.ModifyStyle(dwRemove, dwAdd);
}
// *** K.Stowell
int CTabDockBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CDockBarEx::OnCreate(lpCreateStruct) == -1)
return -1;
// Create the Tab Control
if( !m_tabctrl.Create(WS_VISIBLE | WS_CHILD | TCS_BOTTOM |
TCS_TOOLTIPS, CRect(0, 0, 1, 1), this, IDC_TABCTRLBAR) )
{
TRACE0("Unable to create tab control bar\n");
return -1;
}
// set "normal" GUI-font
CFont * lpFont = CFont::FromHandle(
(HFONT)GetStockObject(DEFAULT_GUI_FONT) );
m_tabctrl.SetFont(lpFont);
// VC5 Support
#if _MSC_VER >= 1200
m_ToolTip = m_tabctrl.GetToolTips();
m_tabctrl.SetToolTips(m_ToolTip);
#else
m_ToolTip = m_tabctrl.GetTooltips();
m_tabctrl.SetTooltips(m_ToolTip);
#endif
return 0;
}
// *** KStowell
void CTabDockBar::OnTabSelChange(NMHDR* pNMHDR, LRESULT* pResult)
{
SetActivePage(m_tabctrl.GetCurSel());
Invalidate();
}
//////////////////////////////////////////////////
// The remainder of this class was written by Dirk Clemens
BOOL CTabDockBar::AddPage(LPCTSTR lpLabel, CWnd * lpPage)
{
#ifdef _DEBUG
ASSERT_VALID(this);
ASSERT(lpPage != NULL);
ASSERT(lpPage->m_hWnd != NULL);
#endif
m_pActiveWnd = lpPage;
TCB_ITEM * lpMember = new TCB_ITEM;
lpMember->lpWnd = lpPage;
lstrcpy(lpMember->lpLabel, lpLabel);
m_xList.AddTail(lpMember);
// ToolTip support for tabs.
if(m_xList.GetCount() == 1)
{
m_ToolTip->AddTool(&m_tabctrl, lpLabel,
NULL, m_xList.GetCount() - 1);
}
else
{
m_ToolTip->AddTool( &m_tabctrl, lpLabel,
CRect(0, 0, 1, 1), m_xList.GetCount() - 1);
}
int nCount = m_xList.GetCount();
if(nCount != 1)
{
lpPage->EnableWindow(FALSE);
lpPage->ShowWindow(SW_HIDE);
}
TC_ITEM myItem;
myItem.iImage = nCount - 1;
myItem.pszText = lpMember->lpLabel;
myItem.mask = TCIF_TEXT | TCIF_IMAGE;
m_tabctrl.InsertItem(nCount, &myItem);
return TRUE;
}
void CTabDockBar::RemovePage(int nPage)
{
ASSERT(nPage >= 0);
// remove the page from internal list
m_xList.RemoveAt(m_xList.FindIndex(nPage));
}
void CTabDockBar::SetActivePage(int nNewTab)
{
ASSERT(nNewTab >= 0);
if(nNewTab != m_nActiveTab)
{
TCB_ITEM * newMember = m_xList.GetAt(
m_xList.FindIndex(nNewTab) );
TCB_ITEM * oldMember = m_xList.GetAt(
m_xList.FindIndex(m_nActiveTab) );
oldMember->lpWnd->EnableWindow(FALSE);
oldMember->lpWnd->ShowWindow(SW_HIDE);
newMember->lpWnd->EnableWindow(TRUE);
newMember->lpWnd->ShowWindow(SW_SHOW);
m_pActiveWnd = newMember->lpWnd;
m_nActiveTab = nNewTab;
// select the tab
m_tabctrl.SetCurSel(m_nActiveTab);
}
}
CWnd * CTabDockBar::GetActivePage()
{
return m_pActiveWnd;
}
CWnd * CTabDockBar::GetPage(int nPage)
{
ASSERT(nPage >= 0);
if(nPage >= m_xList.GetCount())
return NULL;
TCB_ITEM * lpMember = m_xList.GetAt(
m_xList.FindIndex(nPage) );
return lpMember->lpWnd;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -