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

对话框与窗口

开发平台:

Visual C++

  1. // XTSplitterWnd.h : header file
  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(__XTSPLITTERWND_H__)
  22. #define __XTSPLITTERWND_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. class CXTSplitterWndTheme;
  28. #include "XTThemeManager.h"
  29. // --------------------------------------------------------------------
  30. // Summary:
  31. //     CXTSplitterWnd is a CSplitterWnd derived class. It
  32. //     adds the ability to hide and show splitter panes based upon its
  33. //     index.
  34. // --------------------------------------------------------------------
  35. class _XTP_EXT_CLASS CXTSplitterWnd : public CSplitterWnd, public CXTThemeManagerStyleHostBase
  36. {
  37. DECLARE_DYNAMIC(CXTSplitterWnd)
  38. DECLARE_THEME_HOST(CXTSplitterWnd)
  39. DECLARE_THEME_REFRESH(CXTSplitterWnd)
  40. public:
  41. // ---------------------------------------------
  42. // Summary:
  43. //     Constructs a CXTSplitterWnd object
  44. // ---------------------------------------------
  45. CXTSplitterWnd();
  46. // ----------------------------------------------------------------
  47. // Summary:
  48. //     Destroys a CXTSplitterWnd object, handles cleanup and
  49. //     deallocation
  50. // ----------------------------------------------------------------
  51. virtual ~CXTSplitterWnd();
  52. public:
  53. //-----------------------------------------------------------------------
  54. // Summary:
  55. //     This member function is called to show the column that was previously
  56. //     hidden.
  57. // See Also:
  58. //     HideColumn
  59. //-----------------------------------------------------------------------
  60. virtual void ShowColumn();
  61. //-----------------------------------------------------------------------
  62. // Summary:
  63. //     This member function will hide a column based upon its index.
  64. // Parameters:
  65. //     nColHide -  Index of the column to hide.
  66. // See Also:
  67. //     ShowColumn
  68. //-----------------------------------------------------------------------
  69. virtual void HideColumn(int nColHide);
  70. //-----------------------------------------------------------------------
  71. // Summary:
  72. //     This member function is called to show the row that was previously
  73. //     hidden.
  74. // See Also:
  75. //     HideRow
  76. //-----------------------------------------------------------------------
  77. virtual void ShowRow();
  78. //-----------------------------------------------------------------------
  79. // Summary:
  80. //     This member function will hide a row based upon its index.
  81. // Parameters:
  82. //     nRowHide -  Index of the row to hide.
  83. // See Also:
  84. //     ShowRow
  85. //-----------------------------------------------------------------------
  86. virtual void HideRow(int nRowHide);
  87. //-----------------------------------------------------------------------
  88. // Summary:
  89. //     This member function is called to switch, or swap, a splitter view
  90. //     with another.
  91. // Parameters:
  92. //     nRow -      Specifies a row.
  93. //     nCol -      Specifies a column.
  94. //     pNewView -  Specifies the view to switch the specified pane with.
  95. // Returns:
  96. //     TRUE if successful, otherwise returns FALSE.
  97. // See Also:
  98. //     ReplaceView
  99. //-----------------------------------------------------------------------
  100. virtual BOOL SwitchView(int nRow, int nCol, CView* pNewView);
  101. //-----------------------------------------------------------------------
  102. // Summary:
  103. //     This member function is called to replace an existing splitter view
  104. //     with another.
  105. // Parameters:
  106. //     nRow -        Specifies a row.
  107. //     nCol -        Specifies a column.
  108. //     pViewClass -  Specifies the runtime class to replace the specified pane with.
  109. //     pNewView -    Points to an already existing view.
  110. // Returns:
  111. //     A CView pointer to the view that was replaced, otherwise returns NULL.
  112. // See Also:
  113. //     SwitchView
  114. //-----------------------------------------------------------------------
  115. virtual CView* ReplaceView(int nRow, int nCol, CView* pNewView);
  116. virtual CView* ReplaceView(int nRow, int nCol, CRuntimeClass* pViewClass); //<COMBINE CXTSplitterWnd::ReplaceView@int@int@CView*>
  117. // -------------------------------------------------------------------------------
  118. // Summary:
  119. //     Call this member function to modify a splitter window's style.
  120. //     Styles to be added or removed can be combined by using the bitwise
  121. //     OR (|) operator.
  122. // Parameters:
  123. //     dwxStyle -  Specifies XT_SPLIT_ styles to be added during style
  124. //                 modification. See the Remarks section for a list of styles.
  125. // Remarks:
  126. //     The splitter window can be modified to use one or more of the
  127. //     following styles:
  128. //     * <b>XT_SPLIT_DOTTRACKER</b> The splitter window will use a
  129. //       dotted tracker rather than the splitter default.
  130. //     * <b>XT_SPLIT_NOFULLDRAG</b> Disable the "Show window contents
  131. //       while dragging" option even if it is set in Windows.
  132. //     * <b>XT_SPLIT_NOBORDER</b> The splitter window will not draw a
  133. //       border around the pane.
  134. //     * <b>XT_SPLIT_NOSIZE</b> Do not allow splitter window panes to
  135. //       be resized.
  136. // See Also:
  137. //     GetSplitterStyle
  138. // -------------------------------------------------------------------------------
  139. virtual void SetSplitterStyle(DWORD dwxStyle);
  140. //-----------------------------------------------------------------------
  141. // Summary:
  142. //     Call this method to set full drag state.
  143. // Parameters:
  144. //     bFullDrag -  TRUE to enable full drag.
  145. // Remarks:
  146. //     This member function will display the contents for child pane
  147. //     while the splitter is resized if bFullDrag is set to TRUE.
  148. // See Also:
  149. //     SetSplitterStyle
  150. //-----------------------------------------------------------------------
  151. void SetFullDrag(BOOL bFullDrag);
  152. //-----------------------------------------------------------------------
  153. // Summary:
  154. //     Call this member function to return the current style for the splitter
  155. //     window.
  156. // Returns:
  157. //     The current style of the splitter window.
  158. // See Also:
  159. //     SetSplitterStyle
  160. //-----------------------------------------------------------------------
  161. virtual DWORD GetSplitterStyle();
  162. //-----------------------------------------------------------------------
  163. // Summary:
  164. //     Call this member function to enable or disable flat splitters.
  165. // Parameters:
  166. //     bFlatSplitter -  TRUE to enable flat splitters.
  167. // See Also:
  168. //     SetSplitterStyle
  169. //-----------------------------------------------------------------------
  170. virtual void EnableFlatLook(BOOL bFlatSplitter);
  171. //-----------------------------------------------------------------------
  172. // Summary:
  173. //     Call this member function to return the index of the column that is
  174. //     currently hidden.
  175. // Returns:
  176. //     The index of the hidden column or -1 if no columns are hidden.
  177. // See Also:
  178. //     GetHiddenRowIndex
  179. //-----------------------------------------------------------------------
  180. int GetHiddenColIndex();
  181. //-----------------------------------------------------------------------
  182. // Summary:
  183. //     Call this member function to return the index of the row that is
  184. //     currently hidden.
  185. // Returns:
  186. //     The index of the hidden row; or -1, if no rows are hidden.
  187. // See Also:
  188. //     GetHiddenColIndex
  189. //-----------------------------------------------------------------------
  190. int GetHiddenRowIndex();
  191. //-----------------------------------------------------------------------
  192. // Summary:
  193. //     Sets a pane to be the active one in the frame.
  194. // Remarks:
  195. //     This member function is called by the framework to set a pane as
  196. //     active when the user changes the focus to a pane within the frame
  197. //     window. You may explicitly call SetActivePane to change the focus
  198. //     to the specified view.<p/>
  199. //
  200. //     Specify pane by providing either row and column, or by providing
  201. //     <i>pWnd</i>.
  202. // Parameters:
  203. //     row  -  If pWnd is NULL, specifies the row in the pane that will
  204. //             be active.
  205. //     col  -  If pWnd is NULL, specifies the column in the pane that
  206. //             will be active.
  207. //     pWnd -  A pointer to a CWnd object. If NULL, the pane specified
  208. //             by row and col is set active.  If not NULL, specifies the
  209. //             pane that is set active.
  210. // See Also:
  211. //     CSplitterWnd::GetActivePane, CSplitterWnd::GetPane, CFrameWnd::SetActiveView
  212. //-----------------------------------------------------------------------
  213. virtual void SetActivePane(int row, int col, CWnd* pWnd = NULL);
  214. protected:
  215. //{{AFX_CODEJOCK_PRIVATE
  216. DECLARE_MESSAGE_MAP()
  217. //{{AFX_VIRTUAL(CXTSplitterWnd)
  218. virtual void SetSplitCursor(int ht);
  219. virtual void OnInvertTracker(const CRect& rect);
  220. virtual void StartTracking(int ht);
  221. virtual void StopTracking(BOOL bAccept);
  222. virtual void DrawTracker(const CRect& rect, CBrush* pBrush);
  223. virtual void OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rectArg);
  224. //}}AFX_VIRTUAL
  225. //{{AFX_MSG(CXTSplitterWnd)
  226. afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
  227. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  228. afx_msg LRESULT OnNcHitTest(CPoint point);
  229. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  230. afx_msg LRESULT OnPrintClient(WPARAM wParam, LPARAM /*lParam*/);
  231. //}}AFX_MSG
  232. //}}AFX_CODEJOCK_PRIVATE
  233. protected:
  234. int     m_nHiddenCol;       // Index of the hidden column.
  235. int     m_nHiddenRow;       // Index of the hidden row.
  236. BOOL    m_bFullDrag;        // TRUE if full window dragging is enabled.
  237. BOOL    m_bForceFullDrag;   // TRUE to use full drag always.
  238. BOOL    m_bFlatSplit;       // TRUE if the flat splitter style is used.
  239. DWORD   m_dwxStyle;         // The style of the splitter window. See SetSplitterStyle(...).
  240. CPoint  m_point;            // Previous cursor position.
  241. BOOL    m_bClipStyles;      // Clip styles before dragging.
  242. };
  243. //////////////////////////////////////////////////////////////////////
  244. AFX_INLINE DWORD CXTSplitterWnd::GetSplitterStyle() {
  245. return m_dwxStyle;
  246. }
  247. AFX_INLINE int CXTSplitterWnd::GetHiddenColIndex() {
  248. return m_nHiddenCol;
  249. }
  250. AFX_INLINE int CXTSplitterWnd::GetHiddenRowIndex() {
  251. return m_nHiddenRow;
  252. }
  253. // ---------------------------------------------------------------------
  254. // Summary:
  255. //     CXTSplitterWndEx is a CXTSplitterWnd derived class.
  256. //     It can be used with the CXTOutBarCtrl to display a gap
  257. //     between the top of the splitter and the toolbar area.
  258. // ---------------------------------------------------------------------
  259. class _XTP_EXT_CLASS CXTSplitterWndEx : public CXTSplitterWnd
  260. {
  261. DECLARE_DYNAMIC(CXTSplitterWndEx)
  262. public:
  263. // -----------------------------------------------
  264. // Summary:
  265. //     Constructs a CXTSplitterWndEx object
  266. // -----------------------------------------------
  267. CXTSplitterWndEx();
  268. // ------------------------------------------------------------------
  269. // Summary:
  270. //     Destroys a CXTSplitterWndEx object, handles cleanup and
  271. //     deallocation
  272. // ------------------------------------------------------------------
  273. virtual ~CXTSplitterWndEx();
  274. public:
  275. // ------------------------------------------------------------------------------
  276. // Summary:
  277. //     Call this member function to show a top border for the splitter
  278. //     window, similar to Outlook. Enabled by default.
  279. // Parameters:
  280. //     bShowTopBorder -  Call this member function to show a top border for the
  281. //                       splitter window, similar to Outlook. Enabled by default.
  282. //     cyTopBorderGap -  Call this member function to show a top border for the
  283. //                       splitter window, similar to Outlook. Enabled by default.
  284. // ------------------------------------------------------------------------------
  285. virtual void ShowTopBorder(bool bShowTopBorder = true, int cyTopBorderGap = 7);
  286. protected:
  287. // -------------------------
  288. // Summary:
  289. //     Called to retrieve the client area minus the inside 3D borders.
  290. // Remarks:
  291. //     This member function is called by the splitter window to retrieve the
  292. //     size of the client area minus any 3D borders.
  293. // Parameters:
  294. //     rect -  Size of the client area minus borders.
  295. // -------------------------
  296. virtual void GetInsideRect(CRect& rect) const;
  297. public:
  298. // -----------------
  299. // Summary:
  300. //     Call to redisplay the splitter window after adjusting row or column size.
  301. // Remarks:
  302. //     Call this member function to correctly redisplay the splitter window
  303. //     after you have adjusted row and column sizes with the SetRowInfo and
  304. //     SetColumnInfo member functions. If you change row and column sizes as
  305. //     part of the creation process before the splitter window is visible,
  306. //     it is not necessary to call this member function.<p/>
  307. //
  308. //     The framework calls this member function whenever the user resizes
  309. //     the splitter window or moves a split.
  310. // Example:
  311. //     See the example for CSplitterWnd::SetColumnInfo.
  312. // -----------------
  313. virtual void RecalcLayout();
  314. // ----------------------------
  315. // Summary:
  316. //     Renders an image of a split window.
  317. // Parameters:
  318. //     pDC     -  A pointer to the device context in which to draw. If pDC is NULL,
  319. //                then CWnd::RedrawWindow is called by the framework and no split
  320. //                window is drawn.
  321. //     nType   -  A value of the enum ESplitType. See remarks section for a list
  322. //                of values.
  323. //     rectArg -  A reference to a CRect object specifying the size and shape of
  324. //                the split windows.
  325. // Remarks:
  326. //     <i>nType</i> can be one of the following values:<p/>
  327. //
  328. //     * <b>splitBox</b>          The splitter drag box.
  329. //     * <b>splitBar</b>          The bar that appears between the two split windows.
  330. //     * <b>splitIntersection</b> The intersection of the split windows. This element
  331. //                                will not be called when running on Windows 95.
  332. //     * <b>splitBorder</b>       The split window borders.
  333. //
  334. //     This member function is called by the framework to draw and specify
  335. //     the exact characteristics of a splitter window.<p/>
  336. //
  337. //     Override OnDrawSplitter for advanced customization of the imagery for the
  338. //     various graphical components of a splitter window. The default imagery is
  339. //     similar to the splitter in Microsoft Works for Windows or Microsoft Windows
  340. //     95, in that the intersections of the splitter bars are blended together.<p/>
  341. //
  342. //     For more on dynamic splitter windows, see "Splitter Windows" in the
  343. //     articleMultiple Document Types, Views, and Frame Windows in Visual C++
  344. //     Programmer's Guide, Technical Note 29, and the CSplitterWnd class overview.
  345. // See Also:
  346. //      CSplitterWnd::OnInvertTracker
  347. // ----------------------------
  348. virtual void OnDrawSplitter(CDC* pDC, ESplitType nType, const CRect& rectArg);
  349. private:
  350. static void AFX_CDECL DeferClientPos(AFX_SIZEPARENTPARAMS* lpLayout,
  351. CWnd* pWnd, int x, int y, int cx, int cy, BOOL bScrollBar);
  352. static  void AFX_CDECL LayoutRowCol(CSplitterWnd::CRowColInfo* pInfoArray,
  353. int nMax, int nSize, int nSizeSplitter);
  354. protected:
  355. //{{AFX_CODEJOCK_PRIVATE
  356. DECLARE_MESSAGE_MAP()
  357. //{{AFX_MSG(CXTSplitterWndEx)
  358. afx_msg void OnPaint();
  359. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  360. //}}AFX_MSG
  361. //}}AFX_CODEJOCK_PRIVATE
  362. protected:
  363. int  m_cyTopBorderGap; // Size in pixels of the top border.
  364. bool m_bShowTopBorder; // true to draw a top border line.
  365. };
  366. //////////////////////////////////////////////////////////////////////
  367. AFX_INLINE void CXTSplitterWndEx::ShowTopBorder(bool bShowTopBorder, int cyTopBorderGap) {
  368. m_bShowTopBorder = bShowTopBorder; m_cyTopBorderGap = cyTopBorderGap;
  369. }
  370. const DWORD XT_SPLIT_DOTTRACKER    = 0x0001; //<ALIAS CXTSplitterWnd::SetSplitterStyle@DWORD>
  371. const DWORD XT_SPLIT_NOFULLDRAG    = 0x0002; //<ALIAS CXTSplitterWnd::SetSplitterStyle@DWORD>
  372. const DWORD XT_SPLIT_NOBORDER      = 0x0004; //<ALIAS CXTSplitterWnd::SetSplitterStyle@DWORD>
  373. const DWORD XT_SPLIT_NOSIZE        = 0x0008; //<ALIAS CXTSplitterWnd::SetSplitterStyle@DWORD>
  374. #endif // !defined(__XTSPLITTERWND_H__)