分享
 
 
 

简单封装的一个彩色进度条【原创】

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

简单封装的一个彩色进度条【原创】

//=========================================================

//

// Copyright (c) 2000-2004 iWise Technologies,Co. Ltd.

// All Rights Reserved.

//

// Product: iW988

// File: GradientProgressCtrl.h

// Created: 天衣有缝

//

// Description:2004.12.28 20:12:00

// ValueAdded main program for iW988.

// Contact:

// waterpub@mail.csdn.net

//

//=========================================================

#pragma once

class CGradientProgressCtrl : public CProgressCtrl

{

public:

CGradientProgressCtrl() ; // 构造

virtual ~CGradientProgressCtrl() ; // 析构

int SetPos(int nPos) ; // 设置位置

int SetStep(int nStep) ; // 设置步进值

void SetRange(int nLower, int nUpper) ; // 设置范围

int SetText(const char * pText, BOOL bRepaint = TRUE) ; // 设置显示文字

public:

void ShowPercent(BOOL bShowPercent = TRUE) { m_bShowPercent = bShowPercent; } // 显示百分比

void ShowText(BOOL bShowText = TRUE) { m_bShowText = bShowText; } // 显示文字

public:

COLORREF GetTextColor(void) { return m_clrText ; } // 取得字体颜色

COLORREF GetBkColor(void) { return m_clrBkGround ; } // 取得背景颜色

COLORREF GetStartColor(void) { return m_clrStart ; } // 取得开始颜色

COLORREF GetEndColor(void) { return m_clrEnd ; } // 取得结束颜色

void SetStartColor(COLORREF color) { m_clrStart = color ; } // 设置字体颜色

void SetEndColor(COLORREF color) { m_clrEnd = color ; } // 设置背景颜色

void SetTextColor(COLORREF color) { m_clrText = color ; } // 设置开始颜色

void SetBkColor(COLORREF color) // 设置结束颜色

{

m_clrBkGround = color ;

m_BKGroundBrush.DeleteObject();

m_BKGroundBrush.CreateSolidBrush(m_clrBkGround);

}

private:

void Draw(CPaintDC* pDC, const RECT& rectClient, const int& nMaxWidth);

afx_msg void OnPaint();

DECLARE_MESSAGE_MAP()

private:

// 变量定义

int m_nLower ; // 最小值

int m_nUpper ; // 最大值

int m_nStep ; // 步进值

int m_nCurPos ; // 当前值

COLORREF m_clrStart ; // 起始颜色

COLORREF m_clrEnd ; // 结束颜色

COLORREF m_clrBkGround ; // 背景颜色

COLORREF m_clrText ; // 文本颜色

BOOL m_bShowPercent ; // 显示百分比

BOOL m_bShowText ; // 显示文字

char m_Text[32] ; // 文字:如显示拷贝速度

char m_Percent[4] ; // 文字:百分比

CBrush m_BKGroundBrush ; // 背景刷子

CBrush m_TempBrush ; // 临时刷子

private:

// 内嵌类

class CMemDC : public CDC // 内存设备环境

{

public:

CMemDC(CDC* pDC):CDC()

{

ASSERT(pDC != NULL);

m_pDC = pDC;

m_pOldBitmap = NULL;

m_bMemDC = !pDC->IsPrinting();

// 图形设备还是打印机设备

if (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);

}

else //为相关的现有设备准备打印

{

m_bPrinting = pDC->m_bPrinting;

m_hDC = pDC->m_hDC;

m_hAttribDC = pDC->m_hAttribDC;

}

}

virtual ~CMemDC()

{

if (m_bMemDC)

{

m_pDC->BitBlt(m_rect.left,

m_rect.top,

m_rect.Width(),

m_rect.Height(),

this,

m_rect.left,

m_rect.top,

SRCCOPY

);

SelectObject(m_pOldBitmap);

}

else

{

m_hDC = m_hAttribDC = NULL;

}

}

CMemDC* operator->()

{

return this;

}

operator CMemDC*()

{

return this;

}

private:

CBitmap m_bitmap;

CBitmap* m_pOldBitmap; //

CDC* m_pDC; //

CRect m_rect; //

BOOL m_bMemDC; //

};

};

//=========================================================

//

// Copyright (c) 2000-2004 iWise Technologies,Co. Ltd.

// All Rights Reserved.

//

// Product: iW988

// File: GradientProgressCtrl.cpp

// Created: 天衣有缝

//

// Description:

// ValueAdded main program for iW988.

// Contact:

// waterpub@mail.csdn.net

//

//=========================================================

#include "stdafx.h"

#include "GradientProgressCtrl.h"

CGradientProgressCtrl::CGradientProgressCtrl()

{

// 控件初始化

m_nLower = 0 ;

m_nUpper = 100 ;

m_nCurPos = 0 ;

m_nStep = 1 ;

// 初始化显示颜色

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)) ;

// 显示百分比,文字

m_bShowPercent = TRUE ;

m_bShowText = TRUE ;

m_BKGroundBrush.CreateSolidBrush(m_clrBkGround) ;

memset(m_Text, 0, 32);

}

CGradientProgressCtrl::~CGradientProgressCtrl()

{

m_BKGroundBrush.DeleteObject();

}

BEGIN_MESSAGE_MAP(CGradientProgressCtrl, CProgressCtrl)

ON_WM_PAINT()

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CGradientProgressCtrl 消息处理程序

void CGradientProgressCtrl::SetRange(int nLower, int nUpper)

{

// 设置进度条的范围

m_nLower = nLower ;

m_nUpper = nUpper ;

m_nCurPos = nLower ;

CProgressCtrl::SetRange(nLower, nUpper);

CProgressCtrl::SetPos(nLower);

}

int CGradientProgressCtrl::SetStep(int nStep)

{

// 设置步进值

m_nStep = nStep;

return (CProgressCtrl::SetStep(nStep));

}

int CGradientProgressCtrl::SetPos(int nPos)

{

// 设置进度条位置

m_nCurPos = nPos;

return (CProgressCtrl::SetPos(nPos));

}

int CGradientProgressCtrl::SetText(const char * pText, BOOL bRepaint)

{

// 显示的文字

strcpy(m_Text, pText);

if (bRepaint && m_bShowText)

{

Invalidate(TRUE);

}

return 0;

}

void CGradientProgressCtrl::OnPaint()

{

CPaintDC dc(this); // 设备环境

// TODO: 重画进度条

RECT rectClient;

GetClientRect(&rectClient);

if (m_nCurPos <= m_nLower || m_nCurPos > m_nUpper)

{

// 不在范围之内直接以背景色填充

dc.FillRect(&rectClient, &m_BKGroundBrush);

return;

}

// 绘制进度条本身

float maxWidth((float) m_nCurPos /(float) m_nUpper*(float) rectClient.right);

Draw(&dc, rectClient, (int) maxWidth);

// 文字显示

dc.SetTextColor(m_clrText);

dc.SetBkMode(TRANSPARENT);

HGDIOBJ hOldFont = ::SelectObject(dc.m_hDC, ::GetStockObject(DEFAULT_GUI_FONT));

if (m_bShowPercent)

{

// 显示进程条百分比

sprintf(m_Percent, "%d%% ",(int) (100 * (float) m_nCurPos / m_nUpper));

dc.DrawText(m_Percent, &rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);

}

if (m_bShowText)

{

// 显示进程条文字

rectClient.left = (rectClient.left + rectClient.right) / 2;

dc.DrawText(m_Text, &rectClient, DT_VCENTER | DT_CENTER | DT_SINGLELINE);

}

::SelectObject(dc.m_hDC, hOldFont);

// 不要调用 CProgressCtrl::OnPaint()

}

void CGradientProgressCtrl::Draw(CPaintDC* pDC, const RECT& rectClient, const int& nMaxWidth)

{

RECT rectFill; //显示区域

float fStep; //每一步的幅宽

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, (int) (iOnBand * fStep), 0,// 填充矩形区域的左上角x,y和右下角x,y

(int) ((iOnBand + 1) * fStep), rectClient.bottom + 1);

VERIFY(m_TempBrush.CreateSolidBrush(RGB(r + rStep * iOnBand,

g + gStep * iOnBand,

b + bStep * iOnBand)));

memDC.FillRect(&rectFill, &m_TempBrush);

VERIFY(m_TempBrush.DeleteObject());

//在结束绘制之前,使用背景色填充乘下的的客户区域

if (rectFill.right > nMaxWidth)

{

::SetRect(&rectFill, rectFill.right, 0, rectClient.right,

rectClient.bottom);

VERIFY(m_TempBrush.CreateSolidBrush(m_clrBkGround));

memDC.FillRect(&rectFill, &m_TempBrush);

VERIFY(m_TempBrush.DeleteObject());

return;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有