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

对话框与窗口

开发平台:

Visual C++

  1. // XTPDockingPaneSplitterContainer.h : interface for the CXTPDockingPaneSplitterContainer class.
  2. //
  3. // This file is a part of the XTREME DOCKINGPANE 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(__XTPDOCKINGPANESPLITTERCONTAINER_H__)
  22. #define __XTPDOCKINGPANESPLITTERCONTAINER_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER >= 1000
  25. #pragma once
  26. #endif // _MSC_VER >= 1000
  27. #include "XTPDockingPaneDefines.h"
  28. #include "XTPDockingPaneBaseContainer.h"
  29. class CXTPDockingPaneSplitterContainer;
  30. class CXTPDockingPaneLayout;
  31. //===========================================================================
  32. // Summary:
  33. //     CXTPDockingPaneSplitterWnd is a CWnd derived class. It is
  34. //     used internally for splitting Panes.
  35. //===========================================================================
  36. class _XTP_EXT_CLASS CXTPDockingPaneSplitterWnd: public CWnd
  37. {
  38. protected:
  39. //-----------------------------------------------------------------------
  40. // Summary:
  41. //     Constructs a CXTPDockingPaneSplitterWnd object
  42. //-----------------------------------------------------------------------
  43. CXTPDockingPaneSplitterWnd();
  44. //-----------------------------------------------------------------------
  45. // Summary:
  46. //     Destroys a CXTPDockingPaneSplitterWnd object, handles cleanup and deallocation
  47. //-----------------------------------------------------------------------
  48. ~CXTPDockingPaneSplitterWnd();
  49. public:
  50. //-----------------------------------------------------------------------
  51. // Summary:
  52. //     Determines if splitter is horizontal
  53. // Returns:
  54. //     TRUE if splitter is horizontal located.
  55. //-----------------------------------------------------------------------
  56. BOOL IsHorizontal() const;
  57. //-----------------------------------------------------------------------
  58. // Summary:
  59. //     Creates CXTPDockingPaneSplitterWnd window.
  60. // Parameters:
  61. //     pContainer - Points to a parent CXTPDockingPaneSplitterContainer object
  62. //     pFirst     - Points to a first splitting CXTPDockingPaneBase object
  63. //     pSecond    - Points to a second splitting CXTPDockingPaneBase object
  64. //-----------------------------------------------------------------------
  65. void Create(CXTPDockingPaneSplitterContainer* pContainer, CXTPDockingPaneBase* pFirst, CXTPDockingPaneBase* pSecond);
  66. //-----------------------------------------------------------------------
  67. // Summary:
  68. //     Creates CXTPDockingPaneSplitterWnd window.
  69. // Parameters:
  70. //     pManager - Parent manager object
  71. //     bHoriz - True if horizontal splitter
  72. //-----------------------------------------------------------------------
  73. void Create(CXTPDockingPaneManager* pManager, BOOL bHoriz);
  74. //-----------------------------------------------------------------------
  75. // Summary:
  76. //     Retrieves associated splitter container of splitter window
  77. // Returns:
  78. //     Pointer to parent CXTPDockingPaneSplitterContainer window
  79. //-----------------------------------------------------------------------
  80. CXTPDockingPaneSplitterContainer* GetContainer() const;
  81. protected:
  82. //{{AFX_CODEJOCK_PRIVATE
  83. DECLARE_MESSAGE_MAP()
  84. //{{AFX_MSG(CXTPDockingPaneSplitterWnd)
  85. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  86. afx_msg void OnPaint();
  87. afx_msg LRESULT OnPrintClient(WPARAM wParam, LPARAM /*lParam*/);
  88. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  89. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  90. //}}AFX_MSG
  91. //}}AFX_CODEJOCK_PRIVATE
  92. private:
  93. CXTPDockingPaneManager* GetDockingPaneManager() const;
  94. void Reposition(CRect rc, CRect rcAvail);
  95. BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
  96. BOOL GetAvailableRect(CRect& rcAvail, CRect& rcUnion);
  97. private:
  98. CXTPDockingPaneSplitterContainer* m_pContainer;
  99. CXTPDockingPaneBase* m_pFirst;
  100. CXTPDockingPaneBase* m_pSecond;
  101. CXTPDockingPaneManager* m_pManager;
  102. HCURSOR m_hCursor;
  103. BOOL m_bHoriz;
  104. private:
  105. friend class CXTPDockingPaneSplitterContainer;
  106. friend class CXTPDockingPaneLayout;
  107. };
  108. AFX_INLINE CXTPDockingPaneSplitterContainer* CXTPDockingPaneSplitterWnd::GetContainer() const {
  109. return m_pContainer;
  110. }
  111. //===========================================================================
  112. // Summary:
  113. //     CXTPDockingPaneSplitterContainer is a CXTPDockingPaneBase derived class.
  114. //     It is used internally as a splitter container for CXTPDockingPaneBase
  115. //     derived classes.
  116. //===========================================================================
  117. class _XTP_EXT_CLASS CXTPDockingPaneSplitterContainer : public CXTPCmdTarget, public CXTPDockingPaneBaseContainer
  118. {
  119. protected:
  120. //-----------------------------------------------------------------------
  121. // Summary:
  122. //     Constructs a CXTPDockingPaneSplitterContainer object.
  123. // Parameters:
  124. //     pLayout - Points to a CXTPDockingPaneLayout object.
  125. //-----------------------------------------------------------------------
  126. CXTPDockingPaneSplitterContainer(CXTPDockingPaneLayout* pLayout);
  127. //-----------------------------------------------------------------------
  128. // Summary:
  129. //     Destroys a CXTPDockingPaneSplitterContainer object, handles
  130. //     cleanup and deallocation
  131. //-----------------------------------------------------------------------
  132. virtual ~CXTPDockingPaneSplitterContainer();
  133. public:
  134. //-----------------------------------------------------------------------
  135. // Summary:
  136. //     This method is called to set the position of the pane.
  137. // Parameters:
  138. //     pParent - Points to a CWnd object
  139. //     rect    - Rectangle of the pane to be set
  140. //     lParam  - Pointer to AFX_SIZEPARENTPARAMS structure
  141. //-----------------------------------------------------------------------
  142. virtual void OnSizeParent(CWnd* pParent, CRect rect, LPVOID lParam);
  143. //-----------------------------------------------------------------------
  144. // Summary:
  145. //     Call this member to retrieve a collection of the panes with
  146. //     the specified type only within the splitter container's child panes.
  147. // Parameters:
  148. //     type  - Type of the panes to find.
  149. //     pList - Points to a CXTPDockingPaneBaseList object that will
  150. //             contain found panes.
  151. //-----------------------------------------------------------------------
  152. void FindChildPane(XTPDockingPaneType type, CXTPDockingPaneBaseList* pList) const;
  153. //-----------------------------------------------------------------------
  154. // Summary:
  155. //     Call this member to determine if the splitter orientation
  156. //     is horizontal.
  157. // Returns:
  158. //     TRUE if the splitter orientation is horizontal, FALSE
  159. //     otherwise.
  160. //-----------------------------------------------------------------------
  161. BOOL IsHoriz() const { return m_bHoriz; }
  162. //-----------------------------------------------------------------------
  163. // Summary:
  164. //     Call this member to fill the pMinMaxInfo structure with the
  165. //     minimum and maximum width and height of the splitter container.
  166. //     This will look at the MinMaxInfo for each pane in the splitter
  167. //     container and set the appropriate minimum and maximum width
  168. //     and height for the splitter container.
  169. // Parameters:
  170. //     pMinMaxInfo - Pointer to MINMAXINFO structure
  171. //-----------------------------------------------------------------------
  172. void GetMinMaxInfo(LPMINMAXINFO pMinMaxInfo) const;
  173. protected:
  174. //-----------------------------------------------------------------------
  175. // Summary:
  176. //     Constructs a CXTPDockingPaneSplitterContainer object
  177. //     Protected constructor. Internally constructed only.
  178. // Parameters:
  179. //     pPane   - Child pane.
  180. //     bHoriz - TRUE if the splitter orientation is horizontal
  181. //     pFrame - Parent Frame.
  182. //-----------------------------------------------------------------------
  183. void Init(CXTPDockingPaneBase* pPane, BOOL bHoriz, CWnd* pFrame);
  184. //-----------------------------------------------------------------------
  185. // Summary:
  186. //     Copies a CXTPDockingPaneSplitterContainer object
  187. // Parameters:
  188. //     pClone  - Points to a CXTPDockingPaneSplitterContainer object
  189. //     pMap - Points to a CXTPPaneToPaneMap object
  190. // See Also:
  191. //     CXTPPaneToPaneMap
  192. //-----------------------------------------------------------------------
  193. void Copy(CXTPDockingPaneBase* pClone, CXTPPaneToPaneMap* pMap, DWORD dwIgnoredOptions);
  194. //-----------------------------------------------------------------------
  195. // Summary:
  196. //     This member is called by the framework when a splitter
  197. //     container is created.
  198. // Returns:
  199. //     Pointer to the newly created CXTPDockingPaneSplitterWnd
  200. //     object.
  201. //-----------------------------------------------------------------------
  202. virtual CXTPDockingPaneSplitterWnd* OnCreateSplitter();
  203. protected:
  204. //-----------------------------------------------------------------------
  205. // Summary:
  206. //     This member is called to remove a pane from the collection.
  207. // Parameters:
  208. //     pPane - Points to a CXTPDockingPaneBase object.
  209. //-----------------------------------------------------------------------
  210. virtual void RemovePane(CXTPDockingPaneBase* pPane);
  211. //-----------------------------------------------------------------------
  212. // Summary:
  213. //     This member is called when a child pane collection is changed.
  214. // Parameters:
  215. //     pContainer - Points to a CXTPDockingPaneBase object.
  216. //-----------------------------------------------------------------------
  217. virtual void OnChildContainerChanged(CXTPDockingPaneBase* pContainer);
  218. //-----------------------------------------------------------------------
  219. // Summary:
  220. //     This member is called when the parent pane collection is changed.
  221. // Parameters:
  222. //     pContainer - Points to a CXTPDockingPaneBase object.
  223. //-----------------------------------------------------------------------
  224. virtual void OnParentContainerChanged(CXTPDockingPaneBase* pContainer);
  225. //-----------------------------------------------------------------------
  226. // Summary:
  227. //     This member is called to save/restore the settings of the pane.
  228. // Parameters:
  229. //     pPX - Points to a CXTPPropExchange object.
  230. // Returns:
  231. //     TRUE if successful; otherwise returns FALSE.
  232. //-----------------------------------------------------------------------
  233. virtual BOOL DoPropExchange(CXTPPropExchange* pPX);
  234. //-----------------------------------------------------------------------
  235. // Summary:
  236. //     This member is called to normalize the size of docking panes
  237. //     in the splitter container.  Normalizing the size of the panes
  238. //     means that the value of the left coordinate is less than the
  239. //     right and the top is less than the bottom.
  240. //-----------------------------------------------------------------------
  241. void NormalizeDockingSize();
  242. //-----------------------------------------------------------------------
  243. // Summary:
  244. //     This method is called to destroy pane
  245. //-----------------------------------------------------------------------
  246. void DeletePane();
  247. private:
  248. void _Replace(CXTPDockingPaneBase* pPane, CXTPDockingPaneBase* pReplace);
  249. void _InsertPane(CXTPDockingPaneBase* pPane, CXTPDockingPaneBase* pNeighbour = NULL, BOOL bAfter = TRUE);
  250. void _UpdateSplitters();
  251. BOOL _Before(const CXTPDockingPaneBase* pPane, POSITION pos) const;
  252. CRect _CalculateResultDockingRectSelf(CXTPDockingPaneBase* pPane, XTPDockingPaneDirection direction, CXTPDockingPaneBase* pNeighbour);
  253. static CRect AFX_CDECL _CalculateResultDockingRectChild(CXTPDockingPaneBase* pSplitter, CXTPDockingPaneBase* pPane, XTPDockingPaneDirection direction);
  254. static CRect AFX_CDECL _CalculateResultDockingRect(BOOL bHoriz, CXTPDockingPaneBaseList& lst, CRect rect, CXTPDockingPaneBase* pPaneI);
  255. static void AFX_CDECL _AdjustPanesLength(CXTPDockingPaneManager* pManager, CXTPDockingPaneBaseList& lst, CRect rect, BOOL bHoriz, BOOL bApply, int& nTotalLength, int& nLengthAvail);
  256. static LONG& AFX_CDECL GetMinSize(LPMINMAXINFO pMinMaxInfo, BOOL bHoriz);
  257. static LONG& AFX_CDECL GetMaxSize(LPMINMAXINFO pMinMaxInfo, BOOL bHoriz);
  258. protected:
  259. CList<CXTPDockingPaneSplitterWnd*, CXTPDockingPaneSplitterWnd*> m_lstSpliters;  // List of splitter windows
  260. BOOL m_bHoriz;                        // TRUE if the splitter orientation is horizontal
  261. BOOL m_bRecalcLayout;                 // TRUE if RecalcLayout method currently executed.
  262. private:
  263. friend class CXTPDockingPaneManager;
  264. friend class CXTPDockingPaneSplitterWnd;
  265. friend class CXTPDockingPaneMiniWnd;
  266. friend class CXTPDockingPaneLayout;
  267. };
  268. AFX_INLINE BOOL CXTPDockingPaneSplitterWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) {
  269. return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  270. }
  271. AFX_INLINE LONG& CXTPDockingPaneSplitterContainer::GetMinSize(LPMINMAXINFO pMinMaxInfo, BOOL bHoriz) {
  272. return bHoriz ? pMinMaxInfo->ptMinTrackSize.x : pMinMaxInfo->ptMinTrackSize.y;
  273. }
  274. AFX_INLINE LONG& CXTPDockingPaneSplitterContainer::GetMaxSize(LPMINMAXINFO pMinMaxInfo, BOOL bHoriz) {
  275. return bHoriz ? pMinMaxInfo->ptMaxTrackSize.x : pMinMaxInfo->ptMaxTrackSize.y;
  276. }
  277. #endif // #if !defined(__XTPDOCKINGPANESPLITTERCONTAINER_H__)