// GradientProgressCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "GradientProgressCtrl.h"
#include "MemDC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGradientProgressCtrl
CGradientProgressCtrl::CGradientProgressCtrl()
{
int i;
m_dwStyle = GPBS_HORIZONTAL;
for(i=0; i<GPBS_MAXDETAIL; i++){
m_bDetail[i] = FALSE;
}
m_nLower=0;
m_nUpper=100;
m_nCurrentPosition=0;
m_nStep=10;
//Initial Color of show
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));
//Not show Word
m_bShowPercent=FALSE;
}
CGradientProgressCtrl::~CGradientProgressCtrl()
{
}
BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)
//{{AFX_MSG_MAP(CGradientProgressCtrl)
ON_WM_ERASEBKGND()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGradientProgressCtrl message handlers
void CGradientProgressCtrl::SetRange(int nLower,int nUpper)
{
//This Function is to Set Range of the progress
m_nLower=nLower;
m_nUpper=nUpper;
if (m_dwStyle == GPBS_DETAIL) {
m_nLower = 0;
if (m_nUpper>GPBS_MAXDETAIL) {
m_nUpper = GPBS_MAXDETAIL;
}
}
m_nCurrentPosition=nLower;
CProgressCtrl::SetRange(nLower,nUpper);
}
int CGradientProgressCtrl::SetStep(int nStep)
{
m_nStep=nStep;
return (CProgressCtrl::SetStep(nStep));
}
BOOL CGradientProgressCtrl::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;//CProgressCtrl::OnEraseBkgnd(pDC);
}
void CGradientProgressCtrl::DrawGradient(CPaintDC *pDC, const RECT &rectClient, const int &nMaxWidth)
{
RECT rectFill; //显示区域
float fStep; //每一步的幅宽
CBrush brush; //显示的颜色画刷
CMemDC memDC(pDC);
int r,g,b;
float rStep,gStep,bStep;
//得到不同颜色并相减,返回颜色之间的最大差值
r=(GetRValue(m_clrEnd)-GetRValue(m_clrStart));
g=(GetGValue(m_clrEnd)-GetGValue(m_clrStart));
b=(GetBValue(m_clrEnd)-GetBValue(m_clrStart));
//使进程条显示的总数 等于最大的颜色差值
int nSteps=max(abs(r),max(abs(g),abs(b)));
//确定每一颜色填充多大的矩形区域
fStep=(float)rectClient.right/(float)nSteps;
//设置每一颜色填充的步数
rStep=r/(float)nSteps;
gStep=g/(float)nSteps;
bStep=b/(float)nSteps;
r=GetRValue(m_clrStart);
g=GetGValue(m_clrStart);
b=GetBValue(m_clrStart);
//绘制颜色渐变的进程条
for(int iOnBand=0;iOnBand<nSteps;iOnBand++)
{
::SetRect(&rectFill,
//以下为填充矩形区域的左上角x,y和右下角x,y
(int)(iOnBand*fStep),
0,
(int)((iOnBand+1)*fStep),
rectClient.bottom+1);
VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand,g+gStep*iOnBand,b+bStep*iOnBand)));
memDC.FillRect(&rectFill,&brush);
VERIFY(brush.DeleteObject());
//在结束绘制之前,使用背景色填充乘下的的客户区域
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;
}
}
}
void CGradientProgressCtrl::DrawGradientVertical(CPaintDC *pDC,const RECT& rectClient,const int & nMaxWidth)
{
RECT rectFill; //显示区域
float fStep; //每一步的幅宽
CBrush brush; //显示的颜色画刷
CMemDC memDC(pDC);
int r,g,b;
float rStep,gStep,bStep;
//得到不同颜色并相减,返回颜色之间的最大差值
r=(GetRValue(m_clrEnd)-GetRValue(m_clrStart));
g=(GetGValue(m_clrEnd)-GetGValue(m_clrStart));
b=(GetBValue(m_clrEnd)-GetBValue(m_clrStart));
//使进程条显示的总数 等于最大的颜色差值
int nSteps=max(abs(r),max(abs(g),abs(b)));
//确定每一颜色填充多大的矩形区域
fStep=(float)rectClient.bottom/(float)nSteps;
//设置每一颜色填充的步数
rStep=r/(float)nSteps;
gStep=g/(float)nSteps;
bStep=b/(float)nSteps;
r=GetRValue(m_clrStart);
g=GetGValue(m_clrStart);
b=GetBValue(m_clrStart);
//绘制颜色渐变的进程条
for(int iOnBand=0;iOnBand<nSteps;iOnBand++)
{
::SetRect(&rectFill,
//以下为填充矩形区域的左上角x,y和右下角x,y
0,
rectClient.bottom - (int)((iOnBand+1)*fStep),
rectClient.right,
rectClient.bottom - (int)(iOnBand*fStep)
);
VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand,g+gStep*iOnBand,b+bStep*iOnBand)));
memDC.FillRect(&rectFill,&brush);
VERIFY(brush.DeleteObject());
//在结束绘制之前,使用背景色填充乘下的的客户区域
if((rectClient.bottom - rectFill.top) >nMaxWidth)
{
::SetRect(&rectFill,rectClient.left,rectClient.top,rectFill.left,rectFill.top);
VERIFY(brush.CreateSolidBrush(m_clrBkGround));
memDC.FillRect(&rectFill,&brush);
VERIFY(brush.DeleteObject());
break;
}
}
VERIFY(brush.CreateSolidBrush(m_clrEnd));
::SetRect(&rectFill,rectClient.left+1,rectClient.bottom/2,rectClient.right-1,rectClient.bottom/2+1);
memDC.FillRect(&rectFill,&brush);
VERIFY(brush.DeleteObject());
return;
}
void CGradientProgressCtrl::DrawGradientDetail(CPaintDC *pDC, const RECT &rectClient)
{
RECT rectFill; //显示区域
float fStep; //每一步的幅宽
CBrush brush; //显示的颜色画刷
CMemDC memDC(pDC);
int nSteps;
//使进程条显示的总数 等于元素数
nSteps=m_nUpper;
//确定每一颜色填充多大的矩形区域
fStep=(float)rectClient.right/(float)nSteps;
//绘制细节进程条
for(int iOnBand=0;iOnBand<nSteps;iOnBand++)
{
::SetRect(&rectFill,
//以下为填充矩形区域的左上角x,y和右下角x,y
(int)(iOnBand*fStep),0,(int)((iOnBand+1)*fStep),rectClient.bottom
);
if (iOnBand == m_nCurrentPosition) { //使用背景色填充当前位值元素区域
VERIFY(brush.CreateSolidBrush(m_clrBkGround));
}else if (m_bDetail[iOnBand]) {
VERIFY(brush.CreateSolidBrush(m_clrStart));
}else {
VERIFY(brush.CreateSolidBrush(m_clrEnd));
}
memDC.FillRect(&rectFill,&brush);
VERIFY(brush.DeleteObject());
}
return;
}
void CGradientProgressCtrl::OnPaint()
{
float maxWidth;
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if(m_nCurrentPosition<m_nLower||m_nCurrentPosition>m_nUpper || m_nUpper<= m_nLower)
{
CRect rect;
GetClientRect(rect);
CBrush brush;
brush.CreateSolidBrush(::GetSysColor(COLOR_3DFACE));
dc.FillRect(&rect,&brush);
VERIFY(brush.DeleteObject());
return;
}
CRect rectClient;
GetClientRect(rectClient);
switch(m_dwStyle) {
case GPBS_VERTICAL:
maxWidth = ((float)m_nCurrentPosition/(float)(m_nUpper-m_nLower)*(float)rectClient.bottom);
//绘制
DrawGradientVertical(&dc,rectClient,(int)maxWidth);
break;
case GPBS_HORIZONTAL:
maxWidth = ((float)m_nCurrentPosition/(float)(m_nUpper-m_nLower)*(float)rectClient.right);
//绘制
DrawGradient(&dc,rectClient,(int)maxWidth);
break;
case GPBS_DETAIL:
DrawGradientDetail(&dc,rectClient);
break;
default:
;
}
//显示进程条进度文字
if(m_bShowPercent)
{
CString percent;
percent.Format("%d%%",(int)(100*(float)m_nCurrentPosition/m_nUpper));
dc.SetTextColor(m_clrText);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(percent,&rectClient,DT_VCENTER|DT_CENTER|DT_SINGLELINE);
percent.Empty();
}
// Do not call CProgressCtrl::OnPaint() for painting messages
}
int CGradientProgressCtrl::SetPos(int nPos)
{
//Set the Position of the Progress
m_nCurrentPosition=nPos;
return (CProgressCtrl::SetPos(nPos));
}
int CGradientProgressCtrl::SetStyle(DWORD style)
{
switch(style) {
case GPBS_HORIZONTAL:
m_dwStyle = style;
break;
case GPBS_VERTICAL:
m_dwStyle = style;
break;
case GPBS_DETAIL:
m_dwStyle = style;
m_nStep=1;
break;
default:
return -1;
break;
}
return style;
}
int CGradientProgressCtrl::SetDet
GradientProgressCtrl.rar_GradientProgressCtrl_渐变色 进度条
版权申诉
36 浏览量
2022-09-23
09:01:27
上传
评论
收藏 3KB RAR 举报
Kinonoyomeo
- 粉丝: 77
- 资源: 1万+
最新资源
- tensorflow-gpu-2.5.0-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-gpu-2.5.2-cp39-cp39-manylinux2010-x86-64.whl
- 内含方正小标宋简体、仿宋-Gb2312、黑体、楷体、宋体,五个公文常用字体
- 记忆卡牌游戏源码及可运行文件
- 利用wps的js宏编写的一键格式修改辅助工具
- 基于matlab实现训练RBF网络的,但用的算法是梯度下降法,算法仍然是自己写的.rar
- 基于matlab实现小波分析改造后,可以分析脑电数据的程序,出现32个导联每个通道的功率谱.rar
- 基于matlab实现物体的应力和应变DIC-通过识别一系列图像的变形得到物体的应力和应变
- 基于matlab实现文档+程序NSGA-II多目标优化的matlab代码.rar
- 基于matlab实现文档+程序 多目标优化,NSGA2算法实现.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈