CustomTabCtrl.h
上传用户:tang1250
上传日期:2020-10-23
资源大小:86k
文件大小:8k
源码类别:

PropertySheet

开发平台:

Visual C++

  1. #pragma once
  2. /**********************************************************************
  3. **
  4. ** CustomTabCtrl.h : include file
  5. **
  6. ** by Andrzej Markowski June 2004
  7. **
  8. **********************************************************************/
  9. #include <Afxtempl.h>
  10. #include <afxcmn.h>
  11. #include "themeutil.h"
  12. #ifndef WS_EX_LAYOUTRTL
  13. #define WS_EX_LAYOUTRTL 0x400000
  14. #endif
  15. // CustomTabCtrlItem
  16. #define TAB_SHAPE1 0 //  Invisible
  17. #define TAB_SHAPE2 1 //  __
  18. // | /
  19. // |/
  20. #define TAB_SHAPE3 2 // |
  21. // |/
  22. #define TAB_SHAPE4 3 // ____________
  23. //           /
  24. //   ________/
  25. #define TAB_SHAPE5 4 // ___________
  26. //           
  27. //   ________/
  28. #define RECALC_PREV_PRESSED 0
  29. #define RECALC_NEXT_PRESSED 1
  30. #define RECALC_ITEM_SELECTED 2
  31. #define RECALC_RESIZED 3
  32. #define RECALC_FIRST_PRESSED 4
  33. #define RECALC_LAST_PRESSED 5
  34. #define RECALC_EDIT_RESIZED 6
  35. #define RECALC_CLOSE_PRESSED 7
  36. #define MAX_LABEL_TEXT 30
  37. typedef struct _CTC_NMHDR 
  38. {
  39.     NMHDR hdr;
  40. int nItem;
  41. TCHAR pszText[MAX_LABEL_TEXT];
  42. LPARAM lParam;
  43. RECT rItem;
  44. POINT ptHitTest;
  45. BOOL fSelected;
  46. BOOL fHighlighted;
  47. } CTC_NMHDR;
  48. class CCustomTabCtrlItem
  49. {
  50. friend class CCustomTabCtrl;
  51. private:
  52. CCustomTabCtrlItem(CString sText, LPARAM lParam);
  53. void ComputeRgn(BOOL fOnTop);
  54. void Draw(CDC& dc, CFont& font, BOOL fOnTop);
  55. BOOL HitTest(CPoint pt) { return (m_bShape && m_rgn.PtInRegion(pt)) ? TRUE : FALSE; }
  56. void GetRegionPoints(const CRect& rc, CPoint* pts, BOOL fOnTop) const;
  57. void GetDrawPoints(const CRect& rc, CPoint* pts, BOOL fOnTop) const;
  58. void operator=(const CCustomTabCtrlItem &other);
  59. private:
  60. CString m_sText;
  61. LPARAM m_lParam;
  62. CRect m_rect;
  63. CRect m_rectText;
  64. CRgn m_rgn;
  65. BYTE m_bShape;
  66. BOOL m_fSelected;
  67. BOOL m_fHighlighted;
  68. BOOL m_fHighlightChanged;
  69. BOOL bBorderLine;
  70. };
  71. // CCustomTabCtrl
  72. // styles 
  73. #define CTCS_FIXEDWIDTH 1 // Makes all tabs the same width.  
  74. #define CTCS_AUTOHIDEBUTTONS 4 // Auto hide buttons
  75. #define CTCS_TOOLTIPS 8 // Tooltips
  76. #define CTCS_MULTIHIGHLIGHT 16 // Multi highlighted items
  77. #define CTCS_EDITLABELS 32 // Allows item text to be edited in place
  78. #define CTCS_DRAGMOVE 64 // Allows move items
  79. #define CTCS_DRAGCOPY 128 // Allows copy items 
  80. #define CTCS_TOP 1024    // Location on top
  81. #define CTCS_RIGHT 2048    // Location on right
  82. #define CTCS_LEFT 3072 // Location on left
  83.  
  84. // notification messages
  85. #define CTCN_CLICK NM_CLICK
  86. #define CTCN_RCLICK NM_RCLICK
  87. #define CTCN_DBLCLK NM_DBLCLK
  88. #define CTCN_RDBLCLK NM_RDBLCLK
  89. #define CTCN_OUTOFMEMORY NM_OUTOFMEMORY
  90. #define CTCN_SELCHANGE NM_FIRST
  91. #define CTCN_HIGHLIGHTCHANGE NM_FIRST + 1
  92. #define CTCN_ITEMMOVE NM_FIRST + 2
  93. #define CTCN_ITEMCOPY NM_FIRST + 3
  94. #define CTCN_LABELUPDATE NM_FIRST + 4
  95.  
  96. #define CTCID_NOBUTTON -1
  97. #define CTCID_EDITCTRL 1
  98.  
  99. // error codes
  100. #define CTCERR_NOERROR 0
  101. #define CTCERR_OUTOFMEMORY -1
  102. #define CTCERR_INDEXOUTOFRANGE -2
  103. #define CTCERR_NOEDITLABELSTYLE -3
  104. #define CTCERR_NOMULTIHIGHLIGHTSTYLE -4
  105. #define CTCERR_ITEMNOTSELECTED -5
  106. #define CTCERR_ALREADYINEDITMODE -6
  107. #define CTCERR_TEXTTOOLONG -7
  108. #define CTCERR_NOTOOLTIPSSTYLE -8
  109. #define CTCERR_CREATETOOLTIPFAILED -9
  110. #define CTCERR_EDITNOTSUPPORTED -10
  111. // button states
  112. #define BNST_INVISIBLE 0
  113. #define BNST_NORMAL DNHZS_NORMAL
  114. #define BNST_HOT DNHZS_HOT
  115. #define BNST_PRESSED DNHZS_PRESSED
  116. #define CustomTabCtrl_CLASSNAME    _T("CCustomTabCtrl")  // Window class name
  117. class CCustomTabCtrl : public CWnd
  118. {
  119. public:
  120. // Construction
  121. CCustomTabCtrl();
  122. virtual ~CCustomTabCtrl();
  123. BOOL Create(UINT dwStyle, const CRect & rect, CWnd * pParentWnd, UINT nID);
  124. // Attributes
  125. void DrawBorderLines(BOOL bBorderLine=TRUE);
  126. int GetItemCount() {return m_aItems.GetSize();}
  127. int GetCurSel() { return m_nItemSelected; }
  128. int SetCurSel(int nItem);
  129. int IsItemHighlighted(int nItem);
  130. int HighlightItem(int nItem, BOOL fHighlight);
  131. int GetItemData(int nItem, DWORD& dwData);
  132. int SetItemData(int nItem, DWORD dwData);
  133. int GetItemText(int nItem, CString& sText);
  134. int SetItemText(int nItem, CString sText);
  135. int GetItemRect(int nItem, CRect& rect) const;
  136. int SetItemTooltipText(int nItem, CString sText);
  137. void SetDragCursors(HCURSOR hCursorMove, HCURSOR hCursorCopy);
  138. BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags=0);
  139. BOOL ModifyStyleEx(DWORD dwRemove, DWORD dwAdd, UINT nFlags=0);
  140. void SetControlFont(const LOGFONT& lf, BOOL fRedraw=FALSE);
  141. static const LOGFONT& GetDefaultFont() {return lf_default;}
  142. BOOL IsVertical() { return (GetStyle()&CTCS_TOP && GetStyle()&CTCS_RIGHT) || GetStyle()&CTCS_RIGHT;}
  143. // Operations
  144. int InsertItem(int nItem, CString sText, LPARAM lParam=0);
  145. int DeleteItem(int nItem);
  146. void DeleteAllItems();
  147. int MoveItem(int nItemSrc, int nItemDst);
  148. int CopyItem(int nItemSrc, int nItemDst);
  149. int HitTest(CPoint pt);
  150. int EditLabel(int nItem);
  151. // Overrides
  152. // ClassWizard generated virtual function overrides
  153. //{{AFX_VIRTUAL(CCustomTabCtrl)
  154. protected:
  155. virtual void PreSubclassWindow();
  156. virtual BOOL PreTranslateMessage(MSG* pMsg);
  157. //}}AFX_VIRTUAL
  158. protected:
  159. //{{AFX_MSG(CCustomTabCtrl)
  160. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  161. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  162. afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  163. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  164. afx_msg LONG OnMouseLeave(WPARAM wParam, LPARAM lParam);
  165. afx_msg LONG OnThemeChanged(WPARAM wParam, LPARAM lParam);
  166. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  167. afx_msg void OnPaint();
  168. afx_msg void OnSize(UINT nType, int cx, int cy);
  169. afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); 
  170. afx_msg void OnUpdateEdit();
  171. afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
  172. //}}AFX_MSG
  173. afx_msg LRESULT OnSizeParent(WPARAM, LPARAM lParam);
  174. DECLARE_MESSAGE_MAP()
  175. private:
  176. void RecalcLayout(int nRecalcType,int nItem);
  177. void RecalcEditResized(int nOffset, int nItem);
  178. void RecalcOffset(int nOffset);
  179. int RecalcRectangles();
  180. BOOL RegisterWindowClass();
  181. int ProcessLButtonDown(int nHitTest, UINT nFlags, CPoint point);
  182. int MoveItem(int nItemSrc, int nItemDst, BOOL fMouseSel);
  183. int CopyItem(int nItemSrc, int nItemDst, BOOL fMouseSel);
  184. int SetCurSel(int nItem, BOOL fMouseSel, BOOL fCtrlPressed);
  185. int HighlightItem(int nItem, BOOL fMouseSel, BOOL fCtrlPressed);
  186. void DrawGlyph(CDC& dc, CPoint& pt, int nImageNdx, int nColorNdx);
  187. void DrawBk(CDC& dc, CRect& r, HBITMAP hBmp, BOOL fIsImageHorLayout, MY_MARGINS& mrgn, int nImageNdx);
  188. BOOL NotifyParent(UINT code, int nItem, CPoint pt);
  189. int EditLabel(int nItem, BOOL fMouseSel);
  190. private:
  191. BOOL m_BorderLine;
  192. static LOGFONT lf_default;
  193. static BYTE m_bBitsGlyphs[];
  194. HCURSOR m_hCursorMove;
  195. HCURSOR m_hCursorCopy;
  196. CFont m_Font;
  197. CFont m_FontSelected;
  198. int m_nItemSelected;
  199. int m_nItemNdxOffset;
  200. int m_nItemDragDest; 
  201. int m_nButtonIDDown; 
  202. COLORREF m_rgbGlyph[4];
  203. CBitmap m_bmpGlyphsMono;
  204. HBITMAP m_hBmpBkLeftSpin;
  205. HBITMAP m_hBmpBkRightSpin;
  206. BOOL m_fIsLeftImageHorLayout;
  207. BOOL m_fIsRightImageHorLayout;
  208. MY_MARGINS m_mrgnLeft;
  209. MY_MARGINS m_mrgnRight;
  210. CToolTipCtrl m_ctrlToolTip;
  211. CEdit m_ctrlEdit;
  212. CArray <CCustomTabCtrlItem*,CCustomTabCtrlItem*> m_aItems;
  213. };