TextProgressCtrl.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:6k
源码类别:

图形图象

开发平台:

Visual C++

  1. // TextProgressCtrl.cpp : implementation file
  2. //
  3. // Written by Chris Maunder (cmaunder@mail.com)
  4. // Copyright 1998.
  5. //
  6. // TextProgressCtrl is a drop-in replacement for the standard 
  7. // CProgressCtrl that displays text in a progress control.
  8. //
  9. // This code may be used in compiled form in any way you desire. This
  10. // file may be redistributed by any means PROVIDING it is not sold for
  11. // profit without the authors written consent, and providing that this
  12. // notice and the authors name is included. If the source code in 
  13. // this file is used in any commercial application then an email to
  14. // the me would be nice.
  15. //
  16. // This file is provided "as is" with no expressed or implied warranty.
  17. // The author accepts no liability if it causes any damage to your
  18. // computer or anything else vaguely within it's vicinity.
  19. //
  20. // Expect bugs.
  21. // 
  22. // Please use and enjoy. Please let me know of any bugs/mods/improvements 
  23. // that you have found/implemented and I will fix/incorporate them into this
  24. // file. 
  25. // Modified by Philip Oldaker 2000
  26. #include "stdafx.h"
  27. #include "TextProgressCtrl.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. IMPLEMENT_DYNAMIC(CTextProgressCtrl,CUIODColumnCtrl)
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CTextProgressCtrl
  36. CTextProgressCtrl::CTextProgressCtrl()
  37. {
  38.     m_nPos      = 0;
  39.     m_nStepSize = 1;
  40.     m_nMax      = 100;
  41.     m_nMin      = 0;
  42.     m_bShowText = TRUE;
  43.     m_crBarClr = CLR_DEFAULT;
  44.     m_crBgClr = CLR_DEFAULT;
  45. m_crTextClr = CLR_DEFAULT;
  46.     m_crSelBarClr   = CLR_DEFAULT;
  47.     m_crSelBgClr    = CLR_DEFAULT;
  48. m_crSelTextClr  = CLR_DEFAULT;
  49. }
  50. CTextProgressCtrl::~CTextProgressCtrl()
  51. {
  52. }
  53. void CTextProgressCtrl::DoPaint(CDC *PaintDC,CRect rcClient,bool bSelected) 
  54. {
  55.     if (m_nMin >= m_nMax) 
  56.         return;
  57. bool bInvert=bSelected;
  58.     COLORREF crBarColour = (m_crBarClr == CLR_DEFAULT)? RGB(10,20,200) : m_crBarClr;
  59.     COLORREF crBgColour = (m_crBgClr == CLR_DEFAULT)? ::GetSysColor(COLOR_MENU) : m_crBgClr;
  60. COLORREF crTextColor = (m_crTextClr == CLR_DEFAULT)? ::GetSysColor(COLOR_BTNTEXT)  : m_crTextClr;
  61. if (bSelected)
  62. {
  63. if (m_crSelBarClr != CLR_DEFAULT)
  64. {
  65. crBarColour = m_crSelBarClr;
  66. bInvert = false;
  67. }
  68. if (m_crSelBgClr != CLR_DEFAULT)
  69. {
  70. crBgColour = m_crSelBgClr;
  71. bInvert = false;
  72. }
  73. if (m_crSelTextClr != CLR_DEFAULT)
  74. {
  75. crTextColor = m_crSelTextClr;
  76. bInvert = false;
  77. }
  78. }
  79.     double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin));
  80. CDC &dc = *PaintDC;
  81. dc.Rectangle(rcClient.left+1,rcClient.top+1,rcClient.right-1,rcClient.bottom-1);
  82. rcClient.DeflateRect(2,2);
  83.     CRect LeftRect(rcClient);
  84. CRect RightRect(rcClient);
  85.     LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction);
  86.     RightRect.left = LeftRect.right;
  87.     dc.FillSolidRect(LeftRect, crBarColour);
  88.     dc.FillSolidRect(RightRect, crBgColour);
  89.     // Draw Text if not vertical
  90.     if (m_bShowText)
  91.     {
  92.         CString str;
  93.         if (m_strText.GetLength())
  94.             str = m_strText;
  95.         else
  96.             str.Format("%d%%", (int)(Fraction*100.0));
  97. CSize sz = dc.GetTextExtent(str);
  98. int nTextPos = 0;
  99. if (rcClient.Width() > sz.cx)
  100. nTextPos = (rcClient.Width() - sz.cx) / 2;
  101. if (!bSelected && LeftRect.Width() >= nTextPos) 
  102. {
  103. dc.SetTextColor(RGB(255,255,255));
  104. }
  105. else
  106. dc.SetTextColor(crTextColor);
  107.         dc.SetBkMode(TRANSPARENT);
  108.         DWORD dwTextStyle = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
  109.         dc.DrawText(str, rcClient, dwTextStyle);
  110.     }
  111. if (bInvert)
  112. {
  113. dc.InvertRect(rcClient);
  114. }
  115. }
  116. /////////////////////////////////////////////////////////////////////////////
  117. // CTextProgressCtrl operations
  118. void CTextProgressCtrl::SetShowText(BOOL bShow)
  119.     m_bShowText = bShow;
  120. }
  121. void CTextProgressCtrl::SetRange(int nLower, int nUpper)
  122. {
  123.     m_nMax = nUpper;
  124.     m_nMin = nLower;
  125. }
  126. void CTextProgressCtrl::GetRange(int& nLower, int& nUpper) const
  127. {
  128.     nUpper = m_nMax;
  129.     nLower = m_nMin;
  130. }
  131. int CTextProgressCtrl::SetPos(int nPos) 
  132. {    
  133.     int nOldPos = m_nPos;
  134.     m_nPos = nPos;
  135.     return nOldPos;
  136. }
  137. int CTextProgressCtrl::StepIt() 
  138. {    
  139.    return SetPos(m_nPos + m_nStepSize);
  140. }
  141. int CTextProgressCtrl::OffsetPos(int nPos)
  142. {
  143.     return SetPos(m_nPos + nPos);
  144. }
  145. int CTextProgressCtrl::SetStep(int nStep)
  146. {
  147.     int nOldStep = m_nStepSize;
  148.     m_nStepSize = nStep;
  149.     return nOldStep;
  150. }
  151. COLORREF CTextProgressCtrl::SetBarColor(COLORREF crBarClr /*= CLR_DEFAULT*/,COLORREF crSelBarClr /*= CLR_DEFAULT*/)
  152. {
  153.     COLORREF crOldBarClr = m_crBarClr;
  154.     m_crBarClr = crBarClr;
  155.     m_crSelBarClr = crSelBarClr;
  156.     return crOldBarClr;
  157. }
  158. COLORREF CTextProgressCtrl::GetBarColor() const
  159.     return m_crBarClr;
  160. }
  161. COLORREF CTextProgressCtrl::GetSelBarColor() const
  162.     return m_crSelBarClr;
  163. }
  164. COLORREF CTextProgressCtrl::SetBgColor(COLORREF crBgClr /*= CLR_DEFAULT*/,COLORREF crSelBgClr /*= CLR_DEFAULT*/)
  165. {
  166.     COLORREF crOldBgClr = m_crBgClr;
  167.     m_crBgClr = crBgClr;
  168. m_crSelBgClr = crSelBgClr;
  169.     return crOldBgClr;
  170. }
  171. COLORREF CTextProgressCtrl::GetBgColor() const
  172.     return m_crBgClr;
  173. }
  174. COLORREF CTextProgressCtrl::GetSelBgColor() const
  175.     return m_crSelBgClr;
  176. }
  177. COLORREF CTextProgressCtrl::SetTextColor(COLORREF crTextClr /*= CLR_DEFAULT*/,COLORREF crSelTextClr /*= CLR_DEFAULT*/)
  178. {
  179.     COLORREF crOldTextClr = m_crTextClr;
  180.     m_crTextClr = crTextClr;
  181. m_crSelTextClr = crSelTextClr;
  182.     return crOldTextClr;
  183. }
  184. COLORREF CTextProgressCtrl::GetTextColor() const
  185.     return m_crTextClr;
  186. }
  187. COLORREF CTextProgressCtrl::GetSelTextColor() const
  188.     return m_crSelTextClr;
  189. }