亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gradientprogressctrl.cpp

?? 包截獲源碼
?? CPP
字號:

#include "stdafx.h"
#include "GradientProgressCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/*
Modified by 徐景周 2000.12
功能:漸變色進度條顯示效果
*/

/////////////////////////////////////////////////////////////////////////////
// CGradientProgressCtrl

CGradientProgressCtrl::CGradientProgressCtrl()
{
	// Defaults assigned by CProgressCtrl()
	m_nLower = 0;
	m_nUpper = 100;
	m_nCurrentPosition = 0;
	m_nStep = 10;	
	
	// Initial colors
	m_clrStart	= COLORREF(RGB(255, 0,0));
	m_clrEnd =	 COLORREF(RGB(0,0,255));
	//改變漸變色進度條背景色
	m_clrBkGround = ::GetSysColor(COLOR_3DFACE);
	m_clrText = COLORREF(RGB(255, 255, 255));

	// Initial show percent
	m_bShowPercent = true;
}

CGradientProgressCtrl::~CGradientProgressCtrl()
{
}


BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)
	//{{AFX_MSG_MAP(CGradientProgressCtrl)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGradientProgressCtrl message handlers

/////////////////////////////////////////////////////////////////////////////
/* 
	OnPaint

	The main drawing routine.  Consists of two parts
	(1) Call the DrawGradient routine to draw the visible part of the progress gradient
	(2) If needed, show the percentage text

 */
/////////////////////////////////////////////////////////////////////////////
void CGradientProgressCtrl::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	// TODO: Add your message handler code here
	CRect rectClient;
	GetClientRect(&rectClient);
	// If the current positionis  invalid then we should fade into the  background
	if (m_nCurrentPosition <= m_nLower || m_nCurrentPosition > m_nUpper)
	{
		CRect rect;
		GetClientRect(rect);
		CBrush brush;
		//重畫時漸變色進度條設為自定義顏色
		brush.CreateSolidBrush(m_clrBkGround);//::GetSysColor(COLOR_3DFACE));
		dc.FillRect(&rect, &brush);
		VERIFY(brush.DeleteObject());
		return;
	}
	
	// The actions to take depend on whether or not we are a vertical control
	DWORD dwStyles = GetStyle();
	BOOL bVertical = (BOOL)(dwStyles & PBS_VERTICAL);
	
	
	// Figure out what part should be visible so we can stop the gradient when needed
	float maxWidth;
	if (bVertical)
		maxWidth = ((float)m_nCurrentPosition/(float)m_nUpper * (float)rectClient.bottom);		
	else
		maxWidth = ((float)m_nCurrentPosition/(float)m_nUpper * (float)rectClient.right);
	
	
	// Draw the gradient
		DrawGradient(&dc, rectClient, (int)maxWidth, bVertical);

	// Show percent indicator if needed
	if (m_bShowPercent)
	{
		CString strPercent;
		float fp = 100.0f; 
		fp *= (float)(m_nCurrentPosition-m_nLower); 
		fp /= (float)(m_nUpper-m_nLower); 
		strPercent.Format(_T("%3.0f %%"), fp);
		
		dc.SetTextColor(m_clrText);
		dc.SetBkMode(TRANSPARENT);
		dc.DrawText(strPercent, &rectClient, DT_VCENTER |  DT_CENTER | DT_SINGLELINE);
	}

	// Do not call CProgressCtrl::OnPaint() for painting messages
}


/////////////////////////////////////////////////////////////////////////////
/*
	SetRange

	Overridden base class member to remember where the indicator thinks 
	it is and the boundary range of the control.

	Params
		nLower		lower bound
		nUpper		uppoer bound

*/
/////////////////////////////////////////////////////////////////////////////
void CGradientProgressCtrl:: SetRange(int nLower, int nUpper)
{
	m_nLower = nLower;
	m_nUpper = nUpper;
	m_nCurrentPosition = nLower;
	CProgressCtrl::SetRange(nLower, nUpper);
}

/////////////////////////////////////////////////////////////////////////////
/*

	SetRange32

	Overridden base class member to remember where the indicator thinks 
	it is and the boundary range of the control.

	Params
		nLower		lower bound
		nUpper		uppoer bound

*/
/////////////////////////////////////////////////////////////////////////////
void CGradientProgressCtrl:: SetRange32( int nLower, int nUpper )
{
	m_nLower = nLower;
	m_nUpper = nUpper;
	m_nCurrentPosition = nLower;
	CProgressCtrl::SetRange(nLower, nUpper);
}


/////////////////////////////////////////////////////////////////////////////
/*
	SetPos

	Overridden base class member to retain where the current progress indicator
	is located.

	Params
		nPos		Current position in range

*/
/////////////////////////////////////////////////////////////////////////////
int CGradientProgressCtrl:: SetPos(int nPos)
{
	m_nCurrentPosition = nPos;
	return (CProgressCtrl::SetPos(nPos));
}

/////////////////////////////////////////////////////////////////////////////
/*
	SetStep

	Overridden base class member to retain the step interval used when 
	filling the progress control

	Params
		nStep		step interval for filling progress control

*/
/////////////////////////////////////////////////////////////////////////////
int CGradientProgressCtrl:: SetStep(int nStep)
{
	m_nStep = nStep;
	return (CProgressCtrl::SetStep(nStep));
}

/////////////////////////////////////////////////////////////////////////////
/*
	StepIt

	Overridden base class member to increment the control according to the
	current position and the step interval

	Params
		nStep		step interval for filling progress control

*/
/////////////////////////////////////////////////////////////////////////////
int CGradientProgressCtrl:: StepIt(void)
{
	m_nCurrentPosition += m_nStep;
	return (CProgressCtrl::StepIt());
}


/////////////////////////////////////////////////////////////////////////////
/*
	DrawGradient

	Called from OnPaint, it does most of the work of filling in the client 
	rectangle with the appropriate colors.  The normal routine would fill
	the entire client rectangle, but we truncate the drawing to reflect
	the current position in the progress control

	Params
		pDC			pointer to CPaintDC for rendering
		rectClient	client rectangle where we should draw
		nMaxWidth	where we should stop drawing the gradient
*/
/////////////////////////////////////////////////////////////////////////////
void CGradientProgressCtrl::DrawGradient(CPaintDC *pDC, const RECT &rectClient, const int &nMaxWidth, const BOOL &bVertical)
{
	RECT rectFill;			   // Rectangle for filling band
	float fStep;              // How wide is each band?
	CBrush brush;			// Brush to fill in the bar	

	
	CMemDC1 memDC(pDC);

	// First find out the largest color distance between the start and end colors.  This distance
	// will determine how many steps we use to carve up the client region and the size of each
	// gradient rect.
	int r, g, b;					// First distance, then starting value
	float rStep, gStep, bStep;		// Step size for each color
		
	BOOL  bSameColor = FALSE;		// Handle case if start color == end color

	// Get the color differences
	r = (GetRValue(m_clrEnd) - GetRValue(m_clrStart));
	g = (GetGValue(m_clrEnd) - GetGValue(m_clrStart));
	b =  (GetBValue(m_clrEnd) - GetBValue(m_clrStart));

	// Check to see if colors are same
	if((r == 0) && (g == 0) && (b == 0))
	{
		bSameColor = TRUE;
		//Added the three lines below to fix the drawing 
		//problem which used to occur when both the start 
		//and end colors are same.
		r = GetRValue(m_clrStart);
		g = GetGValue(m_clrStart);
		b = GetBValue(m_clrStart);
	}

	int nSteps;
	//Select max. possible value for nSteps if the colors are equal
	if(bSameColor && m_clrStart == 0)
		nSteps = 255;
	else 	// Make the number of steps equal to the greatest distance
		nSteps = max(abs(r), max(abs(g), abs(b)));	
	
	// Determine how large each band should be in order to cover the
	// client with nSteps bands (one for every color intensity level)
	if (bVertical)
		fStep = (float)rectClient.bottom / (float)nSteps;	
	else
		fStep = (float)rectClient.right / (float)nSteps;

	// Calculate the step size for each color
	rStep = r/(float)nSteps;
	gStep = g/(float)nSteps;
	bStep = b/(float)nSteps;

	// Reset the colors to the starting position
	r = GetRValue(m_clrStart);
	g = GetGValue(m_clrStart);
	b = GetBValue(m_clrStart);
	
	// Start filling bands
	for (int iOnBand = 0; iOnBand < nSteps; iOnBand++) 
	{
		// Fill the vertical control
		if (bVertical)
		{
			::SetRect(&rectFill,
						0,							// Upper left X
						(int)(iOnBand * fStep),		// Upper left Y
						rectClient.right+1,		// Lower right X
						(int)((iOnBand+1) * fStep));// Lower right Y
		
			// CDC::FillSolidRect is faster, but it does not handle 8-bit color depth
			VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand, g + gStep*iOnBand, b + bStep *iOnBand)));
			memDC.FillRect(&rectFill,&brush);
			VERIFY(brush.DeleteObject());


			// If we are past the maximum for the current position we need to get out of the loop.
			// Before we leave, we repaint the remainder of the client area with the background color.
			if (rectFill.bottom > nMaxWidth)
			{
				::SetRect(&rectFill, 0, rectFill.bottom, rectClient.right, rectClient.bottom);
				VERIFY(brush.CreateSolidBrush(m_clrBkGround));
				memDC.FillRect(&rectFill, &brush);
				VERIFY(brush.DeleteObject());
				return;
			}
		}

		else // Fill the horizontal control
		{
			::SetRect(&rectFill,
						(int)(iOnBand * fStep),     // Upper left X
						 0,							// Upper left Y
						(int)((iOnBand+1) * fStep), // Lower right X
						rectClient.bottom+1);		// Lower right Y
		
			// CDC::FillSolidRect is faster, but it does not handle 8-bit color depth
			VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand, g + gStep*iOnBand, b + bStep *iOnBand)));
			memDC.FillRect(&rectFill,&brush);
			VERIFY(brush.DeleteObject());


			// If we are past the maximum for the current position we need to get out of the loop.
			// Before we leave, we repaint the remainder of the client area with the background color.
			if (rectFill.right > nMaxWidth)
			{
				::SetRect(&rectFill, rectFill.right, 0, rectClient.right, rectClient.bottom);
				VERIFY(brush.CreateSolidBrush(m_clrBkGround));
				memDC.FillRect(&rectFill, &brush);
				VERIFY(brush.DeleteObject());
				return;
			}
		}

	}
}



/////////////////////////////////////////////////////////////////////////////
/*
	OnEraseBkgnd

	Overridden CWnd function so that all drawing is done in the OnPaint call.
	We return TRUE so that CWnd doesn't try to erase our background.

	Params
		pDC			pointer to CDC for rendering
*/
/////////////////////////////////////////////////////////////////////////////
BOOL CGradientProgressCtrl::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩在线一区二区三区视频| 国产精品视频九色porn| 制服丝袜中文字幕一区| 波多野结衣欧美| 久久99久久久欧美国产| 男男gaygay亚洲| 天天综合网 天天综合色| 一区二区三区高清不卡| 一区二区三区加勒比av| 一区二区三区蜜桃| 亚洲成人av福利| 日韩电影免费一区| 狠狠色丁香久久婷婷综合_中| 久久99久久精品欧美| 精品一区免费av| 高清不卡在线观看| 91在线观看美女| 欧美性videosxxxxx| 欧美蜜桃一区二区三区| 日韩欧美一卡二卡| 国产精品美女视频| 亚洲高清中文字幕| 久久国产精品一区二区| 成人小视频在线| 在线视频一区二区免费| 欧美一区二区观看视频| 26uuu国产电影一区二区| 国产欧美日韩另类一区| 亚洲精品久久久蜜桃| 免费高清视频精品| 99久久久免费精品国产一区二区| 色婷婷国产精品综合在线观看| 国产超碰在线一区| 欧美影视一区二区三区| 欧美精品一区二区三区久久久| 亚洲色图另类专区| 狠狠色综合色综合网络| 91在线小视频| 欧美一级理论性理论a| 国产精品久久毛片av大全日韩| 夜夜嗨av一区二区三区中文字幕| 精品一区二区三区在线观看| 色综合久久久久综合99| 久久这里只有精品视频网| 一区二区三区在线观看动漫 | 欧美精品乱码久久久久久| 26uuu亚洲| 日韩av电影免费观看高清完整版| 波多野洁衣一区| 日韩精品一区二区三区视频在线观看 | 国产精品白丝av| 欧美在线观看禁18| 国产清纯白嫩初高生在线观看91 | 2023国产精品自拍| 视频精品一区二区| 99久久久免费精品国产一区二区| 欧美mv日韩mv国产| 香蕉影视欧美成人| 欧美日韩色一区| 国产精品久久久久一区二区三区| 久久99九九99精品| 欧美日韩精品一区二区三区四区 | 日韩影院在线观看| eeuss鲁片一区二区三区| 91精品国产综合久久福利软件| 亚洲乱码日产精品bd| 国产91对白在线观看九色| 日韩欧美国产麻豆| 亚洲成av人片在线观看| 91色视频在线| 亚洲欧美另类久久久精品| av一区二区三区在线| 欧美国产日本视频| 成人三级伦理片| 国产精品久久三| 97精品超碰一区二区三区| 久久噜噜亚洲综合| 国产99一区视频免费| 亚洲国产精品ⅴa在线观看| 日韩和欧美的一区| 在线播放一区二区三区| 亚洲精品一卡二卡| 国产99久久久国产精品潘金| 国产欧美一区二区精品仙草咪 | 久久久精品免费观看| 国产伦精品一区二区三区免费迷| 国产福利不卡视频| 国产精品久久久久精k8| 99国内精品久久| 一区二区三区四区视频精品免费| 色悠久久久久综合欧美99| 一区二区在线免费| 欧美三级中文字| 麻豆精品在线播放| 国产精品私人影院| 欧美一a一片一级一片| 日韩二区在线观看| 国产免费成人在线视频| 色婷婷久久综合| 丝袜亚洲另类丝袜在线| 久久蜜桃av一区精品变态类天堂| 不卡一卡二卡三乱码免费网站| 亚洲激情图片小说视频| 日韩一区二区在线观看视频播放| 国产一区二区按摩在线观看| 亚洲欧洲日韩综合一区二区| 欧美日韩视频在线观看一区二区三区| 理论电影国产精品| 国产精品传媒在线| 欧美成人精品1314www| www.激情成人| 日本伊人色综合网| 亚洲私人黄色宅男| 精品久久久网站| 欧美性猛片xxxx免费看久爱| 久久99热这里只有精品| 亚洲精品国产无套在线观| 精品久久久久久久人人人人传媒| 成人开心网精品视频| 日韩在线一区二区三区| 中文字幕一区不卡| 久久久久久综合| 国产色产综合色产在线视频| 欧美综合在线视频| 成人动漫av在线| 国产在线不卡一区| 五月综合激情网| 亚洲色图欧美在线| 国产人成亚洲第一网站在线播放 | 久久99九九99精品| 亚洲一区av在线| 国产精品久久久久久亚洲毛片| 欧美一区二区三区喷汁尤物| 成人av第一页| 美女脱光内衣内裤视频久久影院| 国产精品无码永久免费888| 日韩视频一区二区在线观看| 97se亚洲国产综合自在线 | **性色生活片久久毛片| 精品国产免费一区二区三区香蕉| 欧美日韩精品一区二区三区| 不卡高清视频专区| 国产精品资源网站| 日韩精品久久理论片| 亚洲综合区在线| 国产精品久久久久aaaa樱花| 欧美韩国日本综合| 欧美国产精品久久| 国产精品久久久久桃色tv| 国产精品视频yy9299一区| 欧美激情一区不卡| 中文字幕不卡在线观看| 精品粉嫩aⅴ一区二区三区四区| 制服丝袜成人动漫| 日韩三级在线观看| 精品美女在线观看| 日韩欧美视频在线| 精品国产一区二区三区久久影院| 欧美老肥妇做.爰bbww| 91精品国产乱| 精品国产凹凸成av人导航| 欧美成人一区二区三区片免费| 精品久久国产老人久久综合| 亚洲精品在线电影| 国产午夜一区二区三区| 国产精品每日更新在线播放网址| 国产精品你懂的在线| 成人免费在线观看入口| 一区二区三区中文字幕精品精品 | 欧美丝袜自拍制服另类| 国产91色综合久久免费分享| 国产高清不卡二三区| 99精品一区二区| 欧美色欧美亚洲另类二区| 69堂成人精品免费视频| 亚洲精品一区二区精华| 亚洲国产精品av| 亚洲在线中文字幕| 久久99久久99精品免视看婷婷| 岛国精品在线播放| 欧美亚洲国产怡红院影院| 日韩欧美成人一区| 国产精品女人毛片| 日韩av不卡一区二区| 国产91精品免费| 欧美乱妇23p| 亚洲国产精品高清| 日韩精彩视频在线观看| 国产一区二区三区久久悠悠色av| 99天天综合性| 日韩免费视频一区二区| 亚洲欧美在线视频| 久久精品国内一区二区三区| 99久久婷婷国产综合精品电影| 91精品久久久久久久91蜜桃| 亚洲永久免费视频| 国产精品综合一区二区三区| 在线免费av一区| 中文字幕av在线一区二区三区| 亚洲一二三区不卡|