XTHeaderCtrl.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:20k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTHeaderCtrl.h interface for the CXTFlatHeaderCtrl class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTHEADERCTRL_H__)
  22. #define __XTHEADERCTRL_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER >= 1000
  25. #pragma once
  26. #endif // _MSC_VER >= 1000
  27. class CXTThemeManager;
  28. class CXTPImageManager;
  29. #include "XTHeaderCtrlTheme.h"
  30. //========================================================================
  31. // Summary:
  32. //     CXTHeaderCtrl is a CHeaderCtrl derived class. It is used to create
  33. //     a CXTHeaderCtrl window similar to CHeaderCtrl, but with additional functionality.
  34. // Remarks:
  35. //     A "header control" is a window that is usually positioned above columns of text
  36. //     or numbers. It contains a title for each column, and it can be divided
  37. //     into parts. The user can drag the dividers that separate the parts to
  38. //     set the width of each column.
  39. //
  40. //     Use a header control, represented by class CXTHeaderCtrl, to display
  41. //     column headers for a columnar list. For example, a header control would
  42. //     be useful for implementing column controls in a spreadsheet.
  43. //
  44. //     The header control is usually divided into parts, called "header items",
  45. //     each bearing a title for the associated column of text or numbers. Depending
  46. //     on the styles you set, you can provide a number of direct ways for users
  47. //     to manipulate the header items.
  48. //========================================================================
  49. class _XTP_EXT_CLASS CXTHeaderCtrl : public CXTHeaderCtrlHelper, public CXTThemeManagerStyleHostBase
  50. {
  51. DECLARE_DYNAMIC(CXTHeaderCtrl)
  52. DECLARE_THEME_HOST(CXTHeaderCtrl)
  53. DECLARE_THEME_REFRESH(CXTHeaderCtrl)
  54. public:
  55. //--------------------------------------------------------------------
  56. // Summary:
  57. //     Constructs a CXTHeaderCtrl object
  58. //--------------------------------------------------------------------
  59. CXTHeaderCtrl();
  60. //--------------------------------------------------------------------
  61. // Summary:
  62. //     Destroys a CXTHeaderCtrl object, handles cleanup and deallocation
  63. //--------------------------------------------------------------------
  64. virtual ~CXTHeaderCtrl();
  65. public:
  66. //--------------------------------------------------------------------
  67. // Summary:
  68. //     Call this member function to enable auto-sizing for the header control.
  69. //     This will cause the columns in the list control to be sized to fit
  70. //     in the available space when the list control is resized.
  71. // Parameters:
  72. //     bEnable - true to enable an auto-sizing header control.
  73. //--------------------------------------------------------------------
  74. void EnableAutoSize(bool bEnable = true);
  75. //--------------------------------------------------------------------
  76. // Summary:
  77. //     Call this member function to freeze a column in the header control.
  78. //     Freezing a column will disable sizing for the column.
  79. // Parameters:
  80. //     iCol - Index of the column to freeze.
  81. //--------------------------------------------------------------------
  82. void FreezeColumn(int iCol);
  83. //--------------------------------------------------------------------
  84. // Summary:
  85. //     Call this member function to thaw a column in the header control.
  86. //     Thawing a column will enable sizing for the column if it was previously
  87. //     frozen.
  88. // Parameters:
  89. //     iCol - Index of the column to thaw.
  90. //--------------------------------------------------------------------
  91. void ThawColumn(int iCol);
  92. //--------------------------------------------------------------------
  93. // Summary:
  94. //     Call this member function to thaw all column in the header control.
  95. //     This will will enable sizing for any column that was previously
  96. //     frozen.
  97. //--------------------------------------------------------------------
  98. void ThawAllColumns();
  99. //--------------------------------------------------------------------
  100. // Summary:
  101. //     Call this member function to determine if the specified column is
  102. //     frozen.
  103. // Parameters:
  104. //     iCol - Index of the column to check.
  105. // Returns:
  106. //     true if the column is frozen, otherwise returns false.
  107. //--------------------------------------------------------------------
  108. bool IsColFrozen(int iCol);
  109. //--------------------------------------------------------------------
  110. // Summary:
  111. //     Call this member to set the minimum size for auto-sizing columns.
  112. //     The minimum size represents the smallest size that all columns can
  113. //     be sized to.
  114. // Parameters:
  115. //     iMinSize - Minimum column size.
  116. //--------------------------------------------------------------------
  117. void SetMinSize(int iMinSize);
  118. //--------------------------------------------------------------------
  119. // Summary:
  120. //     This member function will set the sort image for the specified column.
  121. // Parameters:
  122. //     iSortCol - Zero-based index of the column to set the sort image for.
  123. //     bSortAsc - TRUE if ascending, otherwise FALSE.
  124. // Returns:
  125. //     A zero-based index of the previously sorted column.
  126. //--------------------------------------------------------------------
  127. int SetSortImage(int iSortCol, BOOL bSortAsc);
  128. //--------------------------------------------------------------------
  129. // Summary:
  130. //     Call this member function to return the index to the currently sorted
  131. //     column.
  132. // Parameters:
  133. //     pbSortAsc - Set to TRUE if ascending, otherwise FALSE.
  134. // Returns:
  135. //     The index of the currently sorted column.
  136. //--------------------------------------------------------------------
  137. int GetSortedCol(BOOL* pbSortAsc = NULL);
  138. //--------------------------------------------------------------------
  139. // Summary:
  140. //     Call this member function to set the bitmap image for the specified
  141. //     header item.
  142. // Parameters:
  143. //     iCol      - Zero-based index of the column to set the sort image for.
  144. //     uBitmapID - Resource ID of the bitmap to use.
  145. //     bRemove   - TRUE to remove a bitmap, FALSE if adding a bitmap.
  146. //     dwRemove  - Indicates the header format style to remove, see HD_ITEM structure.
  147. //     crMask    - Color used to generate the mask. Each pixel of
  148. //                 this color in the given bitmap is changed to black
  149. //                 and the corresponding bit in the mask is set to one.
  150. // Example:
  151. //     The following example demonstrates the use of SetBitmap.
  152. // <code>
  153. // // add bitmap images.
  154. // m_header.SetBitmap(0, IDB_COLUMN_0, FALSE, RGB(0, 255, 0));
  155. // m_header.SetBitmap(1, IDB_COLUMN_1, FALSE, RGB(0, 255, 0));
  156. // m_header.SetBitmap(2, IDB_COLUMN_2, FALSE, RGB(0, 255, 0));
  157. // </code>
  158. //--------------------------------------------------------------------
  159. void SetBitmap(int iCol, UINT uBitmapID, DWORD dwRemove = NULL);
  160. void SetBitmap(int iCol, UINT uBitmapID, BOOL bRemove, COLORREF crMask); //<combine CXTHeaderCtrl::SetBitmap@int@UINT@DWORD>
  161. //--------------------------------------------------------------------
  162. // Summary:
  163. //     Call this member function to determine if the specified header
  164. //     item is pressed (selected).
  165. // Parameters:
  166. //     iItem - Index of the header item to check.
  167. // Returns:
  168. //     TRUE if the specified header item is pressed (selected).
  169. //--------------------------------------------------------------------
  170. virtual BOOL ItemPressed(int iItem);
  171. // ------------------------------------------------------------------
  172. // Summary:
  173. //     This member function is called whenever the theme has changed.
  174. // Remarks:
  175. //     Override this member function to add additional functionality
  176. //     whenever the control theme changes.
  177. // ------------------------------------------------------------------
  178. virtual void OnThemeChanged();
  179. //--------------------------------------------------------------------
  180. // Summary:
  181. //     This member function is called to check if the header control
  182. //     is using a theme.
  183. // Returns:
  184. //     TRUE if a theme is used, otherwise FALSE.
  185. //--------------------------------------------------------------------
  186. BOOL IsThemeValid() const;
  187. // --------------------------------------------------------------------------
  188. // Summary:
  189. //     Tests a point to determine which header item, if any, is at the
  190. //     specified point.
  191. // Parameters:
  192. //     pt -      POINT structure that contains the point to be hit test, in
  193. //               client coordinates.
  194. // pFlags -  Variable that receives information about the results of a hit
  195. //               test. This member can be one or more of the values listed in
  196. //               the Remarks section.
  197. // Remarks:
  198. //     pFlags can be one or more of the following values:
  199. //     * <b>HHT_ABOVE</b> The point is above the header control's
  200. //           bounding rectangle.
  201. //     * <b>HHT_BELOW</b> The point is below the header control's
  202. //           bounding rectangle.
  203. //     * <b>HHT_NOWHERE</b> The point is inside the header control's
  204. //           bounding rectangle but is not over a header item.
  205. //     * <b>HHT_ONDIVIDER</b> The point is on the divider between two
  206. //           header items.
  207. //     * <b>HHT_ONDIVOPEN</b> The point is on the divider of an item
  208. //           that has a width of zero. Dragging the divider reveals the item
  209. //           instead of resizing the item to the left of the divider.
  210. //     * <b>HHT_ONHEADER</b> The point is inside the header control's
  211. //           bounding rectangle.
  212. //     * <b>HHT_ONFILTER</b> Version 5.80 The point is over the
  213. //           filter area.
  214. //     * <b>HHT_ONFILTERBUTTON</b> Version 5.80 The point is on the
  215. //           filter button.
  216. //     * <b>HHT_TOLEFT</b> The point is to the left of the header
  217. //           control's bounding rectangle.
  218. //     * <b>HHT_TORIGHT</b> The point is to the right of the header
  219. //           control's bounding rectangle.
  220. // Returns:
  221. //     If the hit test is successful, contains the index of the item at
  222. //     the hit test point, if any, or - 1 otherwise.
  223. // --------------------------------------------------------------------------
  224. int HitTest(CPoint pt, UINT* pFlags = NULL) const;
  225. //--------------------------------------------------------------------
  226. // Summary:
  227. //     Called by the header control to recalculate the size and layout
  228. //     for the header control and header items.
  229. // Returns:
  230. //     TRUE if successful, otherwise FALSE.
  231. //--------------------------------------------------------------------
  232. BOOL RecalcLayout();
  233. //--------------------------------------------------------------------
  234. // Summary:
  235. //     This member function must be called after creation to initialize
  236. //     the font that the header will use.
  237. // Parameters:
  238. //     bBoldFont - TRUE if the header's font should be bold.
  239. //--------------------------------------------------------------------
  240. virtual void InitializeHeader(BOOL bBoldFont);
  241. //--------------------------------------------------------------------
  242. // Summary:
  243. //     This member function is called to associate a menu and toolbar
  244. //     resource with the context menu.
  245. // Parameters:
  246. //     popupMenuID - Resource ID for the popup menu used with the header.
  247. //     nPos        - Position of the submenu to be displayed.
  248. //--------------------------------------------------------------------
  249. virtual void SetMenuID(UINT popupMenuID, int nPos = 0);
  250. //--------------------------------------------------------------------
  251. // Summary:
  252. //     This member function can be used to toggle the font from bold to normal.
  253. // Parameters:
  254. //     bBoldFont - TRUE if the header's font should be bold.
  255. //--------------------------------------------------------------------
  256. virtual void SetFontBold(BOOL bBoldFont = TRUE);
  257. //--------------------------------------------------------------------
  258. // Summary:
  259. //     Call this member function to enable or disable the column sort arrow.
  260. // Parameters:
  261. //     bSortArrow - Set to TRUE to draw the column sort arrow.
  262. //--------------------------------------------------------------------
  263. virtual void ShowSortArrow(BOOL bSortArrow);
  264. //--------------------------------------------------------------------
  265. // Summary:
  266. //     Call this member function to set the text justification for the
  267. //     header control.
  268. // Parameters:
  269. //     nFlag - Text alignment, either LVCFMT_CENTER, LVCFMT_LEFT, or LVCFMT_RIGHT.
  270. // Returns:
  271. //     TRUE if successful, otherwise returns FALSE.
  272. //--------------------------------------------------------------------
  273. virtual BOOL SetAlingment(int nFlag);
  274. //--------------------------------------------------------------------
  275. // Summary:
  276. //     Call this member function to return the current sorting order.
  277. // Returns:
  278. //     TRUE if the sorting order is ascending, otherwise returns FALSE.
  279. //--------------------------------------------------------------------
  280. BOOL GetAscending() const;
  281. //--------------------------------------------------------------------
  282. // Summary:
  283. //     Call this member function to enable or disable the popup menu display whenever
  284. //     a user right clicks on the header control.
  285. // Parameters:
  286. //     bEnableMenus - TRUE to enable popup menus, and FALSE to disable.
  287. //--------------------------------------------------------------------
  288. void EnablePopupMenus(BOOL bEnableMenus);
  289. //--------------------------------------------------------------------
  290. // Summary:
  291. //     Call this member function to determine if the header control displays
  292. //     a sort arrow.
  293. // Returns:
  294. //     TRUE if the header control displays a sort arrow, otherwise returns FALSE.
  295. //--------------------------------------------------------------------
  296. BOOL HasSortArrow();
  297. //--------------------------------------------------------------------
  298. // Summary:
  299. //     Call this member function to resize all header columns equally
  300. //     to fit the available client area.
  301. //--------------------------------------------------------------------
  302. void ResizeColumnsToFit();
  303. void SetImageManager(CXTPImageManager* pImageManager);
  304. CXTPImageManager* GetImageManager() const;
  305. protected:
  306. //--------------------------------------------------------------------
  307. // Summary:
  308. //     This member function is used by the header control to determine
  309. //     the text alignment for the system locale.
  310. // Returns:
  311. //     true if the text alignment is right-to-left, and false if the text
  312. //     alignment is left-to-right.
  313. //--------------------------------------------------------------------
  314. virtual bool DetermineRTL();
  315. //--------------------------------------------------------------------
  316. // Summary:
  317. //     This member function is used by the header control to auto-size the
  318. //     columns for the list control.
  319. // Parameters:
  320. //     iNewWidth - New width to resize all columns to.
  321. //--------------------------------------------------------------------
  322. virtual void ApplyFieldWidths(int iNewWidth);
  323. //--------------------------------------------------------------------
  324. // Summary:
  325. //     This member function is used by the header control to determine
  326. //     the new width for auto-sized columns and resize accordingly.
  327. // Parameters:
  328. //     iNewWidth - New width to resize all columns to.  If iNewWidth
  329. //                 is '0', the columns are equally sized to fit the
  330. //                 available client area.
  331. //--------------------------------------------------------------------
  332. virtual void FitFieldWidths(int iNewWidth);
  333. //--------------------------------------------------------------------
  334. // Summary:
  335. //     This member function is used by the header control to determine
  336. //     the total width of all frozen columns in the header control.
  337. // Returns:
  338. //     The combined size in pixels of all frozen columns.
  339. //--------------------------------------------------------------------
  340. virtual int GetFrozenColWidth();
  341. //--------------------------------------------------------------------
  342. // Summary:
  343. //     Called to send WM_NOTIFY to tell parent's owner that the column needs
  344. //     to be sorted.
  345. // Parameters:
  346. //     iIndex - Index of the column to be sorted.
  347. //--------------------------------------------------------------------
  348. void SendNotify(int iIndex);
  349. //{{AFX_VIRTUAL(CXTHeaderCtrl)
  350. //}}AFX_VIRTUAL
  351. protected:
  352. //{{AFX_CODEJOCK_PRIVATE
  353. DECLARE_MESSAGE_MAP()
  354. //{{AFX_MSG(CXTHeaderCtrl)
  355. afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
  356. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  357. afx_msg void OnPaint();
  358. afx_msg LRESULT OnPrintClient(WPARAM wParam, LPARAM /*lParam*/);
  359. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  360. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  361. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  362. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  363. afx_msg void OnTimer(UINT_PTR nIDEvent);
  364. afx_msg LRESULT OnLayout(WPARAM wparam, LPARAM lparam);
  365. afx_msg void OnDestroy();
  366. afx_msg BOOL OnItemchanging(NMHDR* pNMHDR, LRESULT* pResult);
  367. afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  368. afx_msg void OnSortAsc();
  369. afx_msg void OnSortDsc();
  370. afx_msg void OnAlignLeft();
  371. afx_msg void OnAlignCenter();
  372. afx_msg void OnAlignRight();
  373. //}}AFX_MSG
  374. //}}AFX_CODEJOCK_PRIVATE
  375. protected:
  376. int              m_iMinSize;      // Minimum column size for an auto-size header control.
  377. int              m_nPos;          // Index of the popup menu contained in the menu.
  378. int              m_iOverIndex;    // Column mouse is currently hovering.
  379. int              m_nSortedCol;    // Last column pressed during sort.
  380. bool             m_bRTL;          // Used internally to determine if text is right-to-left or left-to-right (depends on system locale).
  381. bool             m_bAutoSize;     // true if the header control columns are auto-sizing.
  382. BOOL             m_bEnableMenus;  // TRUE to disable the popup menu display.
  383. BOOL             m_bAscending;    // Used, when column is pressed, to draw a sort arrow.
  384. BOOL             m_bLBtnDown;     // TRUE if left mouse button is pressed.
  385. BOOL             m_bPainted;      // Used during paint operations.
  386. UINT             m_popupMenuID;   // Popup menu resource ID.
  387. CPoint           m_pt;            // Point where right click took place.
  388. CList<int, int&>  m_arFrozenCols;  // List of columns that are not sizable.
  389. CXTPImageManager* m_pImageManager;
  390. friend class CXTHeaderCtrlTheme;
  391. };
  392. //////////////////////////////////////////////////////////////////////
  393. AFX_INLINE BOOL CXTHeaderCtrl::GetAscending() const {
  394. ASSERT(::IsWindow(m_hWnd)); return m_bAscending;
  395. }
  396. AFX_INLINE void CXTHeaderCtrl::EnablePopupMenus(BOOL bEnableMenus) {
  397. m_bEnableMenus = bEnableMenus;
  398. }
  399. AFX_INLINE CXTPImageManager* CXTHeaderCtrl::GetImageManager() const {
  400. return m_pImageManager;
  401. }
  402. //========================================================================
  403. // Summary:
  404. //     CXTFlatHeaderCtrl is a CHeaderCtrl derived class. It is used to create
  405. //     list box flat header controls that are similar to list box flat header
  406. //     controls seen in Visual Studio(tm) and Outlook(tm).
  407. //========================================================================
  408. class _XTP_EXT_CLASS CXTFlatHeaderCtrl : public CXTHeaderCtrl
  409. {
  410. DECLARE_DYNAMIC(CXTFlatHeaderCtrl)
  411. public:
  412. //--------------------------------------------------------------------
  413. // Summary:
  414. //     Constructs a CXTFlatHeaderCtrl object
  415. //--------------------------------------------------------------------
  416. CXTFlatHeaderCtrl();
  417. //--------------------------------------------------------------------
  418. // Summary:
  419. //     Destroys a CXTFlatHeaderCtrl object, handles cleanup and deallocation
  420. //--------------------------------------------------------------------
  421. virtual ~CXTFlatHeaderCtrl();
  422. };
  423. #endif // #if !defined(__XTHEADERCTRL_H__)