⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tabdockbar.cpp

📁 对c++中的各种ui对象进行封装
💻 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 + -