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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupBorder.cpp: implementation of the CXTPMarkupBorder 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 "XTPMarkupBorder.h"
  22. #include "XTPMarkupDrawingContext.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* CXTPMarkupBorder::m_pBackgroundProperty = NULL;
  32. CXTPMarkupDependencyProperty* CXTPMarkupBorder::m_pPaddingProperty = NULL;
  33. CXTPMarkupDependencyProperty* CXTPMarkupBorder::m_pBorderThicknessProperty = NULL;
  34. CXTPMarkupDependencyProperty* CXTPMarkupBorder::m_pBorderBrushProperty = NULL;
  35. IMPLEMENT_MARKUPCLASS(L"Border", CXTPMarkupBorder, CXTPMarkupFrameworkElement);
  36. void CXTPMarkupBorder::RegisterMarkupClass()
  37. {
  38. m_pBackgroundProperty = CXTPMarkupDependencyProperty::Register(L"Background", MARKUP_TYPE(CXTPMarkupBrush), MARKUP_TYPE(CXTPMarkupBorder),
  39. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagAffectsRender));
  40. m_pPaddingProperty = CXTPMarkupDependencyProperty::Register(L"Padding", MARKUP_TYPE(CXTPMarkupThickness), MARKUP_TYPE(CXTPMarkupBorder),
  41. new CXTPMarkupPropertyMetadata(CXTPMarkupThickness::CreateValue(), CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  42. m_pBorderThicknessProperty = CXTPMarkupDependencyProperty::Register(L"BorderThickness", MARKUP_TYPE(CXTPMarkupThickness), MARKUP_TYPE(CXTPMarkupBorder),
  43. new CXTPMarkupPropertyMetadata(CXTPMarkupThickness::CreateValue(), CXTPMarkupPropertyMetadata::flagAffectsMeasure));
  44. m_pBorderBrushProperty = CXTPMarkupDependencyProperty::Register(L"BorderBrush", MARKUP_TYPE(CXTPMarkupBrush), MARKUP_TYPE(CXTPMarkupBorder),
  45. new CXTPMarkupPropertyMetadata(NULL, CXTPMarkupPropertyMetadata::flagAffectsRender));
  46. }
  47. CXTPMarkupBorder::CXTPMarkupBorder()
  48. {
  49. }
  50. CXTPMarkupBorder::~CXTPMarkupBorder()
  51. {
  52. }
  53. CXTPMarkupBrush* CXTPMarkupBorder::GetBackground() const
  54. {
  55. return MARKUP_STATICCAST(CXTPMarkupBrush, GetValue(m_pBackgroundProperty));
  56. }
  57. CXTPMarkupBrush* CXTPMarkupBorder::GetBorderBrush() const
  58. {
  59. return MARKUP_STATICCAST(CXTPMarkupBrush, GetValue(m_pBorderBrushProperty));
  60. }
  61. void CXTPMarkupBorder::SetBackground(CXTPMarkupBrush* brush)
  62. {
  63. SetValue(m_pBackgroundProperty, brush);
  64. }
  65. void CXTPMarkupBorder::SetBorderBrush(CXTPMarkupBrush* brush)
  66. {
  67. SetValue(m_pBorderBrushProperty, brush);
  68. }
  69. CSize CXTPMarkupBorder::MeasureOverride(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize)
  70. {
  71. CSize size2 = GetBorderThickness()->Size();
  72. CSize size3 = GetPadding()->Size();
  73. if (m_pChild != NULL)
  74. {
  75. CSize size4(size2.cx + size3.cx, size2.cy + size3.cy);
  76. CSize availableSize(max(0, szAvailableSize.cx - size4.cx), max(0, szAvailableSize.cy - size4.cy));
  77. m_pChild->Measure(pDC, availableSize);
  78. CSize desiredSize = m_pChild->GetDesiredSize();
  79. return CSize(desiredSize.cx + size4.cx, desiredSize.cy + size4.cy);
  80. }
  81. return CSize(size2.cx + size3.cx, size2.cy + size3.cy);
  82. }
  83. CSize CXTPMarkupBorder::ArrangeOverride(CSize szFinalSize)
  84. {
  85. if (m_pChild != NULL)
  86. {
  87. CRect rt(0, 0, szFinalSize.cx, szFinalSize.cy);
  88. CRect rect2 = CXTPMarkupThickness::HelperDeflateRect(rt, GetBorderThickness());
  89. CRect finalRect = CXTPMarkupThickness::HelperDeflateRect(rect2, GetPadding());
  90. m_pChild->Arrange(finalRect);
  91. }
  92. return szFinalSize;
  93. }
  94. void CXTPMarkupBorder::OnRender(CXTPMarkupDrawingContext* pDC)
  95. {
  96. CSize szRender = GetActualSize();
  97. if (szRender.cx <= 0 || szRender.cy <= 0)
  98. return;
  99. CXTPMarkupThickness* pBorderThickness = GetBorderThickness();
  100. CXTPMarkupBrush* pBorderBrush = GetBorderBrush();
  101. if (!pBorderThickness->IsZero() && pBorderBrush)
  102. {
  103. if (pBorderThickness->left > 0)
  104. {
  105.  pDC->DrawRectangle(pBorderBrush, CRect(0, 0, pBorderThickness->left, szRender.cy));
  106. }
  107. if (pBorderThickness->right > 0)
  108. {
  109.  pDC->DrawRectangle(pBorderBrush, CRect(szRender.cx - pBorderThickness->right, 0, szRender.cx, szRender.cy));
  110. }
  111. if (pBorderThickness->top > 0)
  112. {
  113.  pDC->DrawRectangle(pBorderBrush, CRect(0, 0, szRender.cx, pBorderThickness->top));
  114. }
  115. if (pBorderThickness->bottom > 0)
  116. {
  117.  pDC->DrawRectangle(pBorderBrush, CRect(0, szRender.cy - pBorderThickness->bottom, szRender.cx, szRender.cy));
  118. }
  119. }
  120. CXTPMarkupBrush* pBackground = GetBackground();
  121. if (pBackground)
  122. {
  123.   CPoint point(pBorderThickness->left, pBorderThickness->top);
  124.   CPoint point2(szRender.cx - pBorderThickness->right, szRender.cy - pBorderThickness->bottom);
  125.   if ((point2.x > point.x) && (point2.y > point.y))
  126.   {
  127.   pDC->DrawRectangle(pBackground, CRect(point, point2));
  128.   }
  129. }
  130. }
  131. CXTPMarkupInputElement* CXTPMarkupBorder::InputHitTestOverride(CPoint /*point*/) const
  132. {
  133. return GetBackground() != NULL ? (CXTPMarkupInputElement*)this : NULL;
  134. }