once CGradientProgressCtrl : CProgressCtrl { CGradientProgressCtrl() ; ~CGradientProgressCtrl() ; SetPos( nPos) ; SetStep( nStep) ; SetRange( nLower, nUpper) ; SetText( * pText, BOOL bRepaint TRUE) ; ShowPercent(BOOL bShowPercent TRUE) { m_bShowPercent bShowPercent; } ShowText(BOOL bShowText TRUE) { m_bShowText bShowText; } COLORREF GetTextColor() { m_clrText ; } COLORREF GetBkColor() { m_clrBkGround ; } COLORREF GetStartColor() { m_clrStart ; } COLORREF GetEndColor() { m_clrEnd ; } SetStartColor(COLORREF color) { m_clrStart color ; } SetEndColor(COLORREF color) { m_clrEnd color ; } SetTextColor(COLORREF color) { m_clrText color ; } SetBkColor(COLORREF color) { m_clrBkGround color ; m_BKGroundBrush.DeleteObject(); m_BKGroundBrush.CreateSolidBrush(m_clrBkGround); } Draw(CPaintDC* pDC, RECT& rectClient, & nMaxWidth); afx_msg OnPaint(); DECLARE_MESSAGE_MAP() m_nLower ; m_nUpper ; m_nStep ; m_nCurPos ; COLORREF m_clrStart ; COLORREF m_clrEnd ; COLORREF m_clrBkGround ; COLORREF m_clrText ; BOOL m_bShowPercent ; BOOL m_bShowText ; m_Text[] ; m_Percent[] ; CBrush m_BKGroundBrush ; CBrush m_TempBrush ; CMemDC : CDC { CMemDC(CDC* pDC):CDC() { ASSERT(pDC NULL); m_pDC pDC; m_pOldBitmap NULL; m_bMemDC !pDC>IsPrinting(); (m_bMemDC) { pDC>GetClipBox(&m_rect); CreateCompatibleDC(pDC); m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height()); m_pOldBitmap SelectObject(&m_bitmap); SetWindowOrg(m_rect.left, m_rect.top); } { m_bPrinting pDC>m_bPrinting; m_hDC pDC>m_hDC; m_hAttribDC pDC>m_hAttribDC; } } ~CMemDC() { (m_bMemDC) { m_pDC>BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), , m_rect.left, m_rect.top, SRCCOPY ); SelectObject(m_pOldBitmap); } { m_hDC m_hAttribDC NULL; } } CMemDC* >() { ; } CMemDC*() { ; } CBitmap m_bitmap; CBitmap* m_pOldBitmap; CDC* m_pDC; CRect m_rect; BOOL m_bMemDC; }; };
CGradientProgressCtrl::CGradientProgressCtrl() { m_nLower ; m_nUpper ; m_nCurPos ; m_nStep ; m_clrStart COLORREF(RGB(, , )) ; m_clrEnd COLORREF(RGB(, , )) ; m_clrBkGround ::GetSysColor(COLOR_3DFACE) ; m_clrText COLORREF(RGB(, , )) ; m_bShowPercent TRUE ; m_bShowText TRUE ; m_BKGroundBrush.CreateSolidBrush(m_clrBkGround) ; memset(m_Text, , ); } CGradientProgressCtrl::~CGradientProgressCtrl() { m_BKGroundBrush.DeleteObject(); } BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl) ON_WM_PAINT() END_MESSAGE_MAP() CGradientProgressCtrl::SetRange( nLower, nUpper) { m_nLower nLower ; m_nUpper nUpper ; m_nCurPos nLower ; CProgressCtrl::SetRange(nLower, nUpper); CProgressCtrl::SetPos(nLower); } CGradientProgressCtrl::SetStep( nStep) { m_nStep nStep; (CProgressCtrl::SetStep(nStep)); } CGradientProgressCtrl::SetPos( nPos) { m_nCurPos nPos; (CProgressCtrl::SetPos(nPos)); } CGradientProgressCtrl::SetText( * pText, BOOL bRepaint) { strcpy(m_Text, pText); (bRepaint && m_bShowText) { Invalidate(TRUE); } ; } CGradientProgressCtrl::OnPaint() { CPaintDC dc(); RECT rectClient; GetClientRect(&rectClient); (m_nCurPos < m_nLower m_nCurPos > m_nUpper) { dc.FillRect(&rectClient, &m_BKGroundBrush); ; } maxWidth(() m_nCurPos /() m_nUpper*() rectClient.right); Draw(&dc, rectClient, () maxWidth); dc.SetTextColor(m_clrText); dc.SetBkMode(TRANSPARENT); HGDIOBJ hOldFont ::SelectObject(dc.m_hDC, ::GetStockObject(DEFAULT_GUI_FONT)); (m_bShowPercent) { sprintf(m_Percent, ,() ( * () m_nCurPos / m_nUpper)); dc.DrawText(m_Percent, &rectClient, DT_VCENTER DT_CENTER DT_SINGLELINE); } (m_bShowText) { rectClient.left (rectClient.left rectClient.right) / ; dc.DrawText(m_Text, &rectClient, DT_VCENTER DT_CENTER DT_SINGLELINE); } ::SelectObject(dc.m_hDC, hOldFont); } CGradientProgressCtrl::Draw(CPaintDC* pDC, RECT& rectClient, & nMaxWidth) { RECT rectFill; fStep; CMemDC memDC(pDC); r, g, b; rStep, gStep, bStep; r (GetRValue(m_clrEnd) GetRValue(m_clrStart)); g (GetGValue(m_clrEnd) GetGValue(m_clrStart)); b (GetBValue(m_clrEnd) GetBValue(m_clrStart)); nSteps max(abs(r), max(abs(g), abs(b))); fStep () rectClient.right / () nSteps; rStep r / () nSteps; gStep g / () nSteps; bStep b / () nSteps; r GetRValue(m_clrStart); g GetGValue(m_clrStart); b GetBValue(m_clrStart); ( iOnBand ; iOnBand < nSteps; iOnBand) { ::SetRect(&rectFill, () (iOnBand * fStep), , () ((iOnBand ) * fStep), rectClient.bottom ); VERIFY(m_TempBrush.CreateSolidBrush(RGB(r rStep * iOnBand, g gStep * iOnBand, b bStep * iOnBand))); memDC.FillRect(&rectFill, &m_TempBrush); VERIFY(m_TempBrush.DeleteObject()); (rectFill.right > nMaxWidth) { ::SetRect(&rectFill, rectFill.right, , rectClient.right, rectClient.bottom); VERIFY(m_TempBrush.CreateSolidBrush(m_clrBkGround)); memDC.FillRect(&rectFill, &m_TempBrush); VERIFY(m_TempBrush.DeleteObject()); ; } } }