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

📄 rttabctrl.cpp

📁 vc++编写的界面源代码,对C++爱好者是很发的帮助。
💻 CPP
字号:
// RTTabCtrl.cpp : 实现文件
//

#include "stdafx.h"
#include "RTTabCtrl.h"
#include "RTDraw.h"

// CRTTabCtrl

IMPLEMENT_DYNAMIC(CRTTabCtrl, CTabCtrl)
CRTTabCtrl::CRTTabCtrl()
{
	m_CurSel = -1;//no sel page
	m_IsShowTabItem = TRUE;
}

CRTTabCtrl::~CRTTabCtrl()
{
}

BOOL CRTTabCtrl::m_IsEnableSkin = TRUE;


CBitmap* CRTTabCtrl::m_TabBitmap[5] = {NULL,NULL,NULL,NULL,NULL};
UINT     CRTTabCtrl::m_TabBitmapDrawMode[5] = {0,0,0,0,0};
BEGIN_MESSAGE_MAP(CRTTabCtrl, CTabCtrl)
	ON_WM_ERASEBKGND()
	ON_WM_PAINT()
	ON_WM_SIZE()
END_MESSAGE_MAP()



// CRTTabCtrl 消息处理程序


BOOL CRTTabCtrl::OnEraseBkgnd(CDC* pDC)
{
	
	CRect rt;
	CTabCtrl::GetClientRect(&rt);
	
	TCITEM tm;
	tm.mask = TCIF_PARAM;
	if(GetItem(m_CurSel,&tm) && tm.lParam != NULL)
	{
		CRect rtArea;
		GetClientRect(&rtArea);
		pDC->ExcludeClipRect(&rtArea);
	}
	if(m_TabBitmap[BMP_BACK] == NULL || !m_IsEnableSkin)
	{
		if(!CTabCtrl::OnEraseBkgnd(pDC))
			return FALSE;
	}
	else
	{
		CRTDraw::RTDrawBitmap(pDC,&rt,m_TabBitmap[BMP_BACK],m_TabBitmapDrawMode[BMP_BACK]);
	}

	
	int ItemCount = GetItemCount();
	CRect rtClient;
	if(ItemCount <= 0 || !m_IsShowTabItem)
	{
		rtClient.SetRect(rt.left + 2,rt.top + 2,rt.right - 2,rt.bottom - 2);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_RECT);
		return TRUE;
	}
	
	DWORD dwStyle = GetStyle();
	if(dwStyle & TCS_BOTTOM || dwStyle & TCS_RIGHT)
	{
        CRect rcItem;
		GetItemRect(ItemCount - 1,&rcItem);
		if(rcItem.right < rt.right)
		{
			rcItem.left = rcItem.right;
			rcItem.right = rt.right - 2;
			pDC->DrawEdge(&rcItem,BDR_SUNKENOUTER,BF_TOP);
		}
		rtClient.SetRect(rt.left + 2,rt.top + 2,rt.right - 2,rcItem.top);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_TOP);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_RIGHT);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_LEFT);	
	}
	else if((dwStyle & TCS_VERTICAL) && (dwStyle & TCS_MULTILINE))
	{
        CRect rcItem;
		GetItemRect(ItemCount - 1,&rcItem);
		if(rcItem.bottom < rt.bottom)
		{
			rcItem.top = rcItem.bottom;
			rcItem.bottom = rt.bottom - 2;
			pDC->DrawEdge(&rcItem,BDR_SUNKENOUTER,BF_RIGHT);
		}
		rtClient.SetRect(rcItem.right,rt.top + 2,rt.right - 2,rt.bottom - 2);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_TOP);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_RIGHT);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_BOTTOM);	
	}
	else
	{
		CRect rcItem;
		GetItemRect(ItemCount - 1,&rcItem);
		if(rcItem.right < rt.right)
		{
			rcItem.left = rcItem.right;
			rcItem.right = rt.right - 2;
			pDC->DrawEdge(&rcItem,BDR_SUNKENOUTER,BF_BOTTOM);
		}
		rtClient.SetRect(rt.left + 2,rcItem.bottom,rt.right - 2,rt.bottom - 2);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_LEFT);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_RIGHT);
		pDC->DrawEdge(&rtClient,BDR_RAISEDINNER,BF_BOTTOM);
	}
	return TRUE;
}

void CRTTabCtrl::GetClientRect(LPRECT lpRect)
{
	CRect rtWnd;
	CTabCtrl::GetClientRect(&rtWnd);
	int ItemCount = GetItemCount();
	if(ItemCount <= 0 || !m_IsShowTabItem)
	{
		lpRect->left = rtWnd.left + 5;
		lpRect->right = rtWnd.right - 5;
		lpRect->bottom = rtWnd.bottom - 5;
		lpRect->top = rtWnd.top + 5;
	}
	else
	{
		DWORD dwStyle = GetStyle();
		CRect rtItem;
		GetItemRect(0,&rtItem);
		if(dwStyle & TCS_BOTTOM || dwStyle & TCS_RIGHT)
		{
			lpRect->left = rtWnd.left + 5;
			lpRect->right = rtWnd.right - 5;
			lpRect->bottom = rtWnd.bottom - rtItem.Height() - 4;
			lpRect->top = rtWnd.top + 5;
		}
		else if((dwStyle & TCS_VERTICAL) && (dwStyle & TCS_MULTILINE))
		{
			lpRect->left = rtWnd.left + rtItem.Width() + 4;
			lpRect->right = rtWnd.right - 5;
			lpRect->bottom = rtWnd.bottom - 5;
			lpRect->top = rtWnd.top + 5;
		}
		else
		{
			lpRect->left = rtWnd.left + 5;
			lpRect->right = rtWnd.right - 5;
			lpRect->bottom = rtWnd.bottom - 5;
			lpRect->top = rtWnd.top + rtItem.Height() + 4;
		}
	}
}

void CRTTabCtrl::OnPaint()
{	
	CPaintDC dc(this); 

	if(m_CurSel != GetCurSel())
	{
		OnTcnSelchanging(m_CurSel);
		OnTcnSelchange();
		m_CurSel = GetCurSel();
	}

	if(!m_IsShowTabItem)return;
	int ItemCount = GetItemCount();
	if(ItemCount <= 0)return;
	CRect rt;
	CTabCtrl::GetClientRect(rt);
	CRgn rgn;
	rgn.CreateRectRgn(2,2,rt.right - 2,rt.bottom - 2);
	dc.SelectClipRgn(&rgn);

	CRect rcItem;
	DWORD dwStyle = GetStyle();
	int OldModule = dc.SetBkMode(TRANSPARENT);
	CFont *pFont = GetFont();
	CFont* pOldFont = dc.SelectObject(pFont);

	for(int i = 0; i < ItemCount; i ++)
	{
		char ItemText[1025] = "";
		TCITEM tim;
		tim.mask = TCIF_IMAGE | TCIF_STATE | TCIF_TEXT;
		tim.pszText = ItemText;
		tim.cchTextMax = 1024;
		if(!GetItem(i,&tim))continue;
		GetItemRect(i,&rcItem);

		DWORD ItemState = 0;
		if(i == GetCurSel())ItemState = TCIS_BUTTONPRESSED;
		
		if(dwStyle & TCS_BOTTOM || dwStyle & TCS_RIGHT)
		{	
			if(ItemState & TCIS_BUTTONPRESSED)
			{
				
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_BOTTOM);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_LEFT);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_RIGHT);
				
			}
			else
			{
				dc.DrawEdge(&rcItem,BDR_SUNKENOUTER,BF_TOP);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_BOTTOM);
				CRect rtTemp;
				rtTemp.SetRect(rcItem.left,rcItem.top + 1,rcItem.right,rcItem.bottom);
				if(i != GetCurSel() - 1)
				{
					dc.DrawEdge(&rtTemp,BDR_RAISEDINNER,BF_RIGHT);
				}
				dc.DrawEdge(&rtTemp,BDR_RAISEDINNER,BF_LEFT);
				
			}
			CRect rcText;
			TEXTMETRIC Metrics;
			dc.GetTextMetrics(&Metrics);
			CImageList *ImgList = GetImageList();
			if(ImgList != NULL)
			{
				CRect rtIcon;
				rtIcon.top = rcItem.top + 1;
				rtIcon.bottom = rcItem.bottom - 1;
				rtIcon.left = rcItem.left + 1;
				rtIcon.right = rtIcon.left + rtIcon.Height() - 2;
				HICON hIcon = ImgList->ExtractIcon(tim.iImage);
				if(hIcon != NULL)
				{
					DrawIconEx(dc.m_hDC,rtIcon.left,rtIcon.top,hIcon, rtIcon.Width(),rtIcon.Height(),0,NULL,DI_NORMAL);
					DeleteObject(hIcon);
				}
				rcText.SetRect(rcItem.left + rcItem.Height(),rcItem.top + (rcItem.Height() - Metrics.tmHeight)/2,rcItem.right,rcItem.bottom);
				dc.DrawText(ItemText,(int)strlen(ItemText),&rcText,DT_LEFT | DT_SINGLELINE | DT_END_ELLIPSIS);
			}
			else
			{
				rcText.SetRect(rcItem.left,rcItem.top + (rcItem.Height() - Metrics.tmHeight)/2,rcItem.right,rcItem.bottom);
				dc.DrawText(ItemText,(int)strlen(ItemText),&rcText,DT_CENTER | DT_SINGLELINE | DT_END_ELLIPSIS);
			}
		}
		else if((dwStyle & TCS_VERTICAL) && (dwStyle & TCS_MULTILINE))
		{
			if(ItemState & TCIS_BUTTONPRESSED)
			{
				
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_TOP);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_LEFT);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_BOTTOM);
				
			}
			else
			{
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_LEFT);
				dc.DrawEdge(&rcItem,BDR_SUNKENOUTER,BF_RIGHT);
				CRect rtTemp;
				rtTemp.SetRect(rcItem.left + 1,rcItem.top,rcItem.right - 1,rcItem.bottom);
				dc.DrawEdge(&rtTemp,BDR_RAISEDINNER,BF_TOP);
				if(i != GetCurSel() - 1)
				{
					dc.DrawEdge(&rtTemp,BDR_RAISEDOUTER,BF_BOTTOM);
				}

			}
			CRect rcText;
			CImageList *ImgList = GetImageList();
			if(ImgList != NULL)
			{
				CRect rtIcon;
				rtIcon.left = rcItem.left + 1;
				rtIcon.right = rcItem.right - 1;
				rtIcon.top = rcItem.top + 1;
				rtIcon.bottom = rtIcon.top + rcItem.Width() - 2;
				
				HICON hIcon = ImgList->ExtractIcon(tim.iImage);
				if(hIcon != NULL)
				{
					DrawIconEx(dc.m_hDC,rtIcon.left,rtIcon.top,hIcon, rtIcon.Width(),rtIcon.Height(),0,NULL,DI_NORMAL);
					DeleteObject(hIcon);
				}
				rcText.SetRect(rcItem.left,rcItem.top + rcItem.Width(),rcItem.right,rcItem.bottom);
				LOGFONT lf ;
				pFont->GetLogFont(&lf);
				CRTDraw::RTDrawVerticalText(&dc,&rcText,ItemText,(int)strlen(ItemText), DT_LEFT | DT_SINGLELINE,&lf);
			}
			else
			{
				rcText.SetRect(rcItem.left,rcItem.top + 4,rcItem.right,rcItem.bottom);
				LOGFONT lf ;
				pFont->GetLogFont(&lf);
				CRTDraw::RTDrawVerticalText(&dc,&rcText,ItemText,(int)strlen(ItemText), DT_LEFT | DT_SINGLELINE,&lf);
			}
		}
		else
		{
			if(ItemState & TCIS_BUTTONPRESSED)
			{
				
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_TOP);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_LEFT);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_RIGHT);
				
			}
			else
			{
				dc.DrawEdge(&rcItem,BDR_SUNKENOUTER,BF_BOTTOM);
				dc.DrawEdge(&rcItem,BDR_RAISEDINNER,BF_TOP);
				CRect rtTemp;
				rtTemp.SetRect(rcItem.left,rcItem.top,rcItem.right,rcItem.bottom - 1);
				if(i != GetCurSel() - 1)
				{
					dc.DrawEdge(&rtTemp,BDR_RAISEDINNER,BF_RIGHT);
					
				}
				dc.DrawEdge(&rtTemp,BDR_RAISEDINNER,BF_LEFT);
			}
			CRect rcText;
			TEXTMETRIC Metrics;
			dc.GetTextMetrics(&Metrics);
			CImageList *ImgList = GetImageList();
			if(ImgList != NULL)
			{
				CRect rtIcon;
				rtIcon.top = rcItem.top + 1;
				rtIcon.bottom = rcItem.bottom - 1;
				rtIcon.left = rcItem.left + 1;
				rtIcon.right = rtIcon.left + rtIcon.Height() - 2;
				HICON hIcon = ImgList->ExtractIcon(tim.iImage);
				if(hIcon != NULL)
				{
					DrawIconEx(dc.m_hDC,rtIcon.left,rtIcon.top,hIcon, rtIcon.Width(),rtIcon.Height(),0,NULL,DI_NORMAL);
					DeleteObject(hIcon);
				}
				rcText.SetRect(rcItem.left + rcItem.Height(),rcItem.top + (rcItem.Height() - Metrics.tmHeight)/2,rcItem.right,rcItem.bottom);
				dc.DrawText(ItemText,(int)strlen(ItemText),&rcText,DT_LEFT | DT_SINGLELINE | DT_END_ELLIPSIS);
			}
			else
			{
				rcText.SetRect(rcItem.left,rcItem.top + (rcItem.Height() - Metrics.tmHeight)/2,rcItem.right,rcItem.bottom);
				dc.DrawText(ItemText,(int)strlen(ItemText),&rcText,DT_CENTER | DT_SINGLELINE | DT_END_ELLIPSIS);
			}
		}
	}
	dc.SetBkMode(OldModule);
	dc.SelectObject(pOldFont);

}

void CRTTabCtrl::OnSize(UINT nType, int cx, int cy)
{
	CTabCtrl::OnSize(nType, cx, cy);
	int ItemCount = GetItemCount();
	CRect rtClient;
	GetClientRect(&rtClient);
	for(int i = 0; i < ItemCount; i++)
	{
		TCITEM tm;
		ZeroMemory(&tm,sizeof(tm));
		tm.mask = TCIF_PARAM;
		if(GetItem(i,&tm))
		{
			CWnd* pWnd = (CWnd *)tm.lParam;
			if(pWnd != NULL && IsWindow(pWnd->m_hWnd))
			{
				pWnd->MoveWindow(&rtClient);
			}
		}
	}
}


void CRTTabCtrl::SetTabBitmap(CBitmap* TabBitmap[], UINT DrawMode[])
{
	for(int i = 0; i < 5; i++)
	{
		m_TabBitmap[i] = TabBitmap[i];
		m_TabBitmapDrawMode[i] = DrawMode[i];
	}
}

BOOL CRTTabCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
	if(!CTabCtrl::PreCreateWindow(cs))
		return FALSE;
	cs.style &= ~TCS_MULTISELECT;
	return TRUE;

}

void CRTTabCtrl::PreSubclassWindow()
{
	CTabCtrl::PreSubclassWindow();
}

void CRTTabCtrl::ShowTabItem(BOOL IsVisable)
{
	m_IsShowTabItem = IsVisable;
}
LONG CRTTabCtrl::Add(int Position,LPCTSTR lpszItemText,int Image,CWnd* pItemWnd)
{
	TCITEM tm;
	ZeroMemory(&tm,sizeof(tm));
	tm.lParam = (LPARAM)pItemWnd;
	tm.pszText = (LPSTR)lpszItemText;
	tm.cchTextMax = (int)strlen(lpszItemText);
	tm.iImage = Image;
	tm.mask = TCIF_IMAGE|TCIF_PARAM|TCIF_TEXT;
	int pos = CTabCtrl::InsertItem(Position,&tm);
	if(pos == -1)return -1;

	if(pItemWnd != NULL && IsWindow(pItemWnd->m_hWnd))
	{
		pItemWnd->SetParent(this);
		if(pos == GetCurSel())
		{
			pItemWnd->ShowWindow(SW_SHOW);
		}
		else
		{
			pItemWnd->ShowWindow(SW_HIDE);
		}
	}
	return pos;
}
void CRTTabCtrl::OnTcnSelchange()
{
	int i = GetCurSel();
	if(i >= 0)
	{
		TCITEM tm;
		ZeroMemory(&tm,sizeof(tm));
		tm.mask = TCIF_PARAM;
		if(GetItem(i,&tm))
		{
			CWnd* pWnd = (CWnd *)tm.lParam;
			if(pWnd != NULL && IsWindow(pWnd->m_hWnd))
			{
				pWnd->ShowWindow(SW_SHOW);
			}
		}
	}
}

void CRTTabCtrl::OnTcnSelchanging(int oldSel)
{
	int i = oldSel;
	if(i >= 0)
	{
		TCITEM tm;
		ZeroMemory(&tm,sizeof(tm));
		tm.mask = TCIF_PARAM;
		if(GetItem(i,&tm))
		{
			CWnd* pWnd = (CWnd *)tm.lParam;
			if(pWnd != NULL && IsWindow(pWnd->m_hWnd))
			{
				pWnd->ShowWindow(SW_HIDE);
			}
		}
	}
}

void CRTTabCtrl::EnableSkin(BOOL IsEnable)
{
	m_IsEnableSkin = IsEnable;
}
BOOL CRTTabCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	GetParent()->SendMessage(WM_NOTIFY,wParam,lParam);
	return CTabCtrl::OnNotify(wParam, lParam, pResult);
}

⌨️ 快捷键说明

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