ProgressBar.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "ProgressBar.h"
  3. // Paint the progress bar in response to a paint message
  4. void ProgressBar::paint (CDC& dc)
  5. {
  6.     paintBackground (dc);
  7.     paintStatus (dc);
  8. }
  9. // Paint the background of the progress bar region
  10. void ProgressBar::paintBackground (CDC& dc)
  11. {
  12.     CBrush      brshBackground;
  13.     CPen        penGray     (PS_SOLID, 1, RGB (128, 128, 128));
  14.     CPen        penWhite    (PS_SOLID, 1, RGB (255, 255, 255));
  15.     VERIFY (brshBackground.CreateSolidBrush (::GetSysColor (COLOR_BTNFACE)));
  16.     dc.FillRect (m_bounds, &brshBackground);
  17.     
  18.     CPen    *pOldPen;
  19.             
  20.     pOldPen = dc.SelectObject (&penGray);
  21.     {
  22.         dc.MoveTo (m_bounds.left, m_bounds.top);
  23.         dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top);
  24.         dc.MoveTo (m_bounds.left, m_bounds.top);
  25.         dc.LineTo (m_bounds.left, m_bounds.top + m_bounds.Height () -1);
  26.     }
  27.     dc.SelectObject (&penWhite);
  28.     {
  29.         dc.MoveTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top);
  30.         dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top + m_bounds.Height () -1);
  31.         dc.MoveTo (m_bounds.left, m_bounds.top + m_bounds.Height () -1);
  32.         dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top + m_bounds.Height () -1);
  33.     }
  34.     dc.SelectObject (pOldPen);
  35. }
  36. // Paint the actual status of the progress bar
  37. void ProgressBar::paintStatus (CDC& dc)
  38. {
  39.     if (m_progress <= 0)
  40.         return;
  41.     CBrush      brshStatus;
  42.     CRect       rect (m_bounds.left, m_bounds.top, 
  43.                     m_bounds.left + m_progressX, m_bounds.bottom);
  44.     COLORREF    statusColor = getStatusColor ();
  45.     VERIFY (brshStatus.CreateSolidBrush (statusColor));
  46.     rect.DeflateRect (1, 1);
  47.     dc.FillRect (rect, &brshStatus);
  48. }
  49. // Paint the current step
  50. void ProgressBar::paintStep (int startX, int endX)
  51. {
  52.     // kludge: painting the whole region on each step
  53.     m_baseWindow->RedrawWindow (m_bounds);
  54.     m_baseWindow->UpdateWindow ();
  55. }
  56. // Setup the progress bar for execution over a total number of steps
  57. void ProgressBar::start (int total)
  58. {
  59.     m_total = total;
  60.     reset ();
  61. }
  62. // Take one step, indicating whether it was a successful step
  63. void ProgressBar::step (bool successful)
  64. {
  65.     m_progress++;
  66.     int x = m_progressX;
  67.     m_progressX = scale (m_progress);
  68.     if (!m_error && !successful)
  69.     {
  70.         m_error = true;
  71.         x = 1;
  72.     }
  73.     paintStep (x, m_progressX);
  74. }
  75. // Map from steps to display units
  76. int ProgressBar::scale (int value)
  77. {
  78.     if (m_total > 0)
  79.         return max (1, value * (m_bounds.Width () - 1) / m_total);
  80.     return value;
  81. }
  82. // Reset the progress bar
  83. void ProgressBar::reset ()
  84. {
  85.     m_progressX     = 1;
  86.     m_progress      = 0;
  87.     m_error         = false;
  88.     m_baseWindow->RedrawWindow (m_bounds);
  89.     m_baseWindow->UpdateWindow ();
  90. }