簡單封裝的一個彩色進度條【原創】















 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());
			;
		}
	}
}
 
發佈了41 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章