📄 cooltabctrl.cpp
字号:
/*####################################################################
Filename: cooltabctrl.cpp
----------------------------------------------------
Remarks: ...
----------------------------------------------------
####################################################################*/
#include "stdafx.h"
#include "resource.h"
#include "CoolTabCtrl.h"
#include "tools.h"
#include<MMSYSTEM.H>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*####################################################################
------------------------------------------------
class CTabPageItem
------------------------------------------------
####################################################################*/
CTabPageItem::CTabPageItem(CCoolTabCtrl* pParentWnd, CWnd* pWnd,
const CString &strText, int nNumber)
{
m_pParentWnd = pParentWnd;
m_pWnd = pWnd;
m_dwState = 0;
m_strText = strText;
m_nNumber = nNumber;
m_hIcon = NULL;
}
CTabPageItem::~CTabPageItem()
{
if (m_hIcon != NULL)
{
DestroyIcon(m_hIcon);
m_hIcon = NULL;
}
}
void CTabPageItem::SetIcon(HICON hIcon)
{
if (m_hIcon != NULL)
{
DestroyIcon(m_hIcon);
m_hIcon = NULL;
}
m_hIcon = hIcon;
}
void CTabPageItem::Expend()
{
m_pWnd->MoveWindow(m_rect);
m_pWnd->ShowWindow(SW_SHOW);
m_pWnd->UpdateWindow();
}
void CTabPageItem::SetRect(const CRect &rect)
{
m_rect = rect;
}
void CTabPageItem::Hide()
{
m_pWnd->ShowWindow(SW_HIDE);
}
void CTabPageItem::OnDraw(CDC *pDC, int nState)
{
CRect rect(m_rcLabel);
switch (m_pParentWnd->m_nMode)
{
case TABMODE_NONE:
break;
case TABMODE_GROUP:
{
pDC->FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
switch (m_dwState)
{
case 0: pDC->Draw3dRect(rect, RGB(255,255,255), ::GetSysColor(COLOR_3DSHADOW));
break;
case 1: pDC->Draw3dRect(rect, ::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_3DFACE));
break;
}
pDC->SetBkMode(TRANSPARENT);
if (m_hIcon != NULL)
{
::DrawIconEx( pDC->m_hDC, rect.left + 3, rect.top + 1, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);
}
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(m_strText, rect, DT_CENTER | DT_SINGLELINE |DT_VCENTER);
}
break;
case TABMODE_BOTTOMTAB:
{
COLORREF backcolor = ::GetSysColor(COLOR_3DFACE);
CPen pen(0, 1, AlphaBlendColor(backcolor, 180));
CPen *oldpen = pDC->SelectObject(&pen);
if (m_nNumber != m_pParentWnd->m_nActivePage)
{
rect.DeflateRect(1, 0);
}
else
{
rect.DeflateRect(-1, -1, -1, 0);
}
pDC->MoveTo(rect.left + 2, rect.bottom);
pDC->LineTo(rect.right - 1, rect.bottom);
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.left, rect.bottom - 1);
pDC->MoveTo(rect.right, rect.top);
pDC->LineTo(rect.right, rect.bottom - 1);
if (m_nNumber == m_pParentWnd->m_nActivePage)
{
CRect rc(rect);
rc.DeflateRect(1, 0, 0, 0);
FillGradient(pDC, rc, RGB(255, 255, 255), ::GetSysColor(COLOR_3DFACE));
}
else
{
CRect rc(rect);
rc.DeflateRect(1, 0, 0, 0);
FillGradient(pDC, rc, RGB(245, 245, 245), ::GetSysColor(COLOR_3DFACE));
}
pDC->SetPixel(rect.left + 1, rect.bottom - 1, AlphaBlendColor(backcolor, 180));
pDC->SetPixel(rect.right - 1, rect.bottom - 1, AlphaBlendColor(backcolor, 180));
pDC->SelectObject(oldpen);
pDC->SetBkMode(TRANSPARENT);
if (m_hIcon != NULL)
{
::DrawIconEx( pDC->m_hDC, rect.left + 7, rect.top + 1, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);
rect.left += 18;
}
rect.top += 2;
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(m_strText, rect, DT_CENTER | DT_SINGLELINE |DT_VCENTER);
}
break;
case TABMODE_TOPTAB:
{
COLORREF backcolor = ::GetSysColor(COLOR_3DFACE);
CPen pen(0, 1, AlphaBlendColor(backcolor, 180));
CPen *oldpen = pDC->SelectObject(&pen);
if (m_nNumber != m_pParentWnd->m_nActivePage)
{
rect.DeflateRect(1, 0);
}
else
{
rect.DeflateRect(-1, 0, -1, -1);
}
pDC->MoveTo(rect.left + 2, rect.top);
pDC->LineTo(rect.right - 1, rect.top);
pDC->MoveTo(rect.left, rect.top +2);
pDC->LineTo(rect.left, rect.bottom);
pDC->MoveTo(rect.right, rect.top + 2);
pDC->LineTo(rect.right, rect.bottom);
if (m_nNumber == m_pParentWnd->m_nActivePage)
{
CRect rc(rect);
rc.DeflateRect(1, 1, 0, 0);
FillGradient(pDC, rc, ::GetSysColor(COLOR_3DFACE), RGB(255, 255, 255));
}
else
{
CRect rc(rect);
rc.DeflateRect(1, 1, 0, 0);
FillGradient(pDC, rc, ::GetSysColor(COLOR_3DFACE), RGB(245, 245, 245));
}
pDC->SetPixel(rect.left + 1, rect.top + 1, AlphaBlendColor(backcolor, 180));
pDC->SetPixel(rect.right - 1, rect.top + 1, AlphaBlendColor(backcolor, 180));
pDC->SelectObject(oldpen);
pDC->SetBkMode(TRANSPARENT);
if (m_hIcon != NULL)
{
::DrawIconEx( pDC->m_hDC, rect.left + 7, rect.top + 1, m_hIcon, 16, 16, NULL, NULL, DI_NORMAL);
rect.left += 18;
}
rect.top += 2;
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(m_strText, rect, DT_CENTER | DT_SINGLELINE |DT_VCENTER);
}
break;
default:
ASSERT(FALSE);
break;
}
}
/*#################################################################
------------------------
构建,析构函数
------------------------
#################################################################*/
IMPLEMENT_DYNCREATE(CCoolTabCtrl, CWnd)
CCoolTabCtrl::CCoolTabCtrl()
{
m_nActivePage = 0;
m_dwStyle = 0;
m_dwBorderStyle = 0;
m_nHotItem = 0;
m_nMode = TABMODE_NONE;
}
CCoolTabCtrl::~CCoolTabCtrl()
{
int count = m_aTabPage.GetSize();
for (int i = 0; i < count; i++)
{
delete m_aTabPage.GetAt(i);
}
m_aTabPage.RemoveAll();
}
BOOL CCoolTabCtrl::Create(const CRect &rect, CWnd *pParentWnd, UINT dwStyle, UINT dwCtrlStyle, UINT nID)
{
m_dwStyle = dwCtrlStyle;
if (CWnd::Create(AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)GetStockObject(LTGRAY_BRUSH), NULL),
NULL, dwStyle, rect, pParentWnd, nID))
{
LOGFONT logFont;
ZeroMemory((void*)&logFont,sizeof(logFont));
strcpy(logFont.lfFaceName,"宋体");
logFont.lfHeight = -12;
logFont.lfWeight = 400;
logFont.lfCharSet = GB2312_CHARSET;
logFont.lfOutPrecision = 3;
logFont.lfClipPrecision = 2;
logFont.lfQuality = 1;
logFont.lfPitchAndFamily = 2;
m_fontWnd.CreateFontIndirect(&logFont);
SetFont(&m_fontWnd);
return TRUE;
}
return FALSE;
}
/*#################################################################
-------------------------------
消息处理函数
CCoolTabCtrl message handlers
-------------------------------
#################################################################*/
BEGIN_MESSAGE_MAP(CCoolTabCtrl, CWnd)
//{{AFX_MSG_MAP(CCoolTabCtrl)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_NCPAINT()
ON_WM_CREATE()
ON_WM_NCCALCSIZE()
ON_WM_WINDOWPOSCHANGING()
ON_WM_NCHITTEST()
ON_WM_NCLBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CCoolTabCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
}
void CCoolTabCtrl::OnNcPaint()
{
CWindowDC windc(this); // device context for painting
int count = m_aTabPage.GetSize();
CRect rcWindow, rcClient;
GetWindowRect(rcWindow);
GetClientRect(&rcClient);
ClientToScreen(&rcClient);
rcClient.OffsetRect(-rcWindow.TopLeft());
rcWindow.OffsetRect(-rcWindow.TopLeft());
if (rcClient.bottom > rcClient.top && rcClient.right > rcClient.left)
{
windc.ExcludeClipRect(rcClient);
}
CMemDC dc(&windc, rcWindow);
CFont *oldfont = dc.SelectObject(&m_fontWnd);
dc.FillSolidRect(rcWindow, ::GetSysColor(COLOR_3DFACE));
switch (m_nMode)
{
case TABMODE_NONE:
{
DrawBoder(&dc, rcClient);
}
break;
case TABMODE_GROUP:
{
dc.Draw3dRect(rcWindow, RGB(157,157,155), RGB(255,255,255));
}
break;
case TABMODE_BOTTOMTAB:
{
DrawBoder(&dc, rcClient);
}
break;
case TABMODE_TOPTAB:
{
DrawBoder(&dc, rcClient);
}
break;
default:
ASSERT(FALSE);
break;
}
if (m_nMode != TABMODE_NONE && count > 0)
{
for (int i = 0; i < count; i++)
{
if (i != m_nActivePage)
{
m_aTabPage.GetAt(i)->OnDraw(&dc, 0);
}
}
ASSERT(m_nActivePage >= 0 && m_nActivePage < count);
if (m_nActivePage >= 0 && m_nActivePage < count)
{
m_aTabPage.GetAt(m_nActivePage)->OnDraw(&dc, 0);
}
}
dc.SelectObject(oldfont);
}
BOOL CCoolTabCtrl::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(rect);
// pDC->FillSolidRect(rect, RGB(255, 255, 255));
return TRUE;
}
int CCoolTabCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CCoolTabCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
{
CRect rect(lpncsp->rgrc[0]);
switch (m_nMode)
{
case TABMODE_NONE:
rect.DeflateRect(2, 2, 4, 4);
break;
case TABMODE_GROUP:
{
rect.DeflateRect(1, 1);
int count = m_aTabPage.GetSize();
if (count > 0 && m_nActivePage >= 0 && m_nActivePage < count)
{
rect.top += (m_nActivePage + 1) * 18;
rect.bottom -= (count - m_nActivePage - 1) * 18;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -