#include "stdafx.h"
#include "ProgressBar.h"
// Paint the progress bar in response to a paint message
void ProgressBar::paint (CDC& dc)
{
paintBackground (dc);
paintStatus (dc);
}
// Paint the background of the progress bar region
void ProgressBar::paintBackground (CDC& dc)
{
CBrush brshBackground;
CPen penGray (PS_SOLID, 1, RGB (128, 128, 128));
CPen penWhite (PS_SOLID, 1, RGB (255, 255, 255));
VERIFY (brshBackground.CreateSolidBrush (::GetSysColor (COLOR_BTNFACE)));
dc.FillRect (m_bounds, &brshBackground);
CPen *pOldPen;
pOldPen = dc.SelectObject (&penGray);
{
dc.MoveTo (m_bounds.left, m_bounds.top);
dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top);
dc.MoveTo (m_bounds.left, m_bounds.top);
dc.LineTo (m_bounds.left, m_bounds.top + m_bounds.Height () -1);
}
dc.SelectObject (&penWhite);
{
dc.MoveTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top);
dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top + m_bounds.Height () -1);
dc.MoveTo (m_bounds.left, m_bounds.top + m_bounds.Height () -1);
dc.LineTo (m_bounds.left + m_bounds.Width () -1, m_bounds.top + m_bounds.Height () -1);
}
dc.SelectObject (pOldPen);
}
// Paint the actual status of the progress bar
void ProgressBar::paintStatus (CDC& dc)
{
if (m_progress <= 0)
return;
CBrush brshStatus;
CRect rect (m_bounds.left, m_bounds.top,
m_bounds.left + m_progressX, m_bounds.bottom);
COLORREF statusColor = getStatusColor ();
VERIFY (brshStatus.CreateSolidBrush (statusColor));
rect.DeflateRect (1, 1);
dc.FillRect (rect, &brshStatus);
}
// Paint the current step
void ProgressBar::paintStep (int startX, int endX)
{
// kludge: painting the whole region on each step
m_baseWindow->RedrawWindow (m_bounds);
m_baseWindow->UpdateWindow ();
}
// Setup the progress bar for execution over a total number of steps
void ProgressBar::start (int total)
{
m_total = total;
reset ();
}
// Take one step, indicating whether it was a successful step
void ProgressBar::step (bool successful)
{
m_progress++;
int x = m_progressX;
m_progressX = scale (m_progress);
if (!m_error && !successful)
{
m_error = true;
x = 1;
}
paintStep (x, m_progressX);
}
// Map from steps to display units
int ProgressBar::scale (int value)
{
if (m_total > 0)
return max (1, value * (m_bounds.Width () - 1) / m_total);
return value;
}
// Reset the progress bar
void ProgressBar::reset ()
{
m_progressX = 1;
m_progress = 0;
m_error = false;
m_baseWindow->RedrawWindow (m_bounds);
m_baseWindow->UpdateWindow ();
}