www.gusucode.com > VC++指定区域抓图、截屏小程序-源码程序 > VC++指定区域抓图、截屏小程序-源码程序/code/FBTabCtrl.cpp

    //Download by http://www.NewXing.com
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	文件:FBTabCtrl.cpp  类CFBTabCtrl的执行文件

	版权:Firebird Software Workroom

	声明:本源程序的版权受《中华人民共和国著作权法》以及其
		  它相关法律和条约的保护。任何有机会得到本源程序的
		  个人和机构,未经作者明确授权,不得将本源程序用于
		  任何商业目的(直接的或间接的)。对于非商业目的的使
		  用 (包括复制、传播、编译和修改), 原则上没有特别
		  的限制条款,但请在相关文档中说明其来源,并尊重原
		  作者的署名权。

	编写:秦传安(chings)	1999.12 - 2000.5

	联络:Tel:(0792)6323086	E_mail:chings@163.net
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "fclstd.h"
#include "FBCtrls.h"

//###################################################################
//	class CFBTabCtrl
//	活页控件
//###################################################################

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFBTabCtrl::CFBTabCtrl()
{
	m_pActiveView	= NULL;
	m_uStyle		= 0;
}

CFBTabCtrl::~CFBTabCtrl()
{
	RemoveAll();
}
//////////////////////////////////////////////////////////////////////
BOOL CFBTabCtrl::Create(CFBWnd* pParent,UINT nID,UINT style)
{
	InitCommonControls();

	style |= WS_CHILD | WS_VISIBLE| WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
				TCS_BUTTONS | TCS_FIXEDWIDTH | TCS_FORCELABELLEFT |
				CCS_NODIVIDER | CCS_NORESIZE;

	m_uStyle = style;

	if(!CFBWnd::Create(WC_TABCONTROL,
						NULL,
						pParent->GetInstance(),
						pParent,
						style,
						NULL,
						(HMENU)nID))
		return FALSE;

	HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
	SendMessage(m_hWnd,WM_SETFONT,(WPARAM)hFont,FALSE);
	SendMessage(m_hWnd,TCM_SETITEMSIZE,0,MAKELPARAM(60,16));
	
	return TRUE;
}
///////////////////////////////////////////////////////////////////////
//窗口过程
LRESULT CFBTabCtrl::WindowProc(UINT msg,WPARAM wParam,LPARAM lParam)
{
	LRESULT lResult = 0;

	switch(msg)
	{
	case WM_SIZE:
		OnSize();
		break;
	case WM_ERASEBKGND:
		if(GetItemCount() > 0)
		{
			RECT rc;
			GetChildRect(&rc);
			ExcludeClipRect((HDC)wParam,rc.left,rc.top,rc.right,rc.bottom);
		}
		lResult = CFBWnd::WindowProc(msg,wParam,lParam);
		break;
	case WM_NOTIFY:
		{
			LPNMHDR pNMHDR = (LPNMHDR)lParam;
			if(pNMHDR->code == TCN_SELCHANGE)
			{
				SetActiveView(GetCurSel());
				SendMessage(m_pOwner->m_hWnd,FBWM_NOTIFY,MAKEWPARAM(GetWndID(),FB_TABN_SELCHANGED),0);
			}
		}
		break;
	default:
		lResult = CFBWnd::WindowProc(msg,wParam,lParam);
		break;
	}

	return lResult;
}
///////////////////////////////////////////////////////////////////////////////////
int CFBTabCtrl::AddView(CFBWnd *pChild,LPSTR pszCaption,BOOL bEnableImg)
{
	if(!pChild)return -1;

	int index = GetItemCount();

	TCITEM tci;
	tci.mask = TCIF_TEXT|TCIF_PARAM;
	if(bEnableImg)
		tci.mask |= TCIF_IMAGE;
	tci.pszText = pszCaption;
	tci.cchTextMax = 32;
	if(bEnableImg)
		tci.iImage = index;
	tci.lParam = (LPARAM)pChild;

	if(SendMessage(m_hWnd,TCM_INSERTITEM,(WPARAM)index,(LPARAM)&tci) == -1)
		return -1;
	
	SetParent(pChild->m_hWnd,m_hWnd);
	return index;
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::SetActiveView(int nIndex)
{
	if(nIndex == -1)
		return;

	CFBWnd* pWnd = GetAt(nIndex);
	if(pWnd)
	{
		if(pWnd == m_pActiveView)
			return;

		if(m_pActiveView)
			ShowWindow(m_pActiveView->m_hWnd,SW_HIDE);

		ShowWindow(pWnd->m_hWnd,SW_SHOW);
		m_pActiveView = pWnd;
		OnSize();
	}
	SetCurSel(nIndex);
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::GetChildRect(LPRECT prc)
{
	GetClientRect(m_hWnd,prc);

	prc->bottom -= 3;
	prc->left += 3;
	prc->right -= 3;

	if(m_uStyle & CCS_TOP)
		prc->top += 21;
	else if(m_uStyle & CCS_BOTTOM)
		prc->bottom -= 21;
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::OnSize()
{
 	if(!m_pActiveView)return;

	RECT rc;
	GetChildRect(&rc);
	SetWindowPos(m_pActiveView->m_hWnd,NULL,rc.left,rc.top,
				rc.right - rc.left,rc.bottom - rc.top,
				SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOCOPYBITS);
}
///////////////////////////////////////////////////////////////////////////////////
CFBWnd* CFBTabCtrl::GetAt(int index)
{
	TCITEM tci;
	memset(&tci,0,sizeof(TCITEM));
	tci.mask = TCIF_PARAM;
	if(!GetItem(index,&tci))
		return NULL;

	return (CFBWnd*)tci.lParam;
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::Remove(int index)
{
	CFBWnd *pWnd = GetAt(index);
	if(pWnd)
		delete pWnd;
	else
		return;

	int n = GetItemCount();

	SendMessage(m_hWnd,TCM_DELETEITEM,(WPARAM)index,0);

	if(n == 1)
	{
		m_pActiveView = NULL;
		return;
	}

	if(index == n-1)//如果删除的是最后一页,置前页为当前页
		SetActiveView(index-1);
	else//否则, 置后页为当前页。
		SetActiveView(index);
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::RemoveAll()
{
	int count = GetItemCount();
	if(count == 0)return;

	CFBWnd *pWnd;

	for(int i=0;i<count;i++)
	{
		pWnd = GetAt(i);
		if(pWnd)
			delete pWnd;
	}

	m_pActiveView = NULL;

	SendMessage(m_hWnd,TCM_DELETEALLITEMS,0,0);
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::SetCaption(int index,LPTSTR szCaption)
{
	if(index<0 || index>=GetItemCount())
		return;

	TCITEM tci;
	tci.mask = TCIF_TEXT;
	tci.pszText = szCaption;
	tci.cchTextMax = lstrlen(szCaption);

	TabCtrl_SetItem(m_hWnd,index,&tci);
}
///////////////////////////////////////////////////////////////////////////////////
void CFBTabCtrl::GetCaption(int index,LPTSTR szCaption,int cbSize)
{
	if(index<0 || index>=GetItemCount())
		return;

	TCITEM tci;
	tci.mask = TCIF_TEXT;
	tci.pszText = szCaption;
	tci.cchTextMax = cbSize;

	GetItem(index,&tci);
}