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

📄 entabctrl.cpp

📁 用VC写的浏览器
💻 CPP
字号:
//_ **********************************************************
//_ 
//_ Name: EnTabCtrl.cpp 
//_ Purpose: 
//_ Created: 15 September 1998 
//_ Author: D.R.Godson
//_ Modified By: 
//_ 
//_ Copyright (c) 1998 Brilliant Digital Entertainment Inc. 
//_ 
//_ **********************************************************

// EnTabCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "EnTabCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEnTabCtrl

DWORD CEnTabCtrl::s_dwCustomLook = 0;

enum { PADDING = 3, EDGE = 20};

extern BOOL g_bShowDot;
//////////////////////////////////////////////////////////////////////////////
// helpers
CEnTabCtrl::CEnTabCtrl()
{
}

CEnTabCtrl::~CEnTabCtrl()
{
	m_SelFont.DeleteObject();
	m_UnselFont.DeleteObject();
}

/////////////////////////////////////////////////////////////////////////////
// CEnTabCtrl message handlers

void CEnTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
	TC_ITEM     tci;
	CDC* pDC = CDC::FromHandle(lpdis->hDC);
	HIMAGELIST hilTabs = (HIMAGELIST)TabCtrl_GetImageList(GetSafeHwnd());

	BOOL bSelected = (lpdis->itemID == (UINT)GetCurSel());
	BOOL bColor = (s_dwCustomLook & ETC_COLOR);

	CRect rItem(lpdis->rcItem);

	BOOL bBottom = GetStyle() & TCS_BOTTOM;
	if (m_nTabStyle==0 && !bSelected)
	{
		if (bBottom)
		{
			rItem.left -= 1;
			rItem.top -= 2;
		}
		else
		{
			rItem.left -= 1;
			rItem.bottom += 2;
		}
	}
	else if (m_nTabStyle==1)
	{
		if (bBottom)
		{
			rItem.bottom += 2;
			if (bSelected)
				rItem.top -= 1;
		}
		else
		{
			rItem.top -= 2;
			if (bSelected)
				rItem.bottom += 1;
		}
	}

	// blend from back color to COLOR_3DFACE if 16 bit mode or better
	COLORREF crFrom = GetTabColor(bSelected);
	
	// simple solid fill
	pDC->FillSolidRect(rItem, crFrom);

	// text & icon
	rItem.left += PADDING;
	rItem.top += PADDING+1;
	//
	if (m_nTabStyle==0 && !bSelected)
	{
		if (bBottom)
			rItem.top-=2;
		else
			rItem.top--;
	}

	pDC->SetBkMode(TRANSPARENT);

	CString sTemp;
	tci.mask        = TCIF_TEXT | TCIF_IMAGE;
	tci.pszText     = sTemp.GetBuffer(100);
	tci.cchTextMax  = 99;
	GetItem(lpdis->itemID, &tci);
	sTemp.ReleaseBuffer();

	// icon
	if (hilTabs && tci.iImage>=0)
	{
		ImageList_Draw(hilTabs, tci.iImage, *pDC, rItem.left, rItem.top-1, ILD_TRANSPARENT);
		rItem.left += 16 + PADDING;//16+
	}

	// text
	rItem.right -= PADDING;
	//FormatText(sTemp, pDC, rItem.Width());

	if (bSelected)
		pDC->SetTextColor(m_crSelFontColor);
	else
		pDC->SetTextColor(m_crUnSelFontColor);
	pDC->SelectObject(&m_UnselFont);
	if (g_bShowDot)
		pDC->DrawText(sTemp, rItem, DT_NOPREFIX | DT_END_ELLIPSIS );
	else
		pDC->DrawText(sTemp, rItem, DT_NOPREFIX  );
}

void CEnTabCtrl::DrawItemBorder(LPDRAWITEMSTRUCT lpdis)
{
	ASSERT (s_dwCustomLook & ETC_FLAT);

	BOOL bSelected = (lpdis->itemID == (UINT)GetCurSel());
	BOOL bBackTabs = (s_dwCustomLook & ETC_BACKTABS);

	CRect rItem(lpdis->rcItem);
	BOOL bBottom = GetStyle() & TCS_BOTTOM;
	if (bBottom)
	{
		rItem.bottom += 2;
	}
	else
	{
		rItem.top -= 2;
	}
	CDC* pDC = CDC::FromHandle(lpdis->hDC); 

	COLORREF crTab = GetTabColor(bSelected);

	if (bSelected)
	{
		BOOL bBottom = GetStyle() & TCS_BOTTOM;
		if (bBottom)
			rItem.top -= 1;
		else
			rItem.bottom += 1;

		// edges
		pDC->FillSolidRect(CRect(rItem.left, rItem.top, rItem.left + 1, rItem.bottom), 0xFFFFFF);
		if (bBottom)
			pDC->FillSolidRect(CRect(rItem.left, rItem.bottom, rItem.right, rItem.bottom - 1), 0x433F3E);
		else
			pDC->FillSolidRect(CRect(rItem.left, rItem.top, rItem.right, rItem.top + 1), 0xFFFFFF);
		pDC->FillSolidRect(CRect(rItem.right - 1, rItem.top, rItem.right, rItem.bottom), 0x433F3E);
	}
	else // draw simple dividers
	{
		pDC->FillSolidRect(CRect(rItem.right, rItem.top+4, rItem.right+1, rItem.bottom-4), m_crSepColor);
	}
}

void CEnTabCtrl::DrawMainBorder(LPDRAWITEMSTRUCT lpdis)
{
	CRect rItem(lpdis->rcItem);
	CDC* pDC = CDC::FromHandle(lpdis->hDC); 

	BOOL bBottom = GetStyle() & TCS_BOTTOM;
	if (bBottom)
	{
		rItem.top = rItem.bottom-1;
		pDC->FillSolidRect(rItem, 0);
	}
	else
	{
		rItem.bottom = rItem.top+1 ;
		pDC->FillSolidRect(rItem, 0xFFFFFF);
	}
}

COLORREF CEnTabCtrl::GetTabColor(BOOL bSelected)
{
	if (!bSelected)
		return m_crUnSelColor;
	else
		return ::GetSysColor(COLOR_3DFACE);
}

void CEnTabCtrl::EnableCustomLook(BOOL bEnable, DWORD dwStyle)
{
	if (!bEnable)
		dwStyle = 0;

	s_dwCustomLook = dwStyle;
}

void CEnTabCtrl::PreSubclassWindow() 
{
	CBaseTabCtrl::PreSubclassWindow();

	if (s_dwCustomLook)
		ModifyStyle(0, TCS_OWNERDRAWFIXED);
}

void CEnTabCtrl::SetFonts(int nSelWeight,   BOOL bSelItalic,   BOOL bSelUnderline,
						  int nUnselWeight, BOOL bUnselItalic, BOOL bUnselUnderline)
{
	// Free any memory currently used by the fonts.
	m_SelFont.DeleteObject();
	m_UnselFont.DeleteObject();

	LOGFONT lFont;
	ZeroMemory ((PVOID) &lFont,sizeof (LOGFONT));
	NONCLIENTMETRICS nm;
	nm.cbSize = sizeof (NONCLIENTMETRICS);
	VERIFY (SystemParametersInfo(SPI_GETNONCLIENTMETRICS,nm.cbSize,&nm,0)); 
	lFont =  nm.lfMenuFont;

	lFont.lfWeight = nUnselWeight;
	lFont.lfItalic = bSelItalic;
	lFont.lfUnderline = bSelUnderline;
	m_SelFont.CreateFontIndirect(&lFont);

	// Create the "Unselected" font
	lFont.lfWeight = nUnselWeight;
	lFont.lfItalic = bUnselItalic;
	lFont.lfUnderline = bUnselUnderline;
	m_UnselFont.CreateFontIndirect(&lFont);

	SetFont( (nSelWeight > nUnselWeight)? &m_SelFont : &m_UnselFont);
}

⌨️ 快捷键说明

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