ToolBarEx.h
上传用户:diziting
上传日期:2007-01-02
资源大小:56k
文件大小:12k
源码类别:

工具条

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Copyright (C) 1997,'98 by Joerg Koenig
  3. // All rights reserved
  4. //
  5. // Distribute freely, except: don't remove my name from the source or
  6. // documentation (don't take credit for my work), mark your changes (don't
  7. // get me blamed for your possible bugs), don't alter or remove this
  8. // notice.
  9. // No warrantee of any kind, express or implied, is included with this
  10. // software; use at your own risk, responsibility for damages (if any) to
  11. // anyone resulting from the use of this software rests entirely with the
  12. // user.
  13. //
  14. // Send bug reports, bug fixes, enhancements, requests, flames, etc., and
  15. // I'll try to keep a version up to date.  I can be reached as follows:
  16. //    J.Koenig@adg.de                 (company site)
  17. //    Joerg.Koenig@rhein-neckar.de    (private site)
  18. /////////////////////////////////////////////////////////////////////////////
  19. // last revised: $Date: 10.05.98 17:45 $ $Revision: 2 $
  20. #if !defined(AFX_TOOLBAREX_H__1E0F37F5_4020_11D1_9FB1_444553540000__INCLUDED_)
  21. #define AFX_TOOLBAREX_H__1E0F37F5_4020_11D1_9FB1_444553540000__INCLUDED_
  22. #if _MSC_VER >= 1000
  23. #pragma once
  24. #endif // _MSC_VER >= 1000
  25. // ToolBarEx.h : header file
  26. //
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CToolBarEx window
  29. class CToolBarEx : public CToolBar
  30. {
  31. friend class CToolBarMgr;
  32. friend class CToolDockBar;
  33. DECLARE_DYNAMIC(CToolBarEx)
  34. // data members
  35. protected:
  36. BOOL m_bFlatLook;
  37. CSize m_sizeOffset; // real starting point of the image
  38. COLORREF m_clrBtnFace;
  39. COLORREF m_clrBtnHilight;
  40. COLORREF m_clrBtnShadow;
  41. COLORREF m_clrBtnLight;
  42. int m_nLastBtn; // index of last formed button
  43. UINT m_uTimerEvent;
  44. CUIntArray m_Styles;
  45. HWND m_hwndParent; // "real" parent (even in floating mode)
  46. BOOL m_bDeleteImgList; // remember the way we've built the image list
  47. CFont m_GuiFont;
  48. CObList * m_pControls; // list of custom controls (if any)
  49. BOOL m_bReal3DBorder; // TRUE, if you're using FrameEnableDocking() instead
  50. // of CFrameWnd::EnableDocking(). That enables you to
  51. // draw a "real" 3D frame around the toolbar
  52. // ALT-drag implementation:
  53. static HCURSOR m_hOrigCursor;
  54. static HCURSOR m_hDragCursor;
  55. static HCURSOR m_hNoDragCursor;
  56. static BOOL m_bDragging;
  57. static BOOL m_bDragCursor;
  58. static int m_nDragButton;
  59. static CToolBarEx * m_pDropBar;
  60. static CPoint m_ptDrop;
  61. BOOL m_bDragChild;
  62. // Construction
  63. public:
  64. CToolBarEx();
  65. // Attributes
  66. public:
  67. void SetFlatLook( BOOL bFlat = TRUE );
  68. BOOL IsFlatLook() const {
  69. return m_bFlatLook;
  70. }
  71. // This function I've missed in CToolBar for more than one time ...
  72. void GetSizes( CSize & szBtn, CSize & szImg ) const {
  73. szBtn = m_sizeButton;
  74. szImg = m_sizeImage;
  75. }
  76. // Get the window to which the toolbar initially was docked. This
  77. // is not necessarily the window returned by CWnd::GetParent() or
  78. // CControlBar::GetDockingFrame(). Both these functions don't
  79. // return the expected window, if the toolbar is floating ...
  80. CWnd * GetParentFrame() const {
  81. return ::IsWindow(m_hwndParent) ? CWnd::FromHandle(m_hwndParent) : 0;
  82. }
  83. // enhancements start here:
  84. // determine whether this toolbar has text-buttons
  85. BOOL HasButtonText() const {
  86. return m_pStringMap != 0 && !m_pStringMap->IsEmpty();
  87. }
  88. // invalidate the button with the given index
  89. void InvalidateButton(int nIndex);
  90. // Check whether the button with index <idx> is a "real" separator.
  91. // Thus it is *not* a control.
  92. BOOL IsSeparator(int idx) const;
  93. // Check whether this button is a control in real life
  94. BOOL IsControl(int idx) const;
  95. // Get the control that is associated with the given index
  96. // The CWnd * returned may be temporary (if you don't use
  97. // MFC to add a control to the toolbar)
  98. CWnd * GetControl(int idx, BOOL IdxIsID = FALSE) const;
  99. // Retrieve the bitmap associated with the button with ID <ID>.
  100. // The background of the bitmap is the current setting for
  101. // COLOR_BTNFACE.
  102. // Don't forget to destroy the bitmap, if it is not longer needed!
  103. HBITMAP GetBitmap(int ID);
  104. // Replace the button with ID <id> with a custom control
  105. // of type <pClass>. The custom control gets the ID <id>.
  106. // <rc> gives width & height of the control.
  107. // The stylebits WS_CHILD and WS_VISIBLE will be added automatically.
  108. // to <dwStyle>.
  109. // The control shall support the DECLARE_DYNCREATE! (except
  110. // CComboBox and CEdit which are handled separatly)
  111. // You must not "delete" the return-value !
  112. CWnd * CtrlReplace(
  113. CRuntimeClass * pClass,
  114. CRect & rc,
  115. UINT id,
  116. DWORD dwStyle = 0
  117. );
  118. // Insert a custom control before the button with index <before>.
  119. // if <before> == -1, then the control is appended behind the last
  120. // button.
  121. // For more information see CtrlReplace() above.
  122. CWnd * CtrlInsert(
  123. CRuntimeClass * pClass,
  124. CRect & rc,
  125. UINT id,
  126. int before = 0,
  127. DWORD dwStyle = 0
  128. );
  129. // call "RepositionControls()" if you have added one or more controls
  130. // and want to add more buttons/controls.
  131. // This function will automatically be called for controls when calling
  132. // CtrlReplace() and CtrlInsert().
  133. void RepositionControls();
  134. // Recalculate the size of the toolbar and recalculate the
  135. // layout of its parent.
  136. void RecalcLayout();
  137. // Operations
  138. public:
  139. // Overrides
  140. // ClassWizard generated virtual function overrides
  141. //{{AFX_VIRTUAL(CToolBarEx)
  142. //}}AFX_VIRTUAL
  143. protected:
  144. virtual void OnUpdateCmdUI( CFrameWnd* pTarget, BOOL bDisableIfNoHndler );
  145. virtual BOOL PreTranslateMessage(MSG * pMsg);
  146. // Implementation
  147. public:
  148. virtual ~CToolBarEx();
  149. // Generated message map functions
  150. protected:
  151. //{{AFX_MSG(CToolBarEx)
  152. afx_msg void OnPaint();
  153. afx_msg void OnSysColorChange();
  154. afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
  155. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  156. afx_msg void OnNcPaint();
  157. afx_msg void OnTimer(UINT nIDEvent);
  158. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  159. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  160. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  161. afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
  162. afx_msg void OnCaptureChanged(CWnd *pWnd);
  163. afx_msg void OnParentNotify(UINT message, LPARAM lParam);
  164. afx_msg void OnKillFocus(CWnd* pNewWnd);
  165. //}}AFX_MSG
  166. afx_msg LRESULT OnSetButtonSize(WPARAM, LPARAM);
  167. afx_msg LRESULT OnSetBitmapSize(WPARAM, LPARAM);
  168. afx_msg LRESULT OnAddBitmap(WPARAM, LPARAM);
  169. afx_msg LRESULT OnDeleteButton(WPARAM, LPARAM);
  170. #ifdef _MEMDC_H_
  171. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  172. #endif
  173. DECLARE_MESSAGE_MAP()
  174. protected:
  175. // Recalculate the starting point of the button's image.
  176. void CalculateOffset() {
  177. if( HasButtonText() ) {
  178. // there are strings assigned to at least one button
  179. // center the image horizontal
  180. m_sizeOffset.cx = (m_sizeButton.cx-m_sizeImage.cx)/2;
  181. m_sizeOffset.cy = m_cyTopBorder;
  182. } else {
  183. // no button has text assigned: center the image on the button
  184. m_sizeOffset.cx = (m_sizeButton.cx-m_sizeImage.cx)/2;
  185. m_sizeOffset.cy = (m_sizeButton.cy-m_sizeImage.cy)/2;
  186. }
  187. }
  188. // some special drawing functions:
  189. virtual void DrawDisabledButton( CDC &, const CRect & ) const;
  190. virtual void DrawSeparator( CDC &, CRect & ) const;
  191. virtual void DrawGripper( CDC & ) const;
  192. virtual void Draw3DBorders( CDC *, CRect &);
  193. HIMAGELIST GetImageList();
  194. // Create the user control. This is a helper function for
  195. // CtrlReplace() and CtrlInsert() above.
  196. CWnd * CreateControl(
  197. CRuntimeClass * pClass,
  198. CRect & rc,
  199. UINT ID,
  200. DWORD dwStyle
  201. );
  202. // Retrieve the bitmap with index <Index> and resize it to fit to <sizeBitmap>.
  203. HBITMAP GetBitmap(int Index, const CSize & sizeBitmap);
  204. // Alt-drag implementation
  205. BOOL BeginDrag();
  206. void DragMove();
  207. void EndDrag(BOOL bDoMove = TRUE);
  208. BOOL IsValidDropTarget(const CWnd *) const;
  209. void CheckMoveControl( CToolBarEx * pToolBar, const TBBUTTON & tbButton );
  210. void RemoveTrailingSeparators();
  211. int FindDropButton(const CPoint & point);
  212. void GetMarkerRect(int nButton, CRect & rc);
  213. void ShowMarker(const CRect & rcMarker, CBitmap & bmpArea);
  214. void RestoreMarker( const CRect & rcArea, CBitmap & bmpArea );
  215. void SetMarker(CToolBarEx *, const CPoint &);
  216. BOOL QueryDeleteInsert(TBBUTTON & tbButton, BOOL bQueryDelete, int BtnIndex);
  217. BOOL DoQueryDelete(int nButton);
  218. BOOL DoQueryInsert(TBBUTTON & tbButton, int nIndex) {
  219. return QueryDeleteInsert(tbButton, FALSE, nIndex);
  220. }
  221. };
  222. // This is a replacement function for CFrameWnd::EnableDocking(). This function
  223. // enables the "real" 3D look of the bar itself (as in Office or DevStudio).
  224. // Change the call to "EnableDocking()" in your CMainFrames's OnCreate() to
  225. // "FrameEnableDocking()".
  226. void FrameEnableDocking(CFrameWnd * Frame, DWORD DockStyle);
  227. /////////////////////////////////////////////////////////////////////////////
  228. //{{AFX_INSERT_LOCATION}}
  229. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  230. // There is a bug in the patch of VC++ 4.2b: The commctrl.h, which already
  231. // contains NM_CUSTOMDRAW is replaced with one version that doesn't.
  232. // Thanks to Todd C. Wilson for the code below.
  233. #if _MFC_VER >= 0x0420  &&  ! defined(NM_CUSTOMDRAW)
  234. #define NM_CUSTOMDRAW           (NM_FIRST-12)
  235. #define NM_HOVER                (NM_FIRST-13)
  236. #define TB_SETIMAGELIST         (WM_USER + 48)
  237. #define TB_GETIMAGELIST         (WM_USER + 49)
  238. #define TB_LOADIMAGES           (WM_USER + 50)
  239. #define TB_GETRECT              (WM_USER + 51) // wParam is the Cmd instead of index
  240. #define TB_SETHOTIMAGELIST      (WM_USER + 52)
  241. #define TB_GETHOTIMAGELIST      (WM_USER + 53)
  242. #define TB_SETDISABLEDIMAGELIST (WM_USER + 54)
  243. #define TB_GETDISABLEDIMAGELIST (WM_USER + 55)
  244. #define TB_SETSTYLE             (WM_USER + 56)
  245. #define TB_GETSTYLE             (WM_USER + 57)
  246. #define TB_GETBUTTONSIZE        (WM_USER + 58)
  247. //==================== CUSTOM DRAW ==========================================
  248. // custom draw return flags
  249. // values under 0x00010000 are reserved for global custom draw values.
  250. // above that are for specific controls
  251. #define CDRF_DODEFAULT          0x00000000
  252. #define CDRF_NEWFONT            0x00000002
  253. #define CDRF_SKIPDEFAULT        0x00000004
  254. #define CDRF_NOTIFYPOSTPAINT    0x00000010
  255. #define CDRF_NOTIFYITEMDRAW     0x00000020
  256. // drawstage flags
  257. // values under 0x00010000 are reserved for global custom draw values.
  258. // above that are for specific controls
  259. #define CDDS_PREPAINT           0x000000001
  260. #define CDDS_POSTPAINT          0x000000002
  261. // the 0x000010000 bit means it's individual item specific
  262. #define CDDS_ITEM               0x000010000
  263. #define CDDS_ITEMPREPAINT       (CDDS_ITEM | CDDS_PREPAINT)
  264. #define CDDS_ITEMPOSTPAINT      (CDDS_ITEM | CDDS_POSTPAINT)
  265. // itemState flags
  266. #define CDIS_SELECTED    0x0001
  267. #define CDIS_GRAYED      0x0002
  268. #define CDIS_DISABLED    0x0004
  269. #define CDIS_CHECKED     0x0008
  270. #define CDIS_FOCUS       0x0010
  271. #define CDIS_DEFAULT     0x0020
  272. typedef struct tagNMCUSTOMDRAWINFO
  273. {
  274.     NMHDR hdr;
  275.     DWORD dwDrawStage;
  276.     HDC hdc;
  277.     RECT rc;
  278.     DWORD dwItemSpec;  // this is control specific, but it's how to specify an item.  valid only with CDDS_ITEM bit set
  279.     UINT  uItemState;
  280.     LPARAM lItemlParam;
  281. } NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW;
  282. // for tooltips
  283. typedef struct tagNMTTCUSTOMDRAW
  284. {
  285.     NMCUSTOMDRAW nmcd;
  286.     UINT uDrawFlags;
  287. } NMTTCUSTOMDRAW, FAR * LPNMTTCUSTOMDRAW;
  288. #endif  // _MFC_VER >= 4.2 && ! defined(NM_CUSTOMDRAW)
  289. #endif // !defined(AFX_TOOLBAREX_H__1E0F37F5_4020_11D1_9FB1_444553540000__INCLUDED_)