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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupUIElement.cpp: implementation of the CXTPMarkupUIElement 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 "XTPMarkupUIElement.h"
  22. #include "XTPMarkupDrawingContext.h"
  23. #include "XTPMarkupContext.h"
  24. #include "XTPMarkupBuilder.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[]=__FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupVisual, CXTPMarkupInputElement);
  31. void CXTPMarkupVisual::RegisterMarkupClass()
  32. {
  33. }
  34. CXTPMarkupVisual::CXTPMarkupVisual()
  35. {
  36. m_ptVisualOffset = CPoint(0, 0);
  37. m_szRenderSize = 0;
  38. m_rcBoundRect.SetRectEmpty();
  39. }
  40. BOOL CXTPMarkupVisual::GetLayoutClip(CRect& /*rc*/) const
  41. {
  42. return FALSE;
  43. }
  44. void CXTPMarkupVisual::Render(CXTPMarkupDrawingContext* drawingContext)
  45. {
  46. CRect rcClipBox = drawingContext->GetClipBox();
  47. rcClipBox.OffsetRect(-m_ptVisualOffset);
  48. RECT rcIntersect;
  49. if (!::IntersectRect(&rcIntersect, GetBoundRect(), &rcClipBox))
  50. return;
  51. CRect rcLayoutClip(0, 0, 0, 0);
  52. BOOL bClipLayout = FALSE;
  53. if (GetLayoutClip(rcLayoutClip))
  54. {
  55. if (rcLayoutClip.IsRectEmpty())
  56. return;
  57. rcClipBox.IntersectRect(rcClipBox, rcLayoutClip);
  58. if (!::IntersectRect(&rcIntersect, GetBoundRect(), &rcClipBox))
  59. return;
  60. bClipLayout = TRUE;
  61. }
  62. POINT ptViewortOrg = drawingContext->OffsetViewport(m_ptVisualOffset);
  63. HRGN hrgnClip = 0;
  64. if (bClipLayout)
  65. {
  66. hrgnClip = drawingContext->SaveClipRegion();
  67. drawingContext->IntersectClipRect(rcLayoutClip);
  68. }
  69. OnRender(drawingContext);
  70. int nVisualCount = GetVisualChildrenCount();
  71. for (int i = 0; i < nVisualCount; i++)
  72. {
  73. GetVisualChild(i)->Render(drawingContext);
  74. }
  75. if (IsKeyboardFocused())
  76. {
  77. OnRenderFocusVisual(drawingContext);
  78. }
  79. if (hrgnClip != NULL)
  80. {
  81. drawingContext->RestoreClipRegion(hrgnClip);
  82. }
  83. drawingContext->SetViewport(ptViewortOrg);
  84. }
  85. int CXTPMarkupVisual::GetVisualChildrenCount() const
  86. {
  87. return 0;
  88. }
  89. CXTPMarkupVisual* CXTPMarkupVisual::GetVisualChild(int /*nIndex*/) const
  90. {
  91. ASSERT(FALSE);
  92. return NULL;
  93. }
  94. int CXTPMarkupVisual::GetLogicalChildrenCount() const
  95. {
  96. return GetVisualChildrenCount();
  97. }
  98. CXTPMarkupObject* CXTPMarkupVisual::GetLogicalChild(int nIndex) const
  99. {
  100. return GetVisualChild(nIndex);
  101. }
  102. CXTPMarkupInputElement* CXTPMarkupVisual::InputHitTest(CPoint point) const
  103. {
  104. CPoint ptVisualPoint = point - m_ptVisualOffset;
  105. if (!m_rcBoundRect.PtInRect(ptVisualPoint))
  106. return NULL;
  107. CRect rcClip;
  108. if (GetLayoutClip(rcClip))
  109. {
  110. if (!rcClip.PtInRect(ptVisualPoint))
  111. return NULL;
  112. }
  113. int nVisualCount = GetVisualChildrenCount();
  114. for (int i = nVisualCount - 1; i >= 0; i--)
  115. {
  116. CXTPMarkupInputElement* pObject = GetVisualChild(i)->InputHitTest(ptVisualPoint);
  117. if (pObject)
  118. return pObject;
  119. }
  120. CRect rcRender(0, 0, m_szRenderSize.cx, m_szRenderSize.cy);
  121. if (!rcRender.PtInRect(ptVisualPoint))
  122. return NULL;
  123. return InputHitTestOverride(ptVisualPoint);
  124. }
  125. void CXTPMarkupVisual::UpdateBoundRect()
  126. {
  127. m_rcBoundRect.SetRect(0, 0, m_szRenderSize.cx, m_szRenderSize.cy);
  128. int nVisualCount = GetVisualChildrenCount();
  129. for (int i = 0; i < nVisualCount; i++)
  130. {
  131. CXTPMarkupVisual* pVisual = GetVisualChild(i);
  132. pVisual->UpdateBoundRect();
  133. CRect rcBoundRect = pVisual->m_rcBoundRect;
  134. rcBoundRect.OffsetRect(pVisual->m_ptVisualOffset);
  135. m_rcBoundRect.UnionRect(m_rcBoundRect, rcBoundRect);
  136. }
  137. }
  138. CXTPMarkupInputElement* CXTPMarkupVisual::InputHitTestOverride(CPoint /*point*/) const
  139. {
  140. return (CXTPMarkupInputElement*)this;
  141. }
  142. //////////////////////////////////////////////////////////////////////
  143. // Construction/Destruction
  144. //////////////////////////////////////////////////////////////////////
  145. CXTPMarkupDependencyProperty* CXTPMarkupUIElement::m_pClipToBoundsProperty = NULL;
  146. CXTPMarkupDependencyProperty* CXTPMarkupUIElement::m_pVisibilityProperty = NULL;
  147. CXTPMarkupDependencyProperty* CXTPMarkupUIElement::m_pFocusableProperty = NULL;
  148. CXTPMarkupDependencyProperty* CXTPMarkupUIElement::m_pIsEnabledProperty = NULL;
  149. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupUIElement, CXTPMarkupVisual);
  150. void CXTPMarkupUIElement::RegisterMarkupClass()
  151. {
  152. m_pClipToBoundsProperty = CXTPMarkupDependencyProperty::Register(L"ClipToBounds", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupUIElement));
  153. m_pVisibilityProperty = CXTPMarkupDependencyProperty::Register(L"Visibility", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupUIElement),
  154. new CXTPMarkupPropertyMetadata(NULL, &CXTPMarkupBuilder::ConvertVisibility, CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  155. m_pFocusableProperty = CXTPMarkupDependencyProperty::Register(L"Focusable", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupUIElement),
  156. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateFalseValue()));
  157. m_pIsEnabledProperty = CXTPMarkupDependencyProperty::Register(L"IsEnabled", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupUIElement),
  158. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateTrueValue()));
  159. }
  160. CXTPMarkupUIElement::CXTPMarkupUIElement()
  161. {
  162. m_szDesiredSize = 0;
  163. m_rcFinalRect.SetRectEmpty();
  164. m_bNeverMeasured = TRUE;
  165. m_bMeasureDirty = FALSE;
  166. m_bNeverArranged = TRUE;
  167. m_bArrangeDirty = FALSE;
  168. m_szPreviousAvailableSize = 0;
  169. m_bArrangeInProgress = FALSE;
  170. m_bMeasureInProgress = FALSE;
  171. }
  172. CXTPMarkupUIElement::~CXTPMarkupUIElement()
  173. {
  174. }
  175. CXTPMarkupVisual* CXTPMarkupVisual::GetVisualParent() const
  176. {
  177. CXTPMarkupObject* pUIElement = m_pLogicalParent;
  178. while (pUIElement && !pUIElement->IsKindOf(MARKUP_TYPE(CXTPMarkupVisual)))
  179. {
  180. pUIElement = pUIElement->GetLogicalParent();
  181. }
  182. return (CXTPMarkupVisual*)pUIElement;
  183. }
  184. void CXTPMarkupUIElement::InvalidateArrange()
  185. {
  186. if (!m_bArrangeInProgress && !m_bNeverArranged)
  187. {
  188. m_bArrangeDirty = TRUE;
  189. Arrange(m_rcFinalRect);
  190. InvalidateVisual();
  191. }
  192. }
  193. void CXTPMarkupUIElement::InvalidateMeasure()
  194. {
  195. CXTPMarkupDrawingContext dc;
  196. InvalidateMeasureOverride(&dc);
  197. }
  198. void CXTPMarkupUIElement::InvalidateMeasureOverride(CXTPMarkupDrawingContext* pDC)
  199. {
  200. if (!m_bMeasureInProgress && !m_bNeverMeasured)
  201. {
  202. m_bMeasureDirty = TRUE;
  203. m_bArrangeDirty = TRUE;
  204. CSize sz = GetDesiredSize();
  205. Measure(pDC, m_szPreviousAvailableSize);
  206. if (sz != GetDesiredSize())
  207. {
  208. m_bMeasureDirty = TRUE;
  209. m_bArrangeDirty = TRUE;
  210. CXTPMarkupUIElement* pParent = MARKUP_DYNAMICCAST(CXTPMarkupUIElement, GetVisualParent());
  211. if (pParent)
  212. {
  213. pParent->InvalidateMeasureOverride(pDC);
  214. }
  215. else if (m_pMarkupContext)
  216. {
  217. m_pMarkupContext->OnInvalidateArrange(this);
  218. }
  219. }
  220. else
  221. {
  222. Arrange(m_rcFinalRect);
  223. InvalidateVisual();
  224. }
  225. }
  226. }
  227. void CXTPMarkupUIElement::InvalidateVisual()
  228. {
  229. if (m_pMarkupContext) m_pMarkupContext->OnInvalidateVisual(this);
  230. }
  231. void CXTPMarkupUIElement::Arrange(CRect rcFinalRect)
  232. {
  233. if (GetVisibility() == xtpMarkupVisibilityCollapsed)
  234. {
  235. m_rcFinalRect = rcFinalRect;
  236. m_bArrangeDirty = FALSE;
  237. m_bNeverArranged = FALSE;
  238. return;
  239. }
  240. if (m_bNeverMeasured)
  241. {
  242. CXTPMarkupDrawingContext dc;
  243. Measure(&dc, rcFinalRect.Size());
  244. }
  245. /*if (m_bMeasureDirty || m_bNeverMeasured)
  246. {
  247. CXTPMarkupDrawingContext dc;
  248. if (m_bNeverMeasured)
  249. {
  250. Measure(&dc, rcFinalRect.Size());
  251. }
  252. else
  253. {
  254. Measure(&dc, m_szPreviousAvailableSize);
  255. }
  256. }*/
  257. if ((m_bArrangeDirty || m_bNeverArranged) || (rcFinalRect != m_rcFinalRect))
  258. {
  259. m_bNeverArranged = FALSE;
  260. m_bArrangeInProgress = TRUE;
  261. ArrangeCore(rcFinalRect);
  262. m_bArrangeInProgress = FALSE;
  263. UpdateBoundRect();
  264. }
  265. m_rcFinalRect = rcFinalRect;
  266. m_bArrangeDirty = FALSE;
  267. }
  268. void CXTPMarkupUIElement::ArrangeCore(CRect rcFinalRect)
  269. {
  270. m_szRenderSize = rcFinalRect.Size();
  271. }
  272. void CXTPMarkupUIElement::Measure(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize)
  273. {
  274. if (GetVisibility() == xtpMarkupVisibilityCollapsed)
  275. {
  276. m_bMeasureDirty = TRUE;
  277. m_bNeverMeasured = FALSE;
  278. m_szPreviousAvailableSize = szAvailableSize;
  279. m_szDesiredSize = CSize(0, 0);
  280. return;
  281. }
  282. if ((!m_bMeasureDirty && !m_bNeverMeasured) && (szAvailableSize == m_szPreviousAvailableSize) && !pDC->IsPrinting())
  283. {
  284. return;
  285. }
  286. m_bNeverMeasured = FALSE;
  287. m_bArrangeDirty = TRUE;
  288. m_bMeasureInProgress = TRUE;
  289. CSize size = MeasureCore(pDC, szAvailableSize);
  290. m_bMeasureInProgress = FALSE;
  291. m_szDesiredSize = size;
  292. m_szPreviousAvailableSize = szAvailableSize;
  293. m_bMeasureDirty = pDC->IsPrinting() ? TRUE : FALSE;
  294. }
  295. CSize CXTPMarkupUIElement::MeasureCore(CXTPMarkupDrawingContext* /*pDC*/, CSize /*szAvailableSize*/)
  296. {
  297. return CSize(0, 0);
  298. }
  299. BOOL CXTPMarkupUIElement::GetLayoutClip(CRect& rc) const
  300. {
  301. if (GetVisibility() != xtpMarkupVisibilityVisible)
  302. {
  303. rc.SetRectEmpty();
  304. return TRUE;
  305. }
  306. return FALSE;
  307. }