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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTaskDialogAPI.cpp
  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. #include "stdafx.h"
  21. #include "Common/XTPDrawHelpers.h"
  22. #include "Common/XTPVC50Helpers.h"
  23. #include "Common/XTPMarkupRender.h"
  24. #include "XTPTaskDialogAPI.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. namespace XTPTaskDialogAPI
  31. {
  32. _XTP_EXT_CLASS int AFXAPI XTPLoadStringInst(HINSTANCE hInstance, UINT nID, CString* pString)
  33. {
  34. #ifdef _UNICODE
  35. const int nChar = 1;    // one TCHAR unused is good enough
  36. #else
  37. const int nChar = 2;    // two BYTES unused for case of DBC last char
  38. #endif
  39. const int nMax  = 256;
  40. TCHAR szBuffer[nMax];
  41. int nLen = ::LoadString(hInstance, nID, szBuffer, (nMax-1));
  42. if ((nMax-1) - nLen > nChar)
  43. {
  44. *pString = nLen > 0 ? szBuffer : _T("");
  45. return nLen;
  46. }
  47. int nSize = nMax;
  48. do
  49. {
  50. nSize += nMax;
  51. nLen = ::LoadString(hInstance, nID, pString->GetBuffer(nSize - 1), nSize);
  52. }
  53. while (nSize - nLen <= nChar);
  54. pString->ReleaseBuffer();
  55. return nLen;
  56. }
  57. _XTP_EXT_CLASS CPoint AFXAPI XTPDlu2Pix(int dluX, int dluY)
  58. {
  59. CPoint baseXY(::GetDialogBaseUnits());
  60. CPoint pixXY(0,0);
  61. pixXY.x = ::MulDiv(dluX, baseXY.x, 4);
  62. pixXY.y = ::MulDiv(dluY, baseXY.y, 8);
  63. return pixXY;
  64. }
  65. _XTP_EXT_CLASS CPoint AFXAPI XTPPix2Dlu(int pixX, int pixY)
  66. {
  67. CPoint baseXY(::GetDialogBaseUnits());
  68. CPoint dluXY;
  69. dluXY.x = ::MulDiv(pixX, 4, baseXY.x);
  70. dluXY.y = ::MulDiv(pixY, 8, baseXY.y);
  71. return dluXY;
  72. }
  73. _XTP_EXT_CLASS BOOL AFXAPI XTPCalcTextSize(const CString& strText, CSize& sizeText, CFont& font, BOOL* pbWordWrap /*=NULL*/)
  74. {
  75. if (strText.IsEmpty() || font.m_hObject == NULL)
  76. {
  77. sizeText = CSize(0,0);
  78. return FALSE;
  79. }
  80. CWindowDC dc( NULL );
  81. CXTPFontDC fontDC( &dc, &font );
  82. CRect rectText = XTPSize2Rect(sizeText);
  83. if (dc.DrawText(strText, &rectText,
  84. DT_CALCRECT | DT_LEFT | DT_NOPREFIX | DT_TOP | DT_WORDBREAK) != 0)
  85. {
  86. sizeText = rectText.Size();
  87. if (pbWordWrap)
  88. *pbWordWrap = (sizeText.cy > dc.GetTextExtent(strText).cy);
  89. return TRUE;
  90. }
  91. sizeText = CSize(0,0);
  92. return FALSE;
  93. }
  94. _XTP_EXT_CLASS BOOL AFXAPI XTPCalcIdealTextSize(const CString& strText, CSize& sizeText, CFont& font, int dluMax /*=xtpDluMax*/, int dluGrow /*=xtpDluAdd*/)
  95. {
  96. if ( strText.IsEmpty() || font.m_hObject == NULL )
  97. return FALSE;
  98. CWindowDC dc( NULL );
  99. CXTPFontDC fontDC( &dc, &font );
  100. CSize sizeExtent = dc.GetTextExtent( strText );
  101. int nMaxPix = XTPDlu2Pix( dluMax, 0 ).x;
  102. if (sizeExtent.cx > nMaxPix)
  103. {
  104. sizeText.cx += MulDiv( sizeExtent.cx, XTPDlu2Pix( dluGrow, 0 ).x, nMaxPix);
  105. return XTPCalcTextSize( strText, sizeText, font );
  106. }
  107. else if (sizeExtent.cx > sizeText.cx)
  108. {
  109. CSize sizeMin = sizeText;
  110. XTPCalcTextSize(strText, sizeText, font);
  111. if (sizeText.cx > sizeMin.cx)
  112. {
  113. return TRUE;
  114. }
  115. }
  116. sizeText = sizeExtent;
  117. return FALSE;
  118. }
  119. _XTP_EXT_CLASS BOOL AFXAPI XTPCalcIdealTextSize(CXTPMarkupContext* pMarkupContext, CXTPMarkupUIElement* pUIElement, CSize& sizeText, CFont& font, int dluMax /*=xtpDluMax*/, int dluGrow /*=xtpDluAdd*/)
  120. {
  121. XTPMarkupSetDefaultFont(pMarkupContext, (HFONT)font.GetSafeHandle(), (COLORREF)-1);
  122. CSize sizeExtent = XTPMarkupMeasureElement(pUIElement, INT_MAX, INT_MAX);
  123. CSize sizeMax = sizeExtent;
  124. int nMaxPix = XTPDlu2Pix( dluMax, 0 ).x;
  125. if (sizeExtent.cx > nMaxPix)
  126. {
  127. sizeText.cx += MulDiv( sizeExtent.cx, XTPDlu2Pix( dluGrow, 0 ).x, nMaxPix);
  128. }
  129. sizeExtent = XTPMarkupMeasureElement(pUIElement, sizeText.cx, INT_MAX);
  130. if (sizeExtent.cx == sizeText.cx && sizeExtent.cy == sizeMax.cy && sizeExtent.cx < sizeMax.cx)
  131. sizeExtent = sizeMax;
  132. sizeText = sizeExtent;
  133. return TRUE;
  134. }
  135. _XTP_EXT_CLASS CString AFXAPI XTPExtractSubString(CString strFullString, int iSubString)
  136. {
  137. if (strFullString.Find(_T('n')) != -1)
  138. {
  139. CString strSubString;
  140. AfxExtractSubString(strSubString, strFullString, iSubString, _T('n'));
  141. return strSubString;
  142. }
  143. return ((iSubString == 0)? strFullString: _T(""));
  144. }
  145. _XTP_EXT_CLASS CRect AFXAPI XTPSize2Rect(CSize size)
  146. {
  147. return CRect(CPoint(0, 0), size);
  148. }
  149. }