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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupStackPanel.cpp: implementation of the CXTPMarkupStackPanel class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO 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. #include "stdafx.h"
  21. #include "XTPMarkupStackPanel.h"
  22. #include "XTPMarkupBuilder.h"
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char THIS_FILE[]=__FILE__;
  26. #define new DEBUG_NEW
  27. #endif
  28. //////////////////////////////////////////////////////////////////////
  29. // Construction/Destruction
  30. //////////////////////////////////////////////////////////////////////
  31. CXTPMarkupDependencyProperty* CXTPMarkupStackPanel::m_pOrientationProperty = NULL;
  32. IMPLEMENT_MARKUPCLASS(L"StackPanel", CXTPMarkupStackPanel, CXTPMarkupPanel)
  33. void CXTPMarkupStackPanel::RegisterMarkupClass()
  34. {
  35. m_pOrientationProperty = CXTPMarkupDependencyProperty::Register(L"Orientation", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupStackPanel),
  36. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertOrientation, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  37. }
  38. CXTPMarkupStackPanel::CXTPMarkupStackPanel()
  39. {
  40. }
  41. CXTPMarkupStackPanel::~CXTPMarkupStackPanel()
  42. {
  43. }
  44. XTPMarkupOrientation CXTPMarkupStackPanel::GetOrientation() const
  45. {
  46. CXTPMarkupEnum* pOrientation = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pOrientationProperty));
  47. return pOrientation ? (XTPMarkupOrientation)(int)(*pOrientation) : xtpMarkupOrientationVertical;
  48. }
  49. void CXTPMarkupStackPanel::SetOrientation(XTPMarkupOrientation orientation)
  50. {
  51. SetValue(m_pOrientationProperty, CXTPMarkupEnum::CreateValue(orientation));
  52. }
  53. CSize CXTPMarkupStackPanel::MeasureOverride(CXTPMarkupDrawingContext* pDC, CSize constraint)
  54. {
  55. CSize size(0, 0);
  56. CSize availableSize = constraint;
  57. bool bHorizontal = GetOrientation() == xtpMarkupOrientationHorizontal;
  58. if (bHorizontal)
  59. {
  60. availableSize.cx = INT_MAX;
  61. }
  62. else
  63. {
  64. availableSize.cy = INT_MAX;
  65. }
  66. int nCount = m_pChildren->GetCount();
  67. for (int i = 0; i < nCount; i++)
  68. {
  69. CXTPMarkupUIElement* pElement = m_pChildren->GetItem(i);
  70. if (pElement == NULL)
  71. continue;
  72. pElement->Measure(pDC, availableSize);
  73. CSize desiredSize = pElement->GetDesiredSize();
  74. if (bHorizontal)
  75. {
  76. size.cx += desiredSize.cx;
  77. size.cy = max(size.cy, desiredSize.cy);
  78. }
  79. else
  80. {
  81. size.cx = max(size.cx, desiredSize.cx);
  82. size.cy += desiredSize.cy;
  83. }
  84. }
  85. return size;
  86. }
  87. CSize CXTPMarkupStackPanel::ArrangeOverride(CSize arrangeSize)
  88. {
  89. bool bHorizontal = GetOrientation() == xtpMarkupOrientationHorizontal;
  90. CRect finalRect(CPoint(0), arrangeSize);
  91. int width = 0;
  92. int nCount = m_pChildren->GetCount();
  93. for (int i = 0; i < nCount; i++)
  94. {
  95. CXTPMarkupUIElement* pElement = m_pChildren->GetItem(i);
  96. if (pElement == NULL)
  97. continue;
  98. if (bHorizontal)
  99. {
  100. finalRect.left += width;
  101. width = pElement->GetDesiredSize().cx;
  102. finalRect.right = finalRect.left + width;
  103. finalRect.bottom = max(arrangeSize.cy, pElement->GetDesiredSize().cy);
  104. }
  105. else
  106. {
  107. finalRect.top += width;
  108. width = pElement->GetDesiredSize().cy;
  109. finalRect.bottom = finalRect.top + width;
  110. finalRect.right = max(arrangeSize.cx, pElement->GetDesiredSize().cx);
  111. }
  112. pElement->Arrange(finalRect);
  113. }
  114. return arrangeSize;
  115. }
  116. //////////////////////////////////////////////////////////////////////////
  117. //
  118. CXTPMarkupDependencyProperty* CXTPMarkupWrapPanel::m_pOrientationProperty = NULL;
  119. CXTPMarkupDependencyProperty* CXTPMarkupWrapPanel::m_pItemHeightProperty = NULL;
  120. CXTPMarkupDependencyProperty* CXTPMarkupWrapPanel::m_pItemWidthProperty = NULL;
  121. IMPLEMENT_MARKUPCLASS(L"WrapPanel", CXTPMarkupWrapPanel, CXTPMarkupPanel)
  122. void CXTPMarkupWrapPanel::RegisterMarkupClass()
  123. {
  124. m_pOrientationProperty = CXTPMarkupDependencyProperty::Register(L"Orientation", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupWrapPanel),
  125. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertOrientation, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  126. m_pItemHeightProperty = CXTPMarkupDependencyProperty::Register(L"ItemHeight", MARKUP_TYPE(CXTPMarkupInt), MARKUP_TYPE(CXTPMarkupWrapPanel),
  127. new CXTPMarkupPropertyMetadata(NULL,CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  128. m_pItemWidthProperty = CXTPMarkupDependencyProperty::Register(L"ItemWidth", MARKUP_TYPE(CXTPMarkupInt), MARKUP_TYPE(CXTPMarkupWrapPanel),
  129. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  130. }
  131. CXTPMarkupWrapPanel::CXTPMarkupWrapPanel()
  132. {
  133. }
  134. CXTPMarkupWrapPanel::~CXTPMarkupWrapPanel()
  135. {
  136. }
  137. XTPMarkupOrientation CXTPMarkupWrapPanel::GetOrientation() const
  138. {
  139. CXTPMarkupEnum* pOrientation = MARKUP_STATICCAST(CXTPMarkupEnum, GetValue(m_pOrientationProperty));
  140. return pOrientation ? (XTPMarkupOrientation)(int)(*pOrientation) : xtpMarkupOrientationHorizontal;
  141. }
  142. void CXTPMarkupWrapPanel::SetOrientation(XTPMarkupOrientation orientation)
  143. {
  144. SetValue(m_pOrientationProperty, CXTPMarkupEnum::CreateValue(orientation));
  145. }
  146. inline int OrientationWidth(BOOL bHorizontal, const CSize& sz) { return bHorizontal ? sz.cx : sz.cy;};
  147. inline int OrientationHeight(BOOL bHorizontal, const CSize& sz) { return bHorizontal ? sz.cy : sz.cx;};
  148. CSize CXTPMarkupWrapPanel::MeasureOverride(CXTPMarkupDrawingContext* pDC, CSize constraint)
  149. {
  150. BOOL bHorizontal = GetOrientation() == xtpMarkupOrientationHorizontal;
  151. CXTPMarkupInt* pItemWidth = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pItemWidthProperty));
  152. CXTPMarkupInt* pItemHeight = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pItemHeightProperty));
  153. CSize availableSize(pItemWidth != NULL ? (int)*pItemWidth : constraint.cx, pItemHeight != NULL ? (int)*pItemHeight : constraint.cy);
  154. int nTotalWidth = OrientationWidth(bHorizontal, constraint);
  155. int nLineWidth = 0;
  156. int nLineHeight = 0;
  157. int nPanelWidth = 0;
  158. int nPanelHeight = 0;
  159. int nCount = m_pChildren->GetCount();
  160. for (int i = 0; i < nCount; i++)
  161. {
  162. CXTPMarkupUIElement* pElement = m_pChildren->GetItem(i);
  163. if (pElement == NULL)
  164. continue;
  165. pElement->Measure(pDC, availableSize);
  166. CSize desiredSize(pItemWidth != NULL ? (int)*pItemWidth : pElement->GetDesiredSize().cx, pItemHeight != NULL ? (int)*pItemHeight : pElement->GetDesiredSize().cy);
  167. int nDesiredWidth = OrientationWidth(bHorizontal, desiredSize);
  168. int nDesiredHeight = OrientationHeight(bHorizontal, desiredSize);
  169. if (nLineWidth + nDesiredWidth > nTotalWidth)
  170. {
  171. nPanelWidth = max(nPanelWidth, nLineWidth);
  172. nPanelHeight += nLineHeight;
  173. nLineWidth = nDesiredWidth;
  174. nLineHeight = nDesiredHeight;
  175. }
  176. else
  177. {
  178. nLineWidth += nDesiredWidth;
  179. nLineHeight = max(nLineHeight, nDesiredHeight);
  180. }
  181. }
  182. nPanelWidth = max(nPanelWidth, nLineWidth);
  183. nPanelHeight += nLineHeight;
  184. return bHorizontal ? CSize(nPanelWidth, nPanelHeight) : CSize(nPanelHeight, nPanelWidth);
  185. }
  186. void CXTPMarkupWrapPanel::ArrangeLine(int nPanelHeight, int nLineHeight, int nFirstElement, int nLastElement)
  187. {
  188. BOOL bHorizontal = GetOrientation() == xtpMarkupOrientationHorizontal;
  189. CXTPMarkupInt* pItemWidth = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(bHorizontal ? m_pItemWidthProperty : m_pItemHeightProperty));
  190. int nTotalWidth = 0;
  191. for (int i = nFirstElement; i < nLastElement; i++)
  192. {
  193. CXTPMarkupUIElement* pElement = m_pChildren->GetItem(i);
  194. if (pElement == NULL)
  195. continue;
  196. int nWidth = pItemWidth != NULL ? (int)*pItemWidth : (bHorizontal ? pElement->GetDesiredSize().cx : pElement->GetDesiredSize().cy);
  197. if (bHorizontal)
  198. {
  199. pElement->Arrange(CRect(nTotalWidth, nPanelHeight, nTotalWidth + nWidth, nPanelHeight + nLineHeight));
  200. }
  201. else
  202. {
  203. pElement->Arrange(CRect(nPanelHeight, nTotalWidth, nPanelHeight + nLineHeight, nTotalWidth + nWidth));
  204. }
  205. nTotalWidth += nWidth;
  206. }
  207. }
  208. CSize CXTPMarkupWrapPanel::ArrangeOverride(CSize arrangeSize)
  209. {
  210. BOOL bHorizontal = GetOrientation() == xtpMarkupOrientationHorizontal;
  211. CXTPMarkupInt* pItemWidth = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pItemWidthProperty));
  212. CXTPMarkupInt* pItemHeight = MARKUP_STATICCAST(CXTPMarkupInt, GetValue(m_pItemHeightProperty));
  213. int nTotalWidth = OrientationWidth(bHorizontal, arrangeSize);
  214. int nLineWidth = 0;
  215. int nLineHeight = 0;
  216. int nPanelHeight = 0;
  217. int nFirstElement = 0;
  218. int nCount = m_pChildren->GetCount();
  219. for (int i = 0; i < nCount; i++)
  220. {
  221. CXTPMarkupUIElement* pElement = m_pChildren->GetItem(i);
  222. if (pElement == NULL)
  223. continue;
  224. CSize desiredSize(pItemWidth != NULL ? (int)*pItemWidth : pElement->GetDesiredSize().cx, pItemHeight != NULL ? (int)*pItemHeight : pElement->GetDesiredSize().cy);
  225. int nDesiredWidth = OrientationWidth(bHorizontal, desiredSize);
  226. int nDesiredHeight = OrientationHeight(bHorizontal, desiredSize);
  227. if (nLineWidth + nDesiredWidth > nTotalWidth)
  228. {
  229. ArrangeLine(nPanelHeight, nLineHeight, nFirstElement, i);
  230. nPanelHeight += nLineHeight;
  231. nLineWidth = nDesiredWidth;
  232. nLineHeight = nDesiredHeight;
  233. nFirstElement = i;
  234. }
  235. else
  236. {
  237. nLineWidth += nDesiredWidth;
  238. nLineHeight = max(nLineHeight, nDesiredHeight);
  239. }
  240. }
  241. ArrangeLine(nPanelHeight, nLineHeight, nFirstElement, nCount);
  242. return arrangeSize;
  243. }