ProgressBar.cpp
上传用户:szcysw
上传日期:2013-03-11
资源大小:6752k
文件大小:5k
源码类别:

界面编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "ProgressBar.h"
  3. #ifdef _DEBUG
  4. #define new DEBUG_NEW
  5. #undef THIS_FILE
  6. static char THIS_FILE[] = __FILE__;
  7. #endif
  8. IMPLEMENT_DYNCREATE(CProgressBar, CProgressCtrl)
  9. BEGIN_MESSAGE_MAP(CProgressBar, CProgressCtrl)
  10. //{{AFX_MSG_MAP(CProgressBar)
  11. ON_WM_ERASEBKGND()
  12. //}}AFX_MSG_MAP
  13. END_MESSAGE_MAP()
  14. CProgressBar::CProgressBar()
  15. {
  16.     m_Rect.SetRect(0,0,0,0);
  17. }
  18. CProgressBar::CProgressBar
  19. (LPCTSTR strMessage, int nSize,int MaxValue, BOOL bSmooth)
  20. {
  21.     Create(strMessage, nSize, MaxValue, bSmooth);
  22. }
  23. CProgressBar::~CProgressBar()
  24. {
  25.     Clear();
  26. }
  27. CStatusBar* CProgressBar::GetStatusBar()
  28. {
  29.     CStatusBar* pStatusBar = NULL;
  30. CWnd *pMainWnd = AfxGetMainWnd();
  31.     if (!pMainWnd)
  32.         return NULL;
  33. //获取窗口的状态栏
  34.     pStatusBar = (CStatusBar*) pMainWnd->
  35. GetDescendantWindow(AFX_IDW_STATUS_BAR);
  36.     if (!pStatusBar || !pStatusBar->IsKindOf(RUNTIME_CLASS(CStatusBar))) 
  37.         return NULL;
  38.    return pStatusBar;
  39. }
  40. BOOL CProgressBar::Create(LPCTSTR strMessage, int nSize, int MaxValue, 
  41.                           BOOL bSmooth /*=FALSE*/)
  42. {
  43.     BOOL bSuccess = FALSE;
  44.  CStatusBar *pStatusBar = GetStatusBar();
  45.     if (!pStatusBar) return FALSE;
  46.  DWORD dwStyle = WS_CHILD|WS_VISIBLE;
  47. #ifdef PBS_SMOOTH    
  48.     if (bSmooth)
  49. dwStyle |= PBS_SMOOTH;
  50. #endif
  51. // 将状态栏做为进度条的父窗口
  52.     bSuccess = CProgressCtrl::Create(dwStyle, CRect(0,0,0,0), pStatusBar, 1);
  53.     ASSERT(bSuccess);
  54.     if (!bSuccess) return FALSE;
  55.     SetRange(0, MaxValue);
  56.     SetStep(1);
  57. m_strMessage = strMessage;
  58.     m_nSize      = nSize;
  59. //重绘进度条
  60.     Resize();
  61. return TRUE;
  62. }
  63. void CProgressBar::Clear()
  64. {
  65.     if (!IsWindow(GetSafeHwnd()))
  66.         return;
  67. ModifyStyle(WS_VISIBLE, 0);
  68. CString str;
  69.     str.LoadString(AFX_IDS_IDLEMESSAGE);
  70. CStatusBar *pStatusBar = GetStatusBar();
  71.     if (pStatusBar) 
  72. pStatusBar->SetWindowText(str);
  73. }
  74. BOOL CProgressBar::SetText(LPCTSTR strMessage)
  75.     m_strMessage = strMessage; 
  76.     return Resize(); 
  77. }
  78. BOOL CProgressBar::SetSize(int nSize)
  79. {
  80.     m_nSize = nSize; 
  81.     return Resize();
  82. }
  83. COLORREF CProgressBar::SetBarColour(COLORREF clrBar)
  84. {
  85. #ifdef PBM_SETBKCOLOR
  86.     if (!IsWindow(GetSafeHwnd()))
  87.         return 0;
  88.     SendMessage(PBM_SETBARCOLOR, 0, (LPARAM) clrBar);
  89. #else
  90.     UNUSED(clrBar);
  91.     return CLR_DEFAULT;
  92. #endif
  93. }
  94. COLORREF CProgressBar::SetBkColour(COLORREF clrBk)
  95. {
  96. #ifdef PBM_SETBKCOLOR
  97.     if (!IsWindow(GetSafeHwnd()))
  98.         return 0;
  99.     return SendMessage(PBM_SETBKCOLOR, 0, (LPARAM) clrBk);
  100. #else
  101.     UNUSED(clrBk);
  102.     return CLR_DEFAULT;
  103. #endif
  104. }
  105. BOOL CProgressBar::SetRange(int nLower, int nUpper, int nStep)    
  106. {    
  107.     if (!IsWindow(GetSafeHwnd()))
  108.         return FALSE;
  109. #ifdef PBM_SETRANGE32
  110.     ASSERT(-0x7FFFFFFF <= nLower && nLower <= 0x7FFFFFFF);
  111.     ASSERT(-0x7FFFFFFF <= nUpper && nUpper <= 0x7FFFFFFF);
  112.     SendMessage(PBM_SETRANGE32, (WPARAM) nLower, (LPARAM) nUpper);
  113. #else
  114.     ASSERT(0 <= nLower && nLower <= 65535);
  115.     ASSERT(0 <= nUpper && nUpper <= 65535);
  116.     CProgressCtrl::SetRange(nLower, nUpper);
  117. #endif
  118.     CProgressCtrl::SetStep(nStep);
  119.     return TRUE;
  120. }
  121. int CProgressBar::SetPos(int nPos)     
  122. {
  123.     if (!IsWindow(GetSafeHwnd()))
  124.         return 0;
  125. #ifdef PBM_SETRANGE32
  126.     ASSERT(-0x7FFFFFFF <= nPos && nPos <= 0x7FFFFFFF);
  127. #else
  128.     ASSERT(0 <= nPos && nPos =< 65535);
  129. #endif
  130.     ModifyStyle(0,WS_VISIBLE);
  131.     return CProgressCtrl::SetPos(nPos);
  132. }
  133. int  CProgressBar::OffsetPos(int nPos) 
  134.     if (!IsWindow(GetSafeHwnd()))
  135.         return 0;
  136.     ModifyStyle(0,WS_VISIBLE);
  137.     return CProgressCtrl::OffsetPos(nPos);
  138. }
  139. int  CProgressBar::SetStep(int nStep)
  140.     if (!IsWindow(GetSafeHwnd()))
  141.         return 0;
  142.     ModifyStyle(0,WS_VISIBLE);
  143.     return CProgressCtrl::SetStep(nStep);    
  144. }
  145. int  CProgressBar::StepIt()             
  146.     if (!IsWindow(GetSafeHwnd()))
  147.         return 0;
  148.     ModifyStyle(0,WS_VISIBLE);
  149.     return CProgressCtrl::StepIt();    
  150. }
  151. BOOL CProgressBar::Resize() 
  152. {
  153.     if (!IsWindow(GetSafeHwnd()))
  154.         return FALSE;
  155.     CStatusBar *pStatusBar = GetStatusBar();
  156.     if (!pStatusBar) return FALSE;
  157.     // 重绘进度条文本
  158.     if (IsWindowVisible())
  159. {
  160.         pStatusBar->SetWindowText(m_strMessage);
  161.         pStatusBar->UpdateWindow();
  162.     }
  163.     //计算文本的宽度
  164.     CClientDC dc(pStatusBar);
  165.     CFont *pOldFont = dc.SelectObject(pStatusBar->GetFont());
  166.     CSize size = dc.GetTextExtent(m_strMessage);
  167.     int margin = dc.GetTextExtent(_T(" ")).cx * 2;
  168.     dc.SelectObject(pOldFont);
  169.     CRect rc;
  170.     pStatusBar->GetItemRect (0, rc);
  171.     rc.left = size.cx + 2*margin;
  172.     rc.right = rc.left + (rc.right - rc.left) * m_nSize / 100;
  173.     if (rc.right < rc.left)
  174. rc.right = rc.left;
  175.     int Height = rc.bottom - rc.top;
  176.     rc.bottom -= Height/10;
  177.     rc.top    += Height/10;
  178.      if (rc != m_Rect) {
  179.         MoveWindow(&rc);
  180. m_Rect = rc;
  181.     }
  182.     return TRUE;
  183. }
  184. BOOL CProgressBar::OnEraseBkgnd(CDC* pDC) 
  185. {
  186.     Resize();
  187.     return CProgressCtrl::OnEraseBkgnd(pDC);
  188. }