// TextProgressCtrl.cpp : implementation file // // Written by Chris Maunder (cmaunder@mail.com) // Copyright 1998. // // TextProgressCtrl is a drop-in replacement for the standard // CProgressCtrl that displays text in a progress control. // // This code may be used in compiled form in any way you desire. This // file may be redistributed by any means PROVIDING it is not sold for // profit without the authors written consent, and providing that this // notice and the authors name is included. If the source code in // this file is used in any commercial application then an email to // the me would be nice. // // This file is provided "as is" with no expressed or implied warranty. // The author accepts no liability if it causes any damage to your // computer or anything else vaguely within it's vicinity. // // Expect bugs. // // Please use and enjoy. Please let me know of any bugs/mods/improvements // that you have found/implemented and I will fix/incorporate them into this // file. // Modified by Philip Oldaker 2000 #include "stdafx.h" #include "TextProgressCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CTextProgressCtrl,CUIODColumnCtrl) ///////////////////////////////////////////////////////////////////////////// // CTextProgressCtrl CTextProgressCtrl::CTextProgressCtrl() { m_nPos = 0; m_nStepSize = 1; m_nMax = 100; m_nMin = 0; m_bShowText = TRUE; m_crBarClr = CLR_DEFAULT; m_crBgClr = CLR_DEFAULT; m_crTextClr = CLR_DEFAULT; m_crSelBarClr = CLR_DEFAULT; m_crSelBgClr = CLR_DEFAULT; m_crSelTextClr = CLR_DEFAULT; } CTextProgressCtrl::~CTextProgressCtrl() { } void CTextProgressCtrl::DoPaint(CDC *PaintDC,CRect rcClient,bool bSelected) { if (m_nMin >= m_nMax) return; bool bInvert=bSelected; COLORREF crBarColour = (m_crBarClr == CLR_DEFAULT)? RGB(10,20,200) : m_crBarClr; COLORREF crBgColour = (m_crBgClr == CLR_DEFAULT)? ::GetSysColor(COLOR_MENU) : m_crBgClr; COLORREF crTextColor = (m_crTextClr == CLR_DEFAULT)? ::GetSysColor(COLOR_BTNTEXT) : m_crTextClr; if (bSelected) { if (m_crSelBarClr != CLR_DEFAULT) { crBarColour = m_crSelBarClr; bInvert = false; } if (m_crSelBgClr != CLR_DEFAULT) { crBgColour = m_crSelBgClr; bInvert = false; } if (m_crSelTextClr != CLR_DEFAULT) { crTextColor = m_crSelTextClr; bInvert = false; } } double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin)); CDC &dc = *PaintDC; dc.Rectangle(rcClient.left+1,rcClient.top+1,rcClient.right-1,rcClient.bottom-1); rcClient.DeflateRect(2,2); CRect LeftRect(rcClient); CRect RightRect(rcClient); LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction); RightRect.left = LeftRect.right; dc.FillSolidRect(LeftRect, crBarColour); dc.FillSolidRect(RightRect, crBgColour); // Draw Text if not vertical if (m_bShowText) { CString str; if (m_strText.GetLength()) str = m_strText; else str.Format(_T("%d%%"), (int)(Fraction*100.0)); CSize sz = dc.GetTextExtent(str); int nTextPos = 0; if (rcClient.Width() > sz.cx) nTextPos = (rcClient.Width() - sz.cx) / 2; if (!bSelected && LeftRect.Width() >= nTextPos) { dc.SetTextColor(RGB(255,255,255)); } else dc.SetTextColor(crTextColor); dc.SetBkMode(TRANSPARENT); DWORD dwTextStyle = DT_CENTER | DT_VCENTER | DT_SINGLELINE; dc.DrawText(str, rcClient, dwTextStyle); } if (bInvert) { dc.InvertRect(rcClient); } } ///////////////////////////////////////////////////////////////////////////// // CTextProgressCtrl operations void CTextProgressCtrl::SetShowText(BOOL bShow) { m_bShowText = bShow; } void CTextProgressCtrl::SetRange(int nLower, int nUpper) { m_nMax = nUpper; m_nMin = nLower; } void CTextProgressCtrl::GetRange(int& nLower, int& nUpper) const { nUpper = m_nMax; nLower = m_nMin; } int CTextProgressCtrl::SetPos(int nPos) { int nOldPos = m_nPos; m_nPos = nPos; return nOldPos; } int CTextProgressCtrl::StepIt() { return SetPos(m_nPos + m_nStepSize); } int CTextProgressCtrl::OffsetPos(int nPos) { return SetPos(m_nPos + nPos); } int CTextProgressCtrl::SetStep(int nStep) { int nOldStep = m_nStepSize; m_nStepSize = nStep; return nOldStep; } COLORREF CTextProgressCtrl::SetBarColor(COLORREF crBarClr /*= CLR_DEFAULT*/,COLORREF crSelBarClr /*= CLR_DEFAULT*/) { COLORREF crOldBarClr = m_crBarClr; m_crBarClr = crBarClr; m_crSelBarClr = crSelBarClr; return crOldBarClr; } COLORREF CTextProgressCtrl::GetBarColor() const { return m_crBarClr; } COLORREF CTextProgressCtrl::GetSelBarColor() const { return m_crSelBarClr; } COLORREF CTextProgressCtrl::SetBgColor(COLORREF crBgClr /*= CLR_DEFAULT*/,COLORREF crSelBgClr /*= CLR_DEFAULT*/) { COLORREF crOldBgClr = m_crBgClr; m_crBgClr = crBgClr; m_crSelBgClr = crSelBgClr; return crOldBgClr; } COLORREF CTextProgressCtrl::GetBgColor() const { return m_crBgClr; } COLORREF CTextProgressCtrl::GetSelBgColor() const { return m_crSelBgClr; } COLORREF CTextProgressCtrl::SetTextColor(COLORREF crTextClr /*= CLR_DEFAULT*/,COLORREF crSelTextClr /*= CLR_DEFAULT*/) { COLORREF crOldTextClr = m_crTextClr; m_crTextClr = crTextClr; m_crSelTextClr = crSelTextClr; return crOldTextClr; } COLORREF CTextProgressCtrl::GetTextColor() const { return m_crTextClr; } COLORREF CTextProgressCtrl::GetSelTextColor() const { return m_crSelTextClr; }