自绘CProgressCtrl进度条控件,支持自定义显示文本和进程百分比信息
- // CXProgressCtrl 头文件
- #pragma once
- // CXProgressCtrl
- class CXProgressCtrl : public CProgressCtrl
- {
- DECLARE_DYNAMIC(CXProgressCtrl)
- public:
- CXProgressCtrl();
- virtual ~CXProgressCtrl();
- typedef enum _ALIGN_TEXT_
- {
- ALIGN_LEFT = 0x00,
- ALIGN_CENTER,
- ALIGN_RIGHT
- }ALIGN_TEXT;
- public:
- inline void SetBarColor(COLORREF clr)
- {
- m_clrBarColor = clr;
- }
- inline COLORREF GetBarColor()
- {
- return m_clrBarColor;
- }
- inline void SetBarBkColor(COLORREF clr)
- {
- m_clrBarBkColor = clr;
- }
- inline COLORREF GetBarBkColor()
- {
- return m_clrBarBkColor;
- }
- inline void SetTextColor(COLORREF clr)
- {
- m_clrTextColor = clr;
- }
- inline COLORREF GetTextColor()
- {
- return m_clrTextColor;
- }
- inline void SetTextBkColor(COLORREF clr)
- {
- m_clrTextBkColor = clr;
- }
- inline COLORREF GetTextBkColor()
- {
- return m_clrTextBkColor;
- }
- inline void SetTextAlign(ALIGN_TEXT AlignText)
- {
- m_AlignText = AlignText;
- }
- inline ALIGN_TEXT GetTextAlign()
- {
- return m_AlignText;
- }
- inline void ShowPercent(BOOL bShowPercent = TRUE)
- {
- m_bShowPercent = bShowPercent;
- }
- inline BOOL IsShowPercent()
- {
- return m_bShowPercent;
- }
- protected:
- COLORREF m_clrBarColor;
- COLORREF m_clrBarBkColor;
- COLORREF m_clrTextColor;
- COLORREF m_clrTextBkColor;
- ALIGN_TEXT m_AlignText;
- BOOL m_bShowPercent;
- CFont m_font; // Only for vertical style
- protected:
- afx_msg BOOL OnEraseBkgnd(CDC* pDC);
- afx_msg void OnPaint();
- DECLARE_MESSAGE_MAP()
- };
- // CXProgressCtrl .CPP文件
- // XProgressCtrl.cpp : implementation file
- //
- #include "stdafx.h"
- #include "Demo.h"
- #include "XProgressCtrl.h"
- // CXProgressCtrl
- IMPLEMENT_DYNAMIC(CXProgressCtrl, CProgressCtrl)
- CXProgressCtrl::CXProgressCtrl() : m_clrTextColor(RGB(0, 0, 0)),
- m_clrTextBkColor(RGB(255, 255, 255)),
- m_clrBarColor(RGB(128, 128, 255)),
- m_clrBarBkColor(RGB(235, 235, 235)),
- m_AlignText(ALIGN_CENTER),
- m_bShowPercent(TRUE)
- {
- }
- CXProgressCtrl::~CXProgressCtrl()
- {
- if(m_font.GetSafeHandle())
- {
- m_font.DeleteObject();
- }
- }
- BEGIN_MESSAGE_MAP(CXProgressCtrl, CProgressCtrl)
- ON_WM_ERASEBKGND()
- ON_WM_PAINT()
- END_MESSAGE_MAP()
- // CXProgressCtrl message handlers
- BOOL CXProgressCtrl::OnEraseBkgnd(CDC *pDC)
- {
- return TRUE;
- }
- void CXProgressCtrl::OnPaint()
- {
- CPaintDC paintDC(this);
- int nMin = 0;
- int nMax = 0;
- GetRange(nMin, nMax);
- ASSERT(nMin <= nMax);
- int nPos = GetPos();
- ASSERT(nPos >= nMin && nPos <= nMax);
- DWORD dwStyle = GetStyle();
- BOOL bVertical = FALSE;
- if(dwStyle & PBS_VERTICAL)
- {
- bVertical = TRUE;
- }
- CDC dc;
- dc.CreateCompatibleDC(&paintDC);
- ASSERT(dc.GetSafeHdc());
- CRect rect;
- GetClientRect(&rect);
- CBitmap bmp;
- bmp.CreateCompatibleBitmap(&paintDC, rect.Width(), rect.Height());
- ASSERT(bmp.GetSafeHandle());
- CBitmap* pOldBitmap = (CBitmap*)dc.SelectObject(&bmp);
- CFont* pOldFont = NULL;
- CWnd* pParent = GetParent();
- ASSERT(pParent);
- CFont* pFont = pParent->GetFont();
- ASSERT(pFont);
- if(bVertical)
- {
- if(NULL == m_font.GetSafeHandle())
- {
- LOGFONT lf = {0};
- pFont->GetLogFont(&lf);
- lf.lfEscapement = 900;
- m_font.CreateFontIndirect(&lf);
- }
- ASSERT(m_font.GetSafeHandle());
- pOldFont = (CFont*)dc.SelectObject(&m_font);
- }
- else
- {
- pOldFont = (CFont*)dc.SelectObject(pFont);
- }
- double dPercent = (double)(nPos - nMin) / ((double)(nMax - nMin));
- dc.DrawEdge(rect, EDGE_SUNKEN, BF_RECT | BF_FLAT);
- CRect rc(rect);
- rc.DeflateRect(CSize(2, 2));
- dc.FillSolidRect(&rc, m_clrBarBkColor);
- CString strText(_T(""));
- GetWindowText(strText);
- if(m_bShowPercent)
- {
- strText.AppendFormat(_T("%d%% "), static_cast<int>((dPercent * 100.0) + 0.5));
- }
- dc.SetBkMode(TRANSPARENT);
- dc.SetTextColor(m_clrTextColor);
- CPoint pt(0, 0);
- CSize size = dc.GetOutputTextExtent(strText);
- if(!bVertical)
- {
- switch(m_AlignText)
- {
- case ALIGN_LEFT:
- pt.x = rc.left;
- break;
- case ALIGN_RIGHT:
- pt.x = rc.right - size.cx;
- break;
- case ALIGN_CENTER:
- default:
- pt.x = rc.left + (rc.Width() - size.cx) / 2;
- break;
- }
- pt.y = rc.top + (rc.Height() - size.cy) / 2;
- CRect rcPos(rc);
- rcPos.right = rcPos.left + (int)(dPercent * rcPos.Width());
- dc.FillSolidRect(rcPos, m_clrBarColor);
- dc.SetTextColor(m_clrTextColor);
- dc.ExtTextOut(pt.x, pt.y, ETO_OPAQUE, rcPos, strText, NULL);
- dc.SetTextColor(m_clrTextBkColor);
- dc.ExtTextOut(pt.x, pt.y, ETO_CLIPPED, &rcPos, strText, NULL);
- }
- else
- {
- switch(m_AlignText)
- {
- case ALIGN_LEFT:
- pt.y = rc.bottom;
- break;
- case ALIGN_RIGHT:
- pt.y = rc.top + size.cx;
- break;
- case ALIGN_CENTER:
- default:
- pt.y = rc.bottom - (rc.Height() - size.cx) / 2;
- break;
- }
- pt.x = rc.left + (rc.Width() - size.cy) / 2;
- CRect rcPos(rc);
- rcPos.top = rcPos.bottom - (int)(dPercent * rcPos.Height());
- dc.FillSolidRect(rcPos, m_clrBarColor);
- dc.SetTextColor(m_clrTextColor);
- dc.ExtTextOut(pt.x, pt.y, ETO_OPAQUE, rcPos, strText, NULL);
- dc.SetTextColor(m_clrTextBkColor);
- dc.ExtTextOut(pt.x, pt.y, ETO_CLIPPED, &rcPos, strText, NULL);
- }
- paintDC.BitBlt(rect.left, rect.top ,rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);
- dc.SelectObject(pOldFont);
- dc.SelectObject(pOldBitmap);
- bmp.DeleteObject();
- dc.DeleteDC();
- }
效果图如下所示:

http://blog.csdn.net/visualeleven/article/details/6165007
自绘CProgressCtrl进度条控件,支持自定义显示文本和进程百分比信息的更多相关文章
- CProgressCtrl进度条控件实现进度滚动效果
关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 实现这个效果的函数为SetMarquee(_In_ BOOL ...
- 为OLED屏添加GUI支持6:进度条控件
为OLED屏添加GUI支持6:进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...
- Photoshop和WPF双剑配合,打造炫酷个性的进度条控件
现在如果想打造一款专业的App,UI的设计和操作的简便性相当重要.UI设计可以借助Photoshop或者AI等设计工具,之前了解到WPF设计工具Expression Blend可以直接导入PSD文件或 ...
- HslControls组件库 工业控件库 曲线控件 时间控件 管道控件 温度计控件 阀门控件 传送带控件 进度条控件 电池控件 数码管控件等等
本篇博客主要对 HslControls 组件做一个大概的总览介绍,更详细的内容可以参照页面里的子链接,还有github上的源代码,然后进行相关的学习,和使用. Prepare 先从nuget下载到组件 ...
- 示例:WPF中Slider控件封装的缓冲播放进度条控件
原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...
- Qt编写自定义控件32-等待进度条控件
一.前言 在各种各样的执行任务界面,有时候需要比较多的时间,需要给出一个直观的等待进度条表示当前正在执行的进度,而不至于懵逼在那里,用户不会觉得程序死了还是干嘛了. 等待进度条有好几种办法,比如直接叫 ...
- [转载]ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- 用 CALayer 定制下载进度条控件
// // RPProgressView.h // CALayer定制下载进度条控件 // // Created by RinpeChen on 16/1/2. // Copyright © 2016 ...
- ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件
本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...
随机推荐
- [Android Training视频系列] 8.2 Managing Audio Focus
视频讲解:http://www.eyeandroid.com/thread-15896-1-1.html 由于很多应用程序都可以播放音频,因此在播放前考虑它们如何交互就显得很重要了,为了避免同时出现多 ...
- 卷积神经网络CNN介绍:结构框架,源码理解【转】
1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表 ...
- 怎么用PHP发送HTTP请求(转载)
本文转自:http://blog.snsgou.com/blog/161.html file_get_contents版本: /** * 发送post请求 * @param string $url ...
- 关于网站IIS日志分析搜索引擎爬虫说明
正文:iis默认的日志文件在C:\WINDOWS\system32\LogFiles中,下面是Seoer惜缘的服务器日志,通过查看,就可以了解搜索引擎蜘蛛爬行经过,如: 2008-08-19 00:0 ...
- MySQL高可用读写分离方案预研
目前公司有需求做MySQL高可用读写分离,网上搜集了不少方案,都不尽人意,下面是我结合现有组件拼凑的实现方案,亲测已满足要求,希望各位多提建议 :) 一. 网上方案整理(搜集地址不详...) 1 ...
- 基于word制作网站webhelp
处理问题描述:现在我有个javaweb项目,需要在portal上面点击help即可打开: 当前搜索百度(谷歌不能用了),没有找到更好的解决方案,自己想了个比较简单实用的方法,仅供参考: 设计原理:利用 ...
- PHP图形图像处理之初识GD库
d=====( ̄▽ ̄*)b 引语 php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF.PNG.JPEG.WBMP.XBM等. php还可以将图像流直接显示在浏览器中. 要处 ...
- gvim config
配置文件在根目录下 _vimrc set nocompatible source $VIMRUNTIME/vimrc_example.vim source $VIMRUNTIME/mswin.vim ...
- 看我是一只IT小小鸟有感
当我看了<我是一只IT小小鸟>后,有许多的感想.就像许多作者一样,在接触计算机这个专业时都有许多的抱怨,对这个专业的不了解,对这个专业不知道从何学起有深深的无助感,对这个专业在未来的发展有 ...
- bzoj 1270 DP
w[i,j]代表高度j,第i颗树的时候的最大值 那么w[i,j]:=max(w[i,j+1],w[k,j+heigh])+sum[i,j]: 但是这样枚举是n^3的,我们发现转移的第二个选择w[k,j ...