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

📄 xtabframe.cpp

📁 对c++中的各种ui对象进行封装
💻 CPP
字号:
// XTabFrame.cpp : implementation of the CTabFrame class
////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "XTabFrame.h"

////////////////////////////////////////////////////////////////////
// CTabFrame

CTabFrame::CTabFrame()
{
	// 任意选择
	m_nCurTab = 0;
	m_nTabCount = 0;
	m_bShowBorder = TRUE;
	m_bStepWizard = FALSE;
}

CTabFrame::~CTabFrame()
{
	for(long i = 0; i < m_nTabCount; i ++)
	{
		if( m_bRelease[i] ) 
		{
			m_lpPage[i]->DestroyWindow();
			delete m_lpPage[i];
		}
	}
}


BEGIN_MESSAGE_MAP(CTabFrame, CTabCtrl)
	//{{AFX_MSG_MAP(CTabFrame)
	ON_WM_SIZE()
	ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnTabChange)
	ON_NOTIFY_REFLECT(TCN_SELCHANGING, OnTabChanging)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


///////////////////////////////////////////////////////////////////
// CTabFrame message handlers

void CTabFrame::SetBorderVisible(BOOL bShowBorder)
{
	m_bShowBorder = bShowBorder;
}

BOOL CTabFrame::Create(CWnd * lpParent, 
		 DWORD dwStyle, RECT& rect, UINT nWndID) 
{
	// 创建窗口
	if( !CTabCtrl::Create(dwStyle, rect, 
			lpParent, nWndID) ) 
		return FALSE;
	return TRUE;
}

// 获取Tab标题
long CTabFrame::GetTabText(long nItem, LPTSTR lpBuffer, long nBuffer) 
{
	TCHAR  lpTemp[65];

	if(lpBuffer == NULL) 
	{
		lpBuffer = lpTemp;
		nBuffer = 64;
	}

	TCITEM  myItem;
	myItem.mask = TCIF_TEXT;
	myItem.pszText = lpBuffer;
	myItem.cchTextMax = nBuffer;
	
	if( !GetItem(nItem, &myItem) ) 
		return -1;

	return  lstrlen(lpBuffer);
}

void CTabFrame::SetTabText(long nItem, LPCTSTR lpString)
{
	TCITEM  myItem;
	myItem.mask = TCIF_TEXT;
	myItem.pszText = (LPSTR)lpString;
	myItem.cchTextMax = 1024;
	
	SetItem(nItem, &myItem);
}

CWnd * CTabFrame::GetPage(long nPage) 
{
	ASSERT(nPage >= 0);
	ASSERT(nPage < m_nTabCount);

	return m_lpPage[nPage];
}

CWnd * CTabFrame::GetCurPage() 
{
	ASSERT(m_nTabCount > 0);
	return m_lpPage[m_nCurTab];
}

void CTabFrame::SetCurPage(long nPage)
{
	ASSERT(nPage >= 0 && nPage < m_nTabCount);

	SetCurSel(nPage);
	m_nCurTab = nPage;
}

long CTabFrame::GetCurTab() 
{
	ASSERT(m_nTabCount > 0);
	return m_nCurTab;
}

long CTabFrame::GetTabCount() 
{
	return m_nTabCount;
}

void CTabFrame::AddPage(LPCTSTR lpCaption, 
		 CWnd * lpPage, BOOL bRelease) 
{
	// 添加一个页面
	InsertItem(m_nTabCount, lpCaption, 0);
	m_bRelease[m_nTabCount] = bRelease;
	m_lpPage[m_nTabCount ++] = lpPage;

	// 移动到正确的位置
	RECT  rtRect;
	GetViewRect(&rtRect);
	lpPage->MoveWindow(&rtRect);

	// 如果是第一页显示
	if(m_nTabCount == 1) 
		lpPage->ShowWindow(SW_SHOW);
	else 
		lpPage->ShowWindow(SW_HIDE);
}

CWnd * CTabFrame::DropPage(long nPage)
{
	ASSERT(nPage >= 0);
	ASSERT(nPage < m_nTabCount);

	// 备份当前页面
	CWnd * lpPage = m_lpPage[nPage];

	// 删除需要删除的页
	DeleteItem(nPage);
	m_nTabCount --;

	for(long i = nPage; i < m_nTabCount; i ++) 
	{
		m_bRelease[i] = m_bRelease[i + 1];
		m_lpPage[i] = m_lpPage[i + 1];
	}

	return lpPage;
}

void CTabFrame::OnTabChanging(NMHDR* lpHdr, LRESULT* lpResult) 
{
	// 向导式页面,不换页
	*lpResult = m_bStepWizard;
}

void CTabFrame::StartWizard() 
{
	SetCurSel(0);
	m_bStepWizard = TRUE;
	OnTabChange(NULL, NULL);
}

BOOL CTabFrame::GoNextWizard() 
{
	if(m_nCurTab + 1 < m_nTabCount) 
	{
		SetCurSel(m_nCurTab + 1);
		OnTabChange(NULL, NULL);
		return TRUE;
	}

	return FALSE;
}

BOOL CTabFrame::GoPrevWizard() 
{
	if(m_nCurTab > 0) 
	{
		SetCurSel(m_nCurTab - 1);
		OnTabChange(NULL, NULL);
		return TRUE;
	}

	return FALSE;
}

void CTabFrame::StopWizard() 
{
	m_bStepWizard = FALSE;
}

void CTabFrame::GetViewRect(LPRECT lpRect)
{
	// Tab Item Height
	RECT  rcItem;
	GetItemRect(0, &rcItem);

	// Tab Window Rect
	GetClientRect(lpRect);
	if(GetStyle() & TCS_BOTTOM) 
	{
		lpRect->bottom = rcItem.top - 1;

		if( m_bShowBorder ) 
		{
			lpRect->top += 3;
			lpRect->left += 3;
			lpRect->right -= 3;
		}
	}
	else 
	{
		lpRect->top = rcItem.bottom + 1;

		if( m_bShowBorder ) 
		{
			lpRect->left += 3;
			lpRect->right -= 3;
			lpRect->bottom -= 3;
		}
	}
}

void CTabFrame::OnSize(UINT nType, int cx, int cy) 
{
	CTabCtrl::OnSize(nType, cx, cy);

	RECT  rtRect;
	GetViewRect(&rtRect);

	// 将页面调整到新的位置
	for(long i = 0; i < m_nTabCount; i ++)
	   m_lpPage[i]->MoveWindow(&rtRect);
}

void CTabFrame::OnTabChange(NMHDR* lpHdr, LRESULT* lpResult) 
{
	// 当前的选项
	long  nIndex = GetCurSel();
	if(nIndex < 0)  return;

	// 显示新的页面
	m_lpPage[nIndex]->ShowWindow(SW_SHOW);

	// 隐藏以前页面
	if(nIndex != m_nCurTab)
	{
		m_lpPage[m_nCurTab]->ShowWindow(SW_HIDE);
		m_nCurTab = nIndex;
	}

	// 页面改变了
	HWND  hParent;
	hParent = ::GetParent(m_hWnd);
	::SendMessage(hParent, WM_TABCHANGE, (UINT)m_hWnd, nIndex);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -