CustomTabCtrl.h
上传用户:huashan618
上传日期:2013-03-26
资源大小:261k
文件大小:8k
源码类别:

浏览器

开发平台:

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. #define TAB_SHAPE1 0 //  Invisible
  13. #define TAB_SHAPE2 1 //  __
  14. // | /
  15. // |/
  16. #define TAB_SHAPE3 2 // |
  17. // |/
  18. #define TAB_SHAPE4 3 // ____________
  19. //           /
  20. //   ________/
  21. #define TAB_SHAPE5 4 // ___________
  22. //           
  23. //   ________/
  24. #define RECALC_PREV_PRESSED 0
  25. #define RECALC_NEXT_PRESSED 1
  26. #define RECALC_ITEM_SELECTED 2
  27. #define RECALC_RESIZED 3
  28. #define RECALC_FIRST_PRESSED 4
  29. #define RECALC_LAST_PRESSED 5
  30. //#define RECALC_EDIT_RESIZED 6
  31. #define MAX_LABEL_TEXT 30
  32. #define DEF_SWITCH_HEIGHT           28
  33. #define DEF_STOWND_LENGTH           2
  34. //定义窗口的类型,以执行相应的操作
  35. #define WND_TYPE_CWND               0   //CWnd对象建立的窗口
  36. #define WND_TYPE_HTMLVIEW           1   //CHtmlView创建的窗口
  37. #define WND_TYPE_GENVIEW            2   //普通的视类窗口
  38. typedef struct _CTC_NMHDR 
  39. {
  40.     NMHDR hdr;
  41. int nItem;
  42. TCHAR pszText[MAX_LABEL_TEXT];
  43. CWnd* lParam;//LPARAM
  44. //CWnd*  childwnd;
  45. RECT rItem;
  46. POINT ptHitTest;
  47. BOOL fSelected;
  48. BOOL fHighlighted;
  49. } CTC_NMHDR;
  50. class CCustomTabCtrlItem
  51. {
  52. friend class CCustomTabCtrl;
  53. private:
  54. CCustomTabCtrlItem(CString sText,/*LPARAM*/CWnd* lParam);
  55. void ComputeRgn();
  56. void Draw(CDC& dc, CFont& font);
  57. BOOL HitTest(CPoint pt) { return (m_bShape && m_rgn.PtInRegion(pt)) ? TRUE : FALSE; }
  58. void GetRegionPoints(const CRect& rc, CPoint* pts) const;
  59. void GetDrawPoints(const CRect& rc, CPoint* pts) const;
  60. void operator=(const CCustomTabCtrlItem &other);
  61. private:
  62. CString m_sText;
  63. BOOL                        m_wType;//窗口类型
  64. CWnd*                     m_lParam;/*LPARAM*/  
  65. CRect m_rect;
  66. CRect m_rectText;
  67. CRgn m_rgn;
  68. BYTE m_bShape;
  69. BOOL m_fSelected;
  70. BOOL m_fHighlighted;
  71. BOOL m_fHighlightChanged;
  72. BOOL                        m_OpenURL;
  73. };
  74. // CCustomTabCtrl
  75. // styles
  76. #define CTCS_FIXEDWIDTH 1 // Makes all tabs the same width. 
  77. #define CTCS_FOURBUTTONS 2 // Four buttons (First, Prev, Next, Last) 
  78. #define CTCS_AUTOHIDEBUTTONS 4 // Auto hide buttons
  79. #define CTCS_TOOLTIPS 8 // Tooltips
  80. #define CTCS_MULTIHIGHLIGHT 16 // Multi highlighted items
  81. #define CTCS_EDITLABELS 32 // Allows item text to be edited in place
  82. #define CTCS_DRAGMOVE 64 // Allows move items
  83. #define CTCS_DRAGCOPY 128 // Allows copy items
  84. // hit test
  85. #define CTCHT_ONFIRSTBUTTON -1
  86. #define CTCHT_ONPREVBUTTON -2
  87. #define CTCHT_ONNEXTBUTTON -3
  88. #define CTCHT_ONLASTBUTTON -4
  89. #define CTCHT_NOWHERE -5
  90. // notification messages
  91. #define CTCN_CLICK 1
  92. #define CTCN_RCLICK 2
  93. #define CTCN_SELCHANGE 3
  94. #define CTCN_HIGHLIGHTCHANGE 4
  95. #define CTCN_ITEMMOVE 5
  96. #define CTCN_ITEMCOPY 6
  97. #define CTCN_LABELUPDATE 7
  98. #define CTCN_OUTOFMEMORY 8
  99. #define CTCID_FIRSTBUTTON -1
  100. #define CTCID_PREVBUTTON -2
  101. #define CTCID_NEXTBUTTON -3
  102. #define CTCID_LASTBUTTON -4
  103. #define CTCID_NOBUTTON -5
  104. #define CTCID_EDITCTRL 1
  105. #define REPEAT_TIMEOUT 250
  106. // error codes
  107. #define CTCERR_NOERROR 0
  108. #define CTCERR_OUTOFMEMORY -1
  109. #define CTCERR_INDEXOUTOFRANGE -2
  110. #define CTCERR_NOEDITLABELSTYLE -3
  111. #define CTCERR_NOMULTIHIGHLIGHTSTYLE -4
  112. #define CTCERR_ITEMNOTSELECTED -5
  113. #define CTCERR_ALREADYINEDITMODE -6
  114. #define CTCERR_TEXTTOOLONG -7
  115. #define CTCERR_NOTOOLTIPSSTYLE -8
  116. #define CTCERR_CREATETOOLTIPFAILED -9
  117. // button states
  118. #define BNST_INVISIBLE 0
  119. #define BNST_NORMAL DNHZS_NORMAL
  120. #define BNST_HOT DNHZS_HOT
  121. #define BNST_PRESSED DNHZS_PRESSED
  122. #define CustomTabCtrl_CLASSNAME    _T("CCustomTabCtrl")  // Window class name
  123. class CCustomTabCtrl : public CWnd
  124. {
  125. public:
  126. // Construction
  127.     CWnd*                      m_oldwnd;
  128. CCustomTabCtrl();
  129. virtual ~CCustomTabCtrl();
  130. BOOL Create(UINT dwStyle, const CRect & rect, CWnd * pParentWnd, UINT nID);
  131. // Attributes
  132. int GetItemCount() {return (int)m_aItems.GetSize();}
  133. int GetCurSel() { return m_nItemSelected; }
  134. int SetCurSel(int nItem);
  135. int IsItemHighlighted(int nItem);
  136. int HighlightItem(int nItem, BOOL fHighlight);
  137. int GetItemText(int nItem, CString& sText);
  138. int SetItemText(int nItem, CString sText);
  139. int GetItemRect(int nItem, CRect& rect) const;
  140. int SetItemTooltipText(int nItem, CString sText);
  141. void SetDragCursors(HCURSOR hCursorMove, HCURSOR hCursorCopy);
  142. BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags);
  143. void SetControlFont(const LOGFONT& lf, BOOL fRedraw=FALSE);
  144. static const LOGFONT& GetDefaultFont() {return lf_default;}
  145.     
  146. // Operations
  147.  // int InsertItem(int nItem, CString sText, LPARAM lParam=0);
  148. int InsertItem(int nItem, CString sText, CWnd* childwnd=NULL);
  149. CWnd*                       InsertItem(int nItem,CString sText,CRuntimeClass *pViewClass);
  150. int DeleteItem(int nItem);
  151. void DeleteAllItems();
  152. int MoveItem(int nItemSrc, int nItemDst);
  153. int CopyItem(int nItemSrc, int nItemDst);
  154. int HitTest(CPoint pt);
  155.     void                        ResetWindowSize(CRect& rect);
  156. void                        ResetSwitchWidth(int width);
  157. // Overrides
  158. // ClassWizard generated virtual function overrides
  159. //{{AFX_VIRTUAL(CCustomTabCtrl)
  160. protected:
  161. virtual void PreSubclassWindow();
  162. virtual BOOL PreTranslateMessage(MSG* pMsg);
  163. //}}AFX_VIRTUAL
  164. protected:
  165. //{{AFX_MSG(CCustomTabCtrl)
  166. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  167. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  168. //afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  169. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  170. afx_msg LONG OnMouseLeave(WPARAM wParam, LPARAM lParam);
  171. afx_msg LONG OnThemeChanged(WPARAM wParam, LPARAM lParam);
  172. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  173. afx_msg void OnPaint();
  174. afx_msg void OnSize(UINT nType, int cx, int cy);
  175. //afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  176. afx_msg void OnTimer(UINT nIDEvent);
  177. //afx_msg void OnUpdateEdit();
  178. //}}AFX_MSG
  179. DECLARE_MESSAGE_MAP()
  180. private:
  181. void RecalcLayout(int nRecalcType,int nItem);
  182. //void RecalcEditResized(int nOffset, int nItem);
  183. void RecalcOffset(int nOffset);
  184. int RecalcRectangles();
  185. BOOL RegisterWindowClass();
  186. int ProcessLButtonDown(int nHitTest, UINT nFlags, CPoint point);
  187. int MoveItem(int nItemSrc, int nItemDst, BOOL fMouseSel);
  188. int CopyItem(int nItemSrc, int nItemDst, BOOL fMouseSel);
  189. int SetCurSel(int nItem, BOOL fMouseSel, BOOL fCtrlPressed);
  190. int HighlightItem(int nItem, BOOL fMouseSel, BOOL fCtrlPressed);
  191. void DrawGlyph(CDC& dc, CPoint& pt, int nImageNdx, int nColorNdx);
  192. void DrawBkLeftSpin(CDC& dc, CRect& r, int nImageNdx);
  193. void DrawBkRightSpin(CDC& dc, CRect& r, int nImageNdx);
  194. BOOL NotifyParent(UINT code, int nItem, CPoint pt);
  195. //int EditLabel(int nItem, BOOL fMouseSel);
  196. private:
  197. //----------------------------
  198. CRect                      m_rClient;  
  199. int                        m_hSwitch;
  200. //BOOL                       m_orgial;
  201. //-----------------------------
  202. static LOGFONT lf_default;
  203. static BYTE m_bBitsGlyphs[];
  204. HCURSOR m_hCursorMove;
  205. HCURSOR m_hCursorCopy;
  206. CFont m_Font;
  207. CFont m_FontSelected;
  208. int m_nItemSelected;
  209. int m_nItemNdxOffset;
  210. int m_nItemDragDest;
  211. int m_nPrevState;
  212. int m_nNextState;
  213. int m_nFirstState;
  214. int m_nLastState;
  215. int m_nButtonIDDown;
  216. DWORD m_dwLastRepeatTime;
  217. COLORREF m_rgbGlyph[4];
  218. CBitmap m_bmpGlyphsMono;
  219. HBITMAP m_hBmpBkLeftSpin;
  220. BOOL m_fIsLeftImageHorLayout;
  221. MY_MARGINS m_mrgnLeft;
  222. MY_MARGINS m_mrgnRight;
  223. HBITMAP m_hBmpBkRightSpin;
  224. BOOL m_fIsRightImageHorLayout;
  225. CToolTipCtrl m_ctrlToolTip;
  226. //CEdit m_ctrlEdit;
  227. CArray <CCustomTabCtrlItem*,CCustomTabCtrlItem*> m_aItems;
  228. // 切换显示的窗口
  229. void SwitchWindows(CWnd* curwnd=NULL);
  230. public:
  231. afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  232. };