1. // CXProgressCtrl 头文件
  2. #pragma once
  3. // CXProgressCtrl
  4. class CXProgressCtrl : public CProgressCtrl
  5. {
  6. DECLARE_DYNAMIC(CXProgressCtrl)
  7. public:
  8. CXProgressCtrl();
  9. virtual ~CXProgressCtrl();
  10. typedef enum _ALIGN_TEXT_
  11. {
  12. ALIGN_LEFT = 0x00,
  13. ALIGN_CENTER,
  14. ALIGN_RIGHT
  15. }ALIGN_TEXT;
  16. public:
  17. inline void SetBarColor(COLORREF clr)
  18. {
  19. m_clrBarColor = clr;
  20. }
  21. inline COLORREF GetBarColor()
  22. {
  23. return m_clrBarColor;
  24. }
  25. inline void SetBarBkColor(COLORREF clr)
  26. {
  27. m_clrBarBkColor = clr;
  28. }
  29. inline COLORREF GetBarBkColor()
  30. {
  31. return m_clrBarBkColor;
  32. }
  33. inline void SetTextColor(COLORREF clr)
  34. {
  35. m_clrTextColor = clr;
  36. }
  37. inline COLORREF GetTextColor()
  38. {
  39. return m_clrTextColor;
  40. }
  41. inline void SetTextBkColor(COLORREF clr)
  42. {
  43. m_clrTextBkColor = clr;
  44. }
  45. inline COLORREF GetTextBkColor()
  46. {
  47. return m_clrTextBkColor;
  48. }
  49. inline void SetTextAlign(ALIGN_TEXT AlignText)
  50. {
  51. m_AlignText = AlignText;
  52. }
  53. inline ALIGN_TEXT GetTextAlign()
  54. {
  55. return m_AlignText;
  56. }
  57. inline void ShowPercent(BOOL bShowPercent = TRUE)
  58. {
  59. m_bShowPercent = bShowPercent;
  60. }
  61. inline BOOL IsShowPercent()
  62. {
  63. return m_bShowPercent;
  64. }
  65. protected:
  66. COLORREF m_clrBarColor;
  67. COLORREF m_clrBarBkColor;
  68. COLORREF m_clrTextColor;
  69. COLORREF m_clrTextBkColor;
  70. ALIGN_TEXT m_AlignText;
  71. BOOL m_bShowPercent;
  72. CFont m_font; // Only for vertical style
  73. protected:
  74. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  75. afx_msg void OnPaint();
  76. DECLARE_MESSAGE_MAP()
  77. };
  1. // CXProgressCtrl .CPP文件
  2. // XProgressCtrl.cpp : implementation file
  3. //
  4. #include "stdafx.h"
  5. #include "Demo.h"
  6. #include "XProgressCtrl.h"
  7. // CXProgressCtrl
  8. IMPLEMENT_DYNAMIC(CXProgressCtrl, CProgressCtrl)
  9. CXProgressCtrl::CXProgressCtrl() : m_clrTextColor(RGB(0, 0, 0)),
  10. m_clrTextBkColor(RGB(255, 255, 255)),
  11. m_clrBarColor(RGB(128, 128, 255)),
  12. m_clrBarBkColor(RGB(235, 235, 235)),
  13. m_AlignText(ALIGN_CENTER),
  14. m_bShowPercent(TRUE)
  15. {
  16. }
  17. CXProgressCtrl::~CXProgressCtrl()
  18. {
  19. if(m_font.GetSafeHandle())
  20. {
  21. m_font.DeleteObject();
  22. }
  23. }
  24. BEGIN_MESSAGE_MAP(CXProgressCtrl, CProgressCtrl)
  25. ON_WM_ERASEBKGND()
  26. ON_WM_PAINT()
  27. END_MESSAGE_MAP()
  28. // CXProgressCtrl message handlers
  29. BOOL CXProgressCtrl::OnEraseBkgnd(CDC *pDC)
  30. {
  31. return TRUE;
  32. }
  33. void CXProgressCtrl::OnPaint()
  34. {
  35. CPaintDC paintDC(this);
  36. int nMin = 0;
  37. int nMax = 0;
  38. GetRange(nMin, nMax);
  39. ASSERT(nMin <= nMax);
  40. int nPos = GetPos();
  41. ASSERT(nPos >= nMin && nPos <= nMax);
  42. DWORD dwStyle = GetStyle();
  43. BOOL bVertical = FALSE;
  44. if(dwStyle & PBS_VERTICAL)
  45. {
  46. bVertical = TRUE;
  47. }
  48. CDC dc;
  49. dc.CreateCompatibleDC(&paintDC);
  50. ASSERT(dc.GetSafeHdc());
  51. CRect rect;
  52. GetClientRect(&rect);
  53. CBitmap bmp;
  54. bmp.CreateCompatibleBitmap(&paintDC, rect.Width(), rect.Height());
  55. ASSERT(bmp.GetSafeHandle());
  56. CBitmap* pOldBitmap = (CBitmap*)dc.SelectObject(&bmp);
  57. CFont* pOldFont = NULL;
  58. CWnd* pParent = GetParent();
  59. ASSERT(pParent);
  60. CFont* pFont = pParent->GetFont();
  61. ASSERT(pFont);
  62. if(bVertical)
  63. {
  64. if(NULL == m_font.GetSafeHandle())
  65. {
  66. LOGFONT lf = {0};
  67. pFont->GetLogFont(&lf);
  68. lf.lfEscapement = 900;
  69. m_font.CreateFontIndirect(&lf);
  70. }
  71. ASSERT(m_font.GetSafeHandle());
  72. pOldFont = (CFont*)dc.SelectObject(&m_font);
  73. }
  74. else
  75. {
  76. pOldFont = (CFont*)dc.SelectObject(pFont);
  77. }
  78. double dPercent = (double)(nPos - nMin) / ((double)(nMax - nMin));
  79. dc.DrawEdge(rect, EDGE_SUNKEN, BF_RECT | BF_FLAT);
  80. CRect rc(rect);
  81. rc.DeflateRect(CSize(2, 2));
  82. dc.FillSolidRect(&rc, m_clrBarBkColor);
  83. CString strText(_T(""));
  84. GetWindowText(strText);
  85. if(m_bShowPercent)
  86. {
  87. strText.AppendFormat(_T("%d%% "), static_cast<int>((dPercent * 100.0) + 0.5));
  88. }
  89. dc.SetBkMode(TRANSPARENT);
  90. dc.SetTextColor(m_clrTextColor);
  91. CPoint pt(0, 0);
  92. CSize size = dc.GetOutputTextExtent(strText);
  93. if(!bVertical)
  94. {
  95. switch(m_AlignText)
  96. {
  97. case ALIGN_LEFT:
  98. pt.x = rc.left;
  99. break;
  100. case ALIGN_RIGHT:
  101. pt.x = rc.right - size.cx;
  102. break;
  103. case ALIGN_CENTER:
  104. default:
  105. pt.x = rc.left + (rc.Width() - size.cx) / 2;
  106. break;
  107. }
  108. pt.y = rc.top + (rc.Height() - size.cy) / 2;
  109. CRect rcPos(rc);
  110. rcPos.right = rcPos.left + (int)(dPercent * rcPos.Width());
  111. dc.FillSolidRect(rcPos, m_clrBarColor);
  112. dc.SetTextColor(m_clrTextColor);
  113. dc.ExtTextOut(pt.x, pt.y, ETO_OPAQUE, rcPos, strText, NULL);
  114. dc.SetTextColor(m_clrTextBkColor);
  115. dc.ExtTextOut(pt.x, pt.y, ETO_CLIPPED, &rcPos, strText, NULL);
  116. }
  117. else
  118. {
  119. switch(m_AlignText)
  120. {
  121. case ALIGN_LEFT:
  122. pt.y = rc.bottom;
  123. break;
  124. case ALIGN_RIGHT:
  125. pt.y = rc.top + size.cx;
  126. break;
  127. case ALIGN_CENTER:
  128. default:
  129. pt.y = rc.bottom - (rc.Height() - size.cx) / 2;
  130. break;
  131. }
  132. pt.x = rc.left + (rc.Width() - size.cy) / 2;
  133. CRect rcPos(rc);
  134. rcPos.top = rcPos.bottom - (int)(dPercent * rcPos.Height());
  135. dc.FillSolidRect(rcPos, m_clrBarColor);
  136. dc.SetTextColor(m_clrTextColor);
  137. dc.ExtTextOut(pt.x, pt.y, ETO_OPAQUE, rcPos, strText, NULL);
  138. dc.SetTextColor(m_clrTextBkColor);
  139. dc.ExtTextOut(pt.x, pt.y, ETO_CLIPPED, &rcPos, strText, NULL);
  140. }
  141. paintDC.BitBlt(rect.left, rect.top ,rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);
  142. dc.SelectObject(pOldFont);
  143. dc.SelectObject(pOldBitmap);
  144. bmp.DeleteObject();
  145. dc.DeleteDC();
  146. }

效果图如下所示:

http://blog.csdn.net/visualeleven/article/details/6165007

自绘CProgressCtrl进度条控件,支持自定义显示文本和进程百分比信息的更多相关文章

  1. CProgressCtrl进度条控件实现进度滚动效果

    关于CProgressCtrl 控件的基本操作网上有很多资料,可我想实现进度条中进度滚动效果,即很多时候程序出现的等待或启动画面,如下图: 实现这个效果的函数为SetMarquee(_In_ BOOL ...

  2. 为OLED屏添加GUI支持6:进度条控件

    为OLED屏添加GUI支持6:进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...

  3. Photoshop和WPF双剑配合,打造炫酷个性的进度条控件

    现在如果想打造一款专业的App,UI的设计和操作的简便性相当重要.UI设计可以借助Photoshop或者AI等设计工具,之前了解到WPF设计工具Expression Blend可以直接导入PSD文件或 ...

  4. HslControls组件库 工业控件库 曲线控件 时间控件 管道控件 温度计控件 阀门控件 传送带控件 进度条控件 电池控件 数码管控件等等

    本篇博客主要对 HslControls 组件做一个大概的总览介绍,更详细的内容可以参照页面里的子链接,还有github上的源代码,然后进行相关的学习,和使用. Prepare 先从nuget下载到组件 ...

  5. 示例:WPF中Slider控件封装的缓冲播放进度条控件

    原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...

  6. Qt编写自定义控件32-等待进度条控件

    一.前言 在各种各样的执行任务界面,有时候需要比较多的时间,需要给出一个直观的等待进度条表示当前正在执行的进度,而不至于懵逼在那里,用户不会觉得程序死了还是干嘛了. 等待进度条有好几种办法,比如直接叫 ...

  7. [转载]ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  8. 用 CALayer 定制下载进度条控件

    // // RPProgressView.h // CALayer定制下载进度条控件 // // Created by RinpeChen on 16/1/2. // Copyright © 2016 ...

  9. ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件

    本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...

随机推荐

  1. 查找bad sql的方法:

    --查找bad sql的方法: select * from (select buffer_gets, sql_text from v$sqlarea ; -- 执行次数多的SQL select sql ...

  2. [转]反向代理过程与Nginx特点详解

    原文链接:<Nginx搭建反向代理服务器过程详解> 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 ...

  3. Min Stack

    Min Stack Design a stack that supports push, pop, top, and retrieving the minimum element in constan ...

  4. 嵌套回调异步与$.Deferred异步

    HTML: <input type="button" id="btn1" value="嵌套回调异步"> <input t ...

  5. 在Action中以Struts2的方式输出JSON数据

    参考地址;http://blog.csdn.net/itdada/article/details/21344985

  6. Eclipse问题解决集

    1.tomcate 报 PermGen space 错误Exception in thread "main" java.lang.OutOfMemoryError: PermGen ...

  7. Yandex.Algorithm 2011 Round 1 D. Sum of Medians 线段树

    题目链接: Sum of Medians Time Limit:3000MSMemory Limit:262144KB 问题描述 In one well-known algorithm of find ...

  8. 使用TCP协议的NAT穿透技术

    一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基本上没有人会告诉你如何使用TCP协议去穿透(甚至有的人会直接告诉你TCP协议是无法实现穿透的).但是,众所周知的是,UDP是一个无连 ...

  9. .NET设计模式(11):组合模式(Composite Pattern)(转)

    概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对 ...

  10. 8086CPU各寄存器的用途

    8086 有14个16位寄存器,这14个寄存器按其用途可分为(1)通用寄存器.(2)指令指针.(3)标志寄存器和(4)段寄存器等4类. 1.通用寄存器有8个, 又可以分成2组,一组是数据寄存器(4个) ...