ProgressBar显示进度值,垂直或者水平滚动条

过去一段时间,在研究Windows的系统控件ProgressBar,一直奇怪为啥它不能显示进度值,本以为是个很简单的问题,结果搜索很久,也没有找到好的解决方案,最后终于找到一个Perfect方案,特记录一下。

<一>比较蹩脚的方案:

用户自定义控件,在系统的ProgressBar上面放一个Label,在每次进度改变时,修改Label上的Text。

蹩脚的地方:有很明显的强制植入感觉,系统控件的透明色Transparent也不是真正透明的,Label在ProgressBar上,可以很明显的感觉到就像一坨屎丢在了大马路上,很显眼。

<二>比较完美的方案

集成系统ProgressBar,重新绘制,在每次进度改变的时候,刷新一次即可,并且可以修改滚动条的方向:水平滚动条或者垂直滚动条。代码如下:

  1  public class ProgressBarWithValue : ProgressBar
  2     {
  3         private ProgressBarDirection direction = ProgressBarDirection.Horizontal;
  4         private bool showPercent = true;
  5         private string customText;
  6
  7         public ProgressBarWithValue()
  8         {
  9             SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
 10             base.Size = new Size(200, 15);
 11         }
 12
 13         protected override void OnPaint(PaintEventArgs e)
 14         {
 15             Rectangle rect = ClientRectangle;
 16             Graphics g = e.Graphics;
 17             if (direction == ProgressBarDirection.Horizontal)
 18                 ProgressBarRenderer.DrawHorizontalBar(g, rect);
 19             else
 20                 ProgressBarRenderer.DrawVerticalBar(g, rect);
 21             rect.Inflate(-3, -3);
 22             if (Value > 0)
 23             {
 24                 if (direction == ProgressBarDirection.Horizontal)
 25                 {
 26                     Rectangle clip = new Rectangle(rect.X, rect.Y, (int)Math.Round(((float)Value / Maximum) * rect.Width), rect.Height);
 27                     ProgressBarRenderer.DrawHorizontalChunks(g, clip);
 28                 }
 29                 else
 30                 {
 31                     int height = (int)Math.Round(((float)Value / Maximum) * rect.Height);
 32                     Rectangle clip = new Rectangle(rect.X, rect.Y + (rect.Height - height), rect.Width, height);
 33                     ProgressBarRenderer.DrawVerticalChunks(g, clip);
 34                 }
 35             }
 36
 37             string text = showPercent ? (Value.ToString() + ‘%‘) : CustomText;
 38
 39             if (!string.IsNullOrEmpty(text))
 40                 using (Font f = new Font(FontFamily.GenericSerif, 10))
 41                 {
 42                     SizeF len = g.MeasureString(text, f);
 43                     Point location = new Point(Convert.ToInt32((Width / 2) - len.Width / 2), Convert.ToInt32((Height / 2) - len.Height / 2));
 44                     g.DrawString(text, f, Brushes.Red, location);
 45                 }
 46         }
 47
 48
 49         /// <summary>
 50         /// 进度条方向,水平或者垂直
 51         /// </summary>
 52         public ProgressBarDirection Direction
 53         {
 54             get { return direction; }
 55             set
 56             {
 57                 if (direction != value)
 58                 {
 59                     direction = value;
 60                     Invalidate();
 61                 }
 62             }
 63         }
 64
 65         /// <summary>
 66         /// 是否显示进度,true表示显示进度,否则显示自定义的字符串
 67         /// </summary>
 68         public bool ShowPercent
 69         {
 70             get { return showPercent; }
 71             set
 72             {
 73                 showPercent = value;
 74             }
 75         }
 76
 77         /// <summary>
 78         /// 自定义需要显示的字符串
 79         /// </summary>
 80         public string CustomText
 81         {
 82             get { return customText; }
 83             set
 84             {
 85                 if (customText != value)
 86                 {
 87                     customText = value;
 88                     if (!showPercent)
 89                         Invalidate();
 90                 }
 91             }
 92         }
 93     }
 94
 95     public enum ProgressBarDirection
 96     {
 97         /// <summary>
 98         /// 垂直方向
 99         /// </summary>
100         Vertical,
101         /// <summary>
102         /// 水平方向
103         /// </summary>
104         Horizontal,
105     }

参考地址:http://stackoverflow.com/questions/3529928/how-do-i-put-text-on-progressbar

时间: 2024-11-01 21:35:13

ProgressBar显示进度值,垂直或者水平滚动条的相关文章

Material Design学习之 Sliders(详细分析,悬空气球显示进度值,附带Eclipse可以jar)

转载请注明出处:王亟亟的大牛之路 Material Design系列的文章这是第五篇,今天讲滑块控件(Sliders). 之前的传送门:http://blog.csdn.net/ddwhan0123/article/details/50578348(代码实现都靠画,学好View还是很重要的) 老规矩,先说下理论部分 滑块控件(Sliders,简称滑块)可以让我们通过在连续或间断的区间内滑动锚点来选择一个合适的数值.区间最小值放在左边,对应的,最大值放在右边.滑块(Sliders)可以在滑动条的左

easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条),每页显示1000行

最近用多了easyui 之后还是觉得它的功能还是很强大的.它原有的功能就已经能够满足90%以上的界面需求. 1.当数据行很多时,会呈现垂直的滚动条,但是向下滚动,表头却被淹没了,这不符合人类偷懒的特点(我怎么可能记得住每列的数据代表的意思!),所以需要固定表头. datagrid.datagrid({             fit: true }); 对,没错,就是这个属性,就这么简单!我也是看了网上的各位大神之后才懂.我看了多遍easyui的api(当然是中文的)没有!!下次看看英文原版(啊

CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z

public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// <summary> /// 获取或设置一个值,该值指示是否在控件中显示水平滚动条 /// </summary> private void DisplayHScroll() { checkedListBox1.IntegralHeight = true; for (int x = 0;

MFC 控件编程之水平滚动条跟垂直滚动条

MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个结构.专门存储了滚动条信息. 而我们在对话框一启动就要进行控件初始化.下方看下结构. typedef struct tagSCROLLINFO { UINT cbSize; 自身大小 UINT fMask; 滚动条的范围.左边->右边方式. int nMin; 滚动条最小值 int nMax; 滚动

关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条

关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条 关于<iframe>可以通过设置属性scrolling="no" 去掉iframe的两个滚动条. 如何只去掉水平滚动条或垂直滚动条呢,一些网页组件通过设置组件的style属性的overflow-x : hidden或overflow : hidden来去掉水平滚动条或垂直滚动条.但是对iframe不起作用. 可以通过下面的方法来去掉:在iframe 所包含的网页中添加<style>html { overf

java中JScrollPane不显示水平滚动条的解决办法

在JPanel中添加了表格,表格中对东西太多,需要水平滚动条滑动才能够完全找到所有数据,如果没有水平滚动条的话,数据堆积在一起,无法分开 做法是: 第一步:先将表格自动调整的状态给关闭掉:table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 第二步:设置JScrollPane的水平滚动条的方式,有三种,设js是一个JScrollPane的对象 js.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_

自定义ProgressDialog实现暂时隐藏进度值并显示等待状态(附源码下载)

有时,我们需要访问网络才能获取到需要操作的任务数(例如下载的文件数),而在服务器返回任务数之前要想隐藏进度百分比和进度数值,就需要我们自己重写ProgressDialog.等到获取到任务数后再把进度值和百分比显示出来.先上效果图: 关键代码: public class CustomProgressDialog extends ProgressDialog { private final String TAG = this.getClass().getSimpleName(); public Cu

Qt自定义带游标的slider,在滑块正上方显示当前值(类似于进度条,用一个额外的QLabel冒充QSilder的一部分,然后move就行了)

首先自定义QSlider的子类MyCustomSlider,如下所示. mycustomslider.h [cpp] view plain copy #ifndef MYCUSTOMSLIDER_H #define MYCUSTOMSLIDER_H #include <QSlider> #include <QLabel> #include <QMouseEvent> class MyCustomSlider : public QSlider { public: MyCu

ProgressBar 系统进度条【案例】

布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:la