www.pudn.com > CustomTabCtrlDemo.rar > CustomTabCtrl.h


#pragma once 
 
/********************************************************************** 
** 
**	CustomTabCtrl.h : include file 
** 
**	by Andrzej Markowski June 2004 
** 
**********************************************************************/ 
 
#include  
#include  
 
#include "themeutil.h" 
 
// CustomTabCtrlItem 
 
#define TAB_SHAPE1		0		//  Invisible 
 
#define TAB_SHAPE2		1		//	 __ 
								//	| / 
								//	|/ 
 
#define TAB_SHAPE3		2		//	|\ 
								//	|/ 
 
#define TAB_SHAPE4		3		//	____________ 
								//	\          / 
								//   \________/ 
 
#define TAB_SHAPE5		4		//	___________ 
								//	\          \ 
								//	  \________/ 
 
#define RECALC_PREV_PRESSED			0 
#define RECALC_NEXT_PRESSED			1 
#define RECALC_ITEM_SELECTED		2 
#define RECALC_RESIZED				3 
#define RECALC_FIRST_PRESSED		4 
#define RECALC_LAST_PRESSED			5 
#define RECALC_EDIT_RESIZED			6 
 
#define MAX_LABEL_TEXT				30 
 
typedef struct _CTC_NMHDR  
{ 
    NMHDR hdr; 
	int	nItem; 
	TCHAR pszText[MAX_LABEL_TEXT]; 
	LPARAM lParam; 
	RECT rItem; 
	POINT ptHitTest; 
	BOOL fSelected; 
	BOOL fHighlighted; 
} CTC_NMHDR; 
 
class CCustomTabCtrlItem 
{ 
	friend class CCustomTabCtrl; 
private: 
								CCustomTabCtrlItem(CString sText, LPARAM lParam); 
	void						ComputeRgn(); 
	void						Draw(CDC& dc, CFont& font); 
	BOOL						HitTest(CPoint pt)			{ return (m_bShape && m_rgn.PtInRegion(pt)) ? TRUE : FALSE; } 
	void						GetRegionPoints(const CRect& rc, CPoint* pts) const; 
	void						GetDrawPoints(const CRect& rc, CPoint* pts) const; 
	void						operator=(const CCustomTabCtrlItem &other); 
private: 
	CString						m_sText; 
	LPARAM						m_lParam; 
	CRect						m_rect; 
	CRect						m_rectText; 
	CRgn						m_rgn;			 
	BYTE						m_bShape; 
	BOOL						m_fSelected; 
	BOOL						m_fHighlighted; 
	BOOL						m_fHighlightChanged; 
}; 
 
// CCustomTabCtrl 
 
// styles 
#define CTCS_FIXEDWIDTH			1		// Makes all tabs the same width.  
#define CTCS_FOURBUTTONS		2		// Four buttons (First, Prev, Next, Last)  
#define CTCS_AUTOHIDEBUTTONS	4		// Auto hide buttons 
#define CTCS_TOOLTIPS			8		// Tooltips 
#define CTCS_MULTIHIGHLIGHT		16		// Multi highlighted items 
#define CTCS_EDITLABELS			32		// Allows item text to be edited in place 
#define CTCS_DRAGMOVE			64		// Allows move items 
#define CTCS_DRAGCOPY			128		// Allows copy items 
 
// hit test 
#define CTCHT_ONFIRSTBUTTON		-1 
#define CTCHT_ONPREVBUTTON		-2 
#define CTCHT_ONNEXTBUTTON		-3 
#define CTCHT_ONLASTBUTTON		-4 
#define CTCHT_NOWHERE			-5 
 
// notification messages 
#define CTCN_CLICK				1 
#define CTCN_RCLICK				2 
#define CTCN_SELCHANGE			3 
#define CTCN_HIGHLIGHTCHANGE	4 
#define CTCN_ITEMMOVE			5 
#define CTCN_ITEMCOPY			6 
#define CTCN_LABELUPDATE		7 
#define CTCN_OUTOFMEMORY		8 
 
#define CTCID_FIRSTBUTTON		-1 
#define CTCID_PREVBUTTON		-2 
#define CTCID_NEXTBUTTON		-3	 
#define CTCID_LASTBUTTON		-4 
#define CTCID_NOBUTTON			-5 
 
#define CTCID_EDITCTRL			1 
 
#define REPEAT_TIMEOUT			250 
 
// error codes 
#define CTCERR_NOERROR					0 
#define CTCERR_OUTOFMEMORY				-1 
#define CTCERR_INDEXOUTOFRANGE			-2 
#define CTCERR_NOEDITLABELSTYLE			-3 
#define CTCERR_NOMULTIHIGHLIGHTSTYLE	-4 
#define CTCERR_ITEMNOTSELECTED			-5 
#define CTCERR_ALREADYINEDITMODE		-6 
#define CTCERR_TEXTTOOLONG				-7 
#define CTCERR_NOTOOLTIPSSTYLE			-8 
#define CTCERR_CREATETOOLTIPFAILED		-9 
 
// button states 
#define BNST_INVISIBLE			0 
#define BNST_NORMAL				DNHZS_NORMAL 
#define BNST_HOT				DNHZS_HOT 
#define BNST_PRESSED			DNHZS_PRESSED 
 
#define CustomTabCtrl_CLASSNAME    _T("CCustomTabCtrl")  // Window class name 
 
class CCustomTabCtrl : public CWnd 
{ 
public: 
 
	// Construction 
 
	CCustomTabCtrl(); 
	virtual						~CCustomTabCtrl(); 
	BOOL						Create(UINT dwStyle, const CRect & rect, CWnd * pParentWnd, UINT nID); 
 
	// Attributes 
 
	int							GetItemCount() {return m_aItems.GetSize();} 
	int							GetCurSel() { return m_nItemSelected; } 
	int							SetCurSel(int nItem); 
	int							IsItemHighlighted(int nItem); 
	int							HighlightItem(int nItem, BOOL fHighlight); 
	int							GetItemData(int nItem, DWORD& dwData); 
	int							SetItemData(int nItem, DWORD dwData); 
	int							GetItemText(int nItem, CString& sText); 
	int							SetItemText(int nItem, CString sText); 
	int							GetItemRect(int nItem, CRect& rect) const; 
	int							SetItemTooltipText(int nItem, CString sText); 
	void						SetDragCursors(HCURSOR hCursorMove, HCURSOR hCursorCopy); 
	BOOL						ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags); 
	void						SetControlFont(const LOGFONT& lf, BOOL fRedraw=FALSE); 
	static const LOGFONT&		GetDefaultFont() {return lf_default;} 
 
	// Operations 
 
	int							InsertItem(int nItem, CString sText, LPARAM lParam=0); 
	int							DeleteItem(int nItem); 
	void						DeleteAllItems(); 
	int							MoveItem(int nItemSrc, int nItemDst); 
	int							CopyItem(int nItemSrc, int nItemDst); 
	int							HitTest(CPoint pt); 
	int							EditLabel(int nItem); 
 
	// Overrides 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CCustomTabCtrl) 
	protected: 
	virtual void PreSubclassWindow(); 
	virtual BOOL PreTranslateMessage(MSG* pMsg); 
	//}}AFX_VIRTUAL 
 
protected: 
	//{{AFX_MSG(CCustomTabCtrl) 
	afx_msg BOOL				OnEraseBkgnd(CDC* pDC); 
	afx_msg void				OnLButtonDown(UINT nFlags, CPoint point); 
	afx_msg void				OnRButtonDown(UINT nFlags, CPoint point); 
	afx_msg void				OnLButtonUp(UINT nFlags, CPoint point); 
	afx_msg LONG				OnMouseLeave(WPARAM wParam, LPARAM lParam); 
	afx_msg LONG				OnThemeChanged(WPARAM wParam, LPARAM lParam); 
	afx_msg void				OnMouseMove(UINT nFlags, CPoint point); 
	afx_msg void				OnPaint(); 
	afx_msg void				OnSize(UINT nType, int cx, int cy); 
	afx_msg void				OnLButtonDblClk(UINT nFlags, CPoint point); 
	afx_msg void				OnTimer(UINT nIDEvent); 
	afx_msg void				OnUpdateEdit(); 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP()	 
 
private: 
	void						RecalcLayout(int nRecalcType,int nItem); 
	void						RecalcEditResized(int nOffset, int nItem); 
	void						RecalcOffset(int nOffset); 
	int							RecalcRectangles(); 
	BOOL						RegisterWindowClass(); 
	int							ProcessLButtonDown(int nHitTest, UINT nFlags, CPoint point); 
	int							MoveItem(int nItemSrc, int nItemDst, BOOL fMouseSel); 
	int							CopyItem(int nItemSrc, int nItemDst, BOOL fMouseSel); 
	int							SetCurSel(int nItem, BOOL fMouseSel, BOOL fCtrlPressed); 
	int							HighlightItem(int nItem, BOOL fMouseSel, BOOL fCtrlPressed); 
	void						DrawGlyph(CDC& dc, CPoint& pt, int nImageNdx, int nColorNdx); 
	void						DrawBkLeftSpin(CDC& dc, CRect& r, int nImageNdx); 
	void						DrawBkRightSpin(CDC& dc, CRect& r, int nImageNdx); 
	BOOL						NotifyParent(UINT code, int nItem, CPoint pt); 
	int							EditLabel(int nItem, BOOL fMouseSel); 
private: 
	static LOGFONT				lf_default; 
	static BYTE					m_bBitsGlyphs[]; 
	HCURSOR						m_hCursorMove; 
	HCURSOR						m_hCursorCopy; 
	CFont						m_Font; 
	CFont						m_FontSelected; 
	int							m_nItemSelected; 
	int							m_nItemNdxOffset; 
	int							m_nItemDragDest; 
	int							m_nPrevState; 
	int							m_nNextState; 
	int							m_nFirstState; 
	int							m_nLastState; 
	int							m_nButtonIDDown; 
	DWORD						m_dwLastRepeatTime; 
	COLORREF					m_rgbGlyph[4]; 
	CBitmap						m_bmpGlyphsMono; 
	HBITMAP						m_hBmpBkLeftSpin; 
	BOOL						m_fIsLeftImageHorLayout; 
	MY_MARGINS					m_mrgnLeft; 
	MY_MARGINS					m_mrgnRight; 
	HBITMAP						m_hBmpBkRightSpin; 
	BOOL						m_fIsRightImageHorLayout; 
	CToolTipCtrl				m_ctrlToolTip; 
	CEdit						m_ctrlEdit; 
	CArray 	m_aItems; 
};