含百分比数字进度条的设计
一、功能说明
重绘MFC进度条,以数字百分比形式显示进度
二、重写CProgressCtrl类
Myprogressctrl.h
#if !defined(AFX_MYPROGRESSCTRL_H__3069A5BB_5A36_4D4E_B1E3_F703B1F98467__INCLUDED_)
#define AFX_MYPROGRESSCTRL_H__3069A5BB_5A36_4D4E_B1E3_F703B1F98467__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000// CMyProgressCtrl windowclass CMyProgressCtrl : public CProgressCtrl
{public:CMyProgressCtrl();virtual ~CMyProgressCtrl();// Generated message map functions
protected://{{AFX_MSG(CMyProgressCtrl)afx_msg void OnPaint();//}}AFX_MSGDECLARE_MESSAGE_MAP()
};#endif // !defined(AFX_MYPROGRESSCTRL_H__3069A5BB_5A36_4D4E_B1E3_F703B1F98467__INCLUDED_)
Myprogressctrl.cpp
// MyProgressCtrl.cpp : implementation file
//#include "stdafx.h"
#include "Myprogressctrl.h"// CMyProgressCtrlCMyProgressCtrl::CMyProgressCtrl()
{}CMyProgressCtrl::~CMyProgressCtrl()
{}BEGIN_MESSAGE_MAP(CMyProgressCtrl, CProgressCtrl)//{{AFX_MSG_MAP(CMyProgressCtrl)ON_WM_PAINT()//}}AFX_MSG_MAP
END_MESSAGE_MAP()COLORREF GetColor(int nPos, int nMax)
{BYTE r1 = 101, g1 = 162, b1 = 225;BYTE r2 = 82, g2 = 134, b2 = 185;if(nPos < nMax/2){nMax = nMax/2;BYTE r = r1 + (r2-r1)*nPos/nMax;BYTE g = g1 + (g2-g1)*nPos/nMax;BYTE b = b1 + (b2-b1)*nPos/nMax;return RGB(r,g,b);}nMax = nMax/2;nPos -= nMax;BYTE r = r2 - (r2-r1)*nPos/nMax;BYTE g = g2 - (g2-g1)*nPos/nMax;BYTE b = b2 - (b2-b1)*nPos/nMax;return RGB(r,g,b);
}// CMyProgressCtrl message handlersvoid CMyProgressCtrl::OnPaint()
{CPaintDC dc(this); // device context for painting// TODO: Add your message handler code hereCRect cRect;GetClientRect(cRect);CString sPos;int nLower,nUpper;CRect rcRange = cRect;GetRange(nLower,nUpper);if(nUpper - nLower > 0){sPos.Format(_T("%d%%"),100*GetPos()/(nUpper-nLower) );rcRange.right = (int)(rcRange.left + rcRange.Width() * (double)GetPos()/(nUpper-nLower));}else{sPos = "0%";dc.FillSolidRect(cRect, GetSysColor(COLOR_3DFACE));dc.Draw3dRect(cRect, RGB(0,0,0), RGB(0,0,0));dc.SetBkMode(TRANSPARENT);dc.DrawText(sPos, cRect, DT_CENTER);return;}CDC memDC,memDC2;CBitmap bmp,bmp2;bmp.CreateCompatibleBitmap(&dc,cRect.Width(),cRect.Height());memDC.CreateCompatibleDC(&dc);memDC.SelectObject(&bmp);bmp2.CreateCompatibleBitmap(&dc,cRect.Width(),cRect.Height());memDC2.CreateCompatibleDC(&dc);memDC2.SelectObject(&bmp2);memDC2.FillSolidRect(cRect, RGB(255,0,0)); //底色用RGB(255,0,0)memDC2.FillSolidRect(rcRange, RGB(0,255,255)); //已完成的进度用RGB(0,255,255)填充memDC.FillSolidRect(cRect, RGB(0,0,0));memDC.SetBkMode(TRANSPARENT);memDC.SetTextColor(RGB(255,0,0));memDC.DrawText(sPos, cRect, DT_CENTER|DT_VCENTER|DT_SINGLELINE); //memDC中现在是黑底红字//SRCPAINT是OR操作, 所以现在memDC2中, 落在已完成进度区域内的字是白色(0|255, 255|255, 255|255), 落在未完成区域内的字和底色融为一体了(255|255, 0|0, 0|0)。memDC2.BitBlt(0, 0, cRect.Width(), cRect.Height(), &memDC, 0, 0, SRCPAINT); memDC.FillSolidRect(cRect, RGB(255,0,0));//把已完成部分的底色RGB(0,255,255)设为透明色,现在memDC中只剩下红底白字了。//memDC.TransparentBlt(0,0,cRect.Width(),cRect.Height(),&memDC2,0,0,cRect.Width(),cRect.Height(),RGB(0,255,255));TransparentBlt(memDC.m_hDC,0,0,cRect.Width(),cRect.Height(),memDC2.m_hDC,0,0,cRect.Width(),cRect.Height(),RGB(0,255,255));memDC2.FillSolidRect(cRect, GetSysColor(COLOR_3DFACE));memDC2.SetBkMode(TRANSPARENT);memDC2.SetTextColor(RGB(0,0,0));memDC2.DrawText(sPos, cRect, DT_CENTER|DT_VCENTER|DT_SINGLELINE); //用黑色绘制文字//绘制已完成进度的进度条,完成后覆盖了已完成区域内的黑色文字for(int i=rcRange.top; i<rcRange.bottom; i++){CPen pen, *pOldPen;pen.CreatePen(PS_SOLID, 1, GetColor(i-rcRange.top, rcRange.Height()));pOldPen = memDC2.SelectObject(&pen);memDC2.MoveTo(rcRange.left, i);memDC2.LineTo(rcRange.right, i);memDC2.SelectObject(pOldPen);}//把memDC中的白字部分叠加到memDC2中,完成进度条绘制。 //memDC2.TransparentBlt(0,0,cRect.Width(),cRect.Height(),&memDC,0,0,cRect.Width(),cRect.Height(),RGB(255,0,0));TransparentBlt(memDC2.m_hDC,0,0,cRect.Width(),cRect.Height(),memDC.m_hDC,0,0,cRect.Width(),cRect.Height(),RGB(255,0,0));memDC2.Draw3dRect(0, 0, cRect.Width(), cRect.Height(), RGB(0,0,0), RGB(0,0,0));dc.BitBlt(0,0,cRect.Width(),cRect.Height(),&memDC2,0,0,SRCCOPY);memDC2.DeleteDC();memDC.DeleteDC();bmp.DeleteObject();bmp2.DeleteObject();// Do not call CProgressCtrl::OnPaint() for painting messages
}
// 关闭对话框
EndDialog(IDCANCEL);
含百分比数字进度条的设计相关推荐
- html百分比代码怎么写,参考Bootstrap写的一个带百分比的进度条(附源码)
最近需要写一个进度条的效果,网上找了一些,但都不能完美的实现需求. 于是就自己改造了一个,效果如下图: 因为动态图太大,我上传到 GitHub 了,就不在博客上再上传了. 百分比跟随进度条移动,百分比 ...
- c语言电量百分比程序,C语言实现的百分比加进度条的显示程序
项目中需要设计一个远程设备升级程序,程序优化时想在数字显示升级进度的同时用类似wget的进度条的形式显示升级进度,于是写了一个简单的数字+进度条显示升级进度的程序,以下为程序的核心部分,以达到抛砖引玉 ...
- atitit. 文件上传带进度条 atiUP 设计 java c# php
atitit. 文件上传带进度条atiUP设计java c# php 1. 设计要求 1 2. 原理and架构 1 3. ui 2 4. spring mvc 2 5. springMVC.xml 3 ...
- 数字进度条组件NumberProgressBar
数字进度条组件NumberProgressBar NumberProgressBar是一款数字进度条组件.它不仅可以通过进度条的变化展现进度,还可以通过跟随文字精确表示进度值.开发者可以对进度条进行 ...
- java如何画百分比圆环_canvas绘制百分比圆环进度条
开发项目,PM会跟踪项目进度:完成某个事情,也可以设置一个完成的进度. 这里用canvas绘制一个简单百分比圆环进度条. 看下效果: 1. 动画方式 2. 静默方式 贴上代码,仅供参考 /** * L ...
- ajax加载进度百分比,在ajax中显示加载百分比的进度条,php
您好我正在使用ajax加载数据库内容.我想显示加载或图像的总百分比.在ajax中显示加载百分比的进度条,php 这是我的脚本 function name1(str) { if (str.length= ...
- java 下载文件 进度条_使用处理程序下载文件时显示百分比的进度条
我想在按钮上单击下载 .EXE 文件并在网页上显示下载进度条而不是浏览器进度条 . 这个开发背后的想法是浏览器在他的下载管理器中隐藏它的下载进度条 . 我想在下载达到100%后自动运行.EXE . 我 ...
- Tableau百分比完成进度条制作
- 创意进度条设计-12个优秀作品分享【附实例分析】
本文分享了12个创意进度条设计,多为Dribble上的作品,点击图片即可查看原作品,同时附上了案例分析-蜗牛进度条的设计步骤,希望能对你有帮助. 什么叫进度条? 进度条即计算机在处理任务时,实时的,以 ...
最新文章
- PyTorch模型量化工具学习
- 30张图 讲述真实的人性
- 【控制】《多无人机协同控制技术》周伟老师-第7章-基于多模型预测控制的无人机编队运动控制策略
- Ubuntu16.04搭建caffe环境(cpu-only)与Python调用
- 15.枚举enum.rs
- .net 导出excel_Qt编写的项目作品18-数据导出到Excel及Pdf和打印数据
- 【数据结构与算法】森林版并查集V1.0的Java实现
- 周鸿祎IOT发布会思考
- auto_cmdb--01之models.py建表
- ZooKeeper(三) 什么是分布式锁以及使用Redis手写实现
- 文言色彩的客套话之感想
- 机器人机构学基础(朱大昌)第二章部分习题答案
- 阿里云的应用(day02)
- 独立开发的基于springboot + websocket IM网站聊天系统总结
- JPA设置表名和实体名,表字段与实体字段的对应
- 关于本科期间参加人工智能方向竞赛的建议
- uniapp从开发App到上架应用市场需要经历什么?
- php zip解压,php解压缩zip和rar压缩包文件
- 学习成绩 =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。(C语言版)
- Android平台使用-谷歌广告联盟AdMob-赚取收益的编程方法
热门文章
- smart NAT和full-coneNAT的配置以及应用场景
- windows script host 无法找到脚本文件 estm.vbs
- java 应用 知乎_GitHub - liangsonghua/zhihu: JAVA仿知乎与redis应用
- Redis(11)----Redis客户端
- BFS算法之求单源最短路径
- 二级MySQL,未来教育MySQL题库,15套试卷,sql题答案。
- Web表单的十九个最佳设计实践
- DataTables+Ajax分页简单应用
- 命令行模拟post请求
- Linux安装Redis并且修改端口号,redis-6.2.2