/**********************************************************************
**
** CustomTabCtrl.cpp : implementation file of CCustomTabCtrl class
**
** by Andrzej Markowski June 2004
**
**********************************************************************/
#include "stdafx.h"
#include "CustomTabCtrl.h"
#include "resource.h"
// CCustomTabCtrlItem
CCustomTabCtrlItem::CCustomTabCtrlItem(CString sText,LPARAM lParam) :
m_sText(sText),
m_lParam(lParam),
m_bShape(TAB_SHAPE1),
m_fSelected(FALSE),
m_fHighlighted(FALSE),
m_fHighlightChanged(FALSE)
{
}
void CCustomTabCtrlItem::operator=(const CCustomTabCtrlItem &other)
{
m_sText = other.m_sText;
m_lParam = other.m_lParam;
}
void CCustomTabCtrlItem::ComputeRgn()
{
m_rgn.DeleteObject();
CPoint pts[6];
GetRegionPoints(m_rect,pts);
m_rgn.CreatePolygonRgn(pts, 6, WINDING);
}
void CCustomTabCtrlItem::GetRegionPoints(const CRect& rc, CPoint* pts) const
{
switch(m_bShape)
{
case TAB_SHAPE2:
{
pts[0] = rc.TopLeft();
pts[1] = CPoint(rc.left, rc.bottom);
pts[2] = CPoint(rc.left + rc.Height()/2, rc.top);
pts[3] = CPoint(rc.left + rc.Height()/2, rc.top);
pts[4] = CPoint(rc.left + rc.Height()/2, rc.top);
pts[5] = CPoint(rc.left + rc.Height()/2, rc.top);
}
break;
case TAB_SHAPE3:
{
pts[0] = rc.TopLeft();
pts[1] = CPoint(rc.left + rc.Height()/4, rc.Height()/2);
pts[2] = CPoint(rc.left, rc.bottom);
pts[3] = CPoint(rc.left, rc.bottom);
pts[4] = CPoint(rc.left, rc.bottom);
pts[5] = CPoint(rc.left, rc.bottom);
}
break;
case TAB_SHAPE4:
{
pts[0] = rc.TopLeft();
pts[1] = CPoint(rc.left + rc.Height()/4, rc.Height()/2);
pts[2] = CPoint(rc.left + rc.Height()/2, rc.bottom);
pts[3] = CPoint(rc.right - rc.Height()/2, rc.bottom);
pts[4] = CPoint(rc.right - rc.Height()/4, rc.Height()/2);
pts[5] = CPoint(rc.right, rc.top);
}
break;
case TAB_SHAPE5:
{
pts[0] = rc.TopLeft();
pts[1] = CPoint(rc.left + rc.Height()/4, rc.Height()/2);
pts[2] = CPoint(rc.left + rc.Height()/2 , rc.bottom);
pts[3] = CPoint(rc.right - rc.Height()/2, rc.bottom);
pts[4] = CPoint(rc.right - rc.Height()/4, rc.Height()/2);
pts[5] = CPoint(rc.right - rc.Height()/2, rc.top);
}
break;
default:
{
pts[0] = CPoint(0,0);
pts[1] = CPoint(0,0);
pts[2] = CPoint(0,0);
pts[3] = CPoint(0,0);
pts[4] = CPoint(0,0);
pts[5] = CPoint(0,0);
}
break;
}
}
void CCustomTabCtrlItem::GetDrawPoints(const CRect& rc, CPoint* pts) const
{
switch(m_bShape)
{
case TAB_SHAPE2:
case TAB_SHAPE3:
{
pts[0] = CPoint(rc.left, rc.bottom);
pts[1] = CPoint(rc.left + rc.Height()/2, rc.top);
}
break;
case TAB_SHAPE4:
case TAB_SHAPE5:
{
pts[0] = rc.TopLeft();
pts[1] = CPoint(rc.left + rc.Height()/2, rc.bottom);
pts[2] = CPoint(rc.right - rc.Height()/2, rc.bottom);
pts[3] = CPoint(rc.right, rc.top);
}
break;
}
}
void CCustomTabCtrlItem::Draw(CDC& dc, CFont& font)
{
COLORREF bgColor = GetSysColor((m_fSelected||m_fHighlighted) ? COLOR_WINDOW : COLOR_3DFACE);
COLORREF fgColor = GetSysColor((m_fSelected ||m_fHighlighted) ? COLOR_WINDOWTEXT : COLOR_BTNTEXT);
CBrush brush(bgColor);
CPen blackPen(PS_SOLID, 1, GetSysColor(COLOR_BTNTEXT));
CPen shadowPen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW));
CPoint pts[4];
CRect rc = m_rect;
GetDrawPoints(rc, pts);
// Paint item background
dc.FillRgn(&m_rgn, &brush);
CPen* pOldPen = dc.SelectObject(&blackPen);
// draw item
switch(m_bShape)
{
case TAB_SHAPE2:
case TAB_SHAPE3:
{
dc.MoveTo(pts[0]);
dc.LineTo(pts[1]);
if(!m_fSelected)
{
dc.SelectObject(&shadowPen);
dc.MoveTo(pts[0].x-1,pts[0].y);
dc.LineTo(pts[1].x-1,pts[1].y);
}
}
break;
case TAB_SHAPE4:
case TAB_SHAPE5:
{
dc.MoveTo(pts[0]);
dc.LineTo(pts[1]);
dc.SelectObject(&shadowPen);
dc.LineTo(pts[2]);
if(!m_fSelected)
{
dc.MoveTo(pts[2].x-1,pts[2].y);
dc.LineTo(pts[3].x-1,pts[3].y);
}
dc.SelectObject(&blackPen);
dc.MoveTo(pts[2]);
dc.LineTo(pts[3]);
// draw item text
COLORREF bgOldColor = dc.SetBkColor(bgColor);
COLORREF fgOldColor = dc.SetTextColor(fgColor);
rc.DeflateRect(rc.Height()/2, 2,rc.Height()/2,2);
CFont* pOldFont = dc.SelectObject(&font);
dc.DrawText(m_sText, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
dc.SelectObject(pOldFont);
dc.SetTextColor(fgOldColor);
dc.SetBkColor(bgOldColor);
}
break;
}
dc.SelectObject(pOldPen);
}
// CCustomTabCtrl
LOGFONT CCustomTabCtrl::lf_default = {12, 0, 0, 0, FW_NORMAL, 0, 0, 0,
DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif"};
BYTE CCustomTabCtrl::m_bBitsGlyphs[] = {0xBD,0xFB,0xDF,0xBD,
0xB9,0xF3,0xCF,0x9D,
0xB1,0xE3,0xC7,0x8D,
0xA3,0xC7,0xE3,0xC5,
0xB1,0xE3,0xC7,0x8D,
0xB9,0xF3,0xCF,0x9D,
0xBD,0xFB,0xDF,0xBD};
CCustomTabCtrl::CCustomTabCtrl() :
m_nButtonIDDown(CTCID_NOBUTTON),
m_nPrevState(BNST_INVISIBLE),
m_nNextState(BNST_INVISIBLE),
m_nFirstState(BNST_INVISIBLE),
m_nLastState(BNST_INVISIBLE),
m_nItemSelected(-1),
m_nItemNdxOffset(0),
m_dwLastRepeatTime(0),
m_hBmpBkLeftSpin(NULL),
m_hBmpBkRightSpin(NULL),
m_hCursorMove(NULL),
m_hCursorCopy(NULL),
m_nItemDragDest(0)
{
RegisterWindowClass();
SetControlFont(GetDefaultFont());
m_bmpGlyphsMono.CreateBitmap(32,7,1,1,m_bBitsGlyphs);
}
// Register the window class if it has not already been registered.
BOOL CCustomTabCtrl::RegisterWindowClass()
{
WNDCLASS wndcls;
HINSTANCE hInst = AfxGetInstanceHandle();
if (!(::GetClassInfo(hInst, CustomTabCtrl_CLASSNAME, &wndcls)))
{
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
wndcls.hInstance = hInst;
wndcls.hIcon = NULL;
wndcls.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
wndcls.hbrBackground = (HBRUSH) (COLOR_3DFACE + 1);
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName = CustomTabCtrl_CLASSNAME;
if (!AfxRegisterClass(&wndcls))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
CCustomTabCtrl::~CCustomTabCtrl()
{
for(int i=0; i< m_aItems.GetSize(); i++)
delete m_aItems[i];
m_aItems.RemoveAll();
::DeleteObject(m_hBmpBkLeftSpin);
m_hBmpBkLeftSpin = NULL;
::DeleteObject(m_hBmpBkRightSpin);
m_hBmpBkRightSpin = NULL;
::DestroyCursor(m_hCursorMove);
m_hCursorMove = NULL;
::DestroyCursor(m_hCursorCopy);
m_hCursorCopy = NULL;
}
BEGIN_MESSAGE_MAP(CCustomTabCtrl, CWnd)
//{{AFX_MSG_MAP(CCustomTabCtrl)
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(THM_WM_THEMECHANGED,OnThemeChanged)
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_LBUTTONDBLCLK()
ON_WM_TIMER()
ON_EN_UPDATE(CTCID_EDITCTRL, OnUpdateEdit)
//}}AFX_MSG_MAP
// ON_WM_NCRBUTTONDOWN()
ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()
// CCustomTabCtrl message handlers
BOOL CCustomTabCtrl::Create(UINT dwStyle, const CRect & rect, CWnd * pParentWnd, UINT nID)
{
return CWnd::Create(CustomTabCtrl_CLASSNAME, _T(""), dwStyle, rect, pParentWnd, nID);
}
BOOL CCustomTabCtrl::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CCustomTabCtrl::OnPaint()
{
CPaintDC dc(this);
if(!m_hBmpBkLeftSpin)
{
m_rgbGlyph[0] = GetSysColor(COLOR_BTNTEXT);
m_rgbGlyph[1] = GetSysColor(COLOR_BTNTEXT);
m_rgbGlyph[2] = GetSysColor(COLOR_BTNTEXT);
m_rgbGlyp
没有合适的资源?快使用搜索试试~ 我知道了~
supecclass__temporary.rar_Tabú
共24个文件
h:8个
cpp:5个
cur:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 106 浏览量
2022-09-21
22:00:08
上传
评论
收藏 49KB RAR 举报
温馨提示
一个自绘TAB控件,类似Excel中的Sheet标签
资源推荐
资源详情
资源评论
收起资源包目录
supecclass__temporary.rar (24个子文件)
CustomTabCtrlDemo.rc 7KB
CustomTabCtrlDemo.plg 2KB
res
CustomTabCtrlDemo.ico 1KB
DRAGMOVE.CUR 326B
CustomTabCtrlDemo.rc2 409B
DRAGCOPY.CUR 326B
ThemeUtil.cpp 6KB
e4CustomTabCtrlDemo.aps 23KB
6CustomTabCtrlDemo.dsp 5KB
CustomTabCtrlDemo.h 1KB
CustomTabCtrlDemoDlg.cpp 18KB
CustomTabCtrlDemoDlg.h 3KB
Tmschema.h 45KB
StdAfx.cpp 219B
LCustomTabCtrlDemo.cpp 2KB
resource.h 1KB
StdAfx.h 999B
CustomTabCtrlDemo.ncb 65KB
kCustomTabCtrl.cpp 67KB
CustomTabCtrlDemo.opt 53KB
0CustomTabCtrlDemo.dsw 559B
y8CustomTabCtrl.h 7KB
ThemeUtil.h 2KB
Schemadef.h 4KB
共 24 条
- 1
资源评论
小贝德罗
- 粉丝: 67
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功