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

<一>比较蹩脚的方案:

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

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

<二>比较完美的方案

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

  public class ProgressBarWithValue : ProgressBar
{
private ProgressBarDirection direction = ProgressBarDirection.Horizontal;
private bool showPercent = true;
private string customText; public ProgressBarWithValue()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
base.Size = new Size(, );
} protected override void OnPaint(PaintEventArgs e)
{
Rectangle rect = ClientRectangle;
Graphics g = e.Graphics;
if (direction == ProgressBarDirection.Horizontal)
ProgressBarRenderer.DrawHorizontalBar(g, rect);
else
ProgressBarRenderer.DrawVerticalBar(g, rect);
rect.Inflate(-, -);
if (Value > )
{
if (direction == ProgressBarDirection.Horizontal)
{
Rectangle clip = new Rectangle(rect.X, rect.Y, (int)Math.Round(((float)Value / Maximum) * rect.Width), rect.Height);
ProgressBarRenderer.DrawHorizontalChunks(g, clip);
}
else
{
int height = (int)Math.Round(((float)Value / Maximum) * rect.Height);
Rectangle clip = new Rectangle(rect.X, rect.Y + (rect.Height - height), rect.Width, height);
ProgressBarRenderer.DrawVerticalChunks(g, clip);
}
} string text = showPercent ? (Value.ToString() + '%') : CustomText; if (!string.IsNullOrEmpty(text))
using (Font f = new Font(FontFamily.GenericSerif, ))
{
SizeF len = g.MeasureString(text, f);
Point location = new Point(Convert.ToInt32((Width / ) - len.Width / ), Convert.ToInt32((Height / ) - len.Height / ));
g.DrawString(text, f, Brushes.Red, location);
}
} /// <summary>
/// 进度条方向,水平或者垂直
/// </summary>
public ProgressBarDirection Direction
{
get { return direction; }
set
{
if (direction != value)
{
direction = value;
Invalidate();
}
}
} /// <summary>
/// 是否显示进度,true表示显示进度,否则显示自定义的字符串
/// </summary>
public bool ShowPercent
{
get { return showPercent; }
set
{
showPercent = value;
}
} /// <summary>
/// 自定义需要显示的字符串
/// </summary>
public string CustomText
{
get { return customText; }
set
{
if (customText != value)
{
customText = value;
if (!showPercent)
Invalidate();
}
}
}
} public enum ProgressBarDirection
{
/// <summary>
/// 垂直方向
/// </summary>
Vertical,
/// <summary>
/// 水平方向
/// </summary>
Horizontal,
}

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

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

  1. python使用progressbar显示进度条

    progressbar安装: pip install progressbar 用法一 # -*- coding=utf-8 -*- import time from progressbar impor ...

  2. C# WinForm ProgressBar垂直显示进度和从右向左显示进度

    1. 尝试将ProgressBar的RightToLeft属性设置为System.Windows.Forms.RightToLeft.Yes,同时将RightToLeftLayout属性设置为true ...

  3. easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条)

    easyui datagrid 表头固定(垂直滚动条).列固定(水平滚动条),每页显示1000行 最近用多了easyui 之后还是觉得它的功能还是很强大的.它原有的功能就已经能够满足90%以上的界面需 ...

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

    MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个 ...

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

    public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// ...

  6. WPF中DataGrid在没有数据的时候也可以显示水平滚动条

    今天做项目中遇到个问题,就是页面加载后默认DataGrid是不加载数据的,但是DataGrid的列很多,就导致了运行效果上,此窗口的DataGrid没有水平滚动条,类似图片的效果. 经过百度和摸索,使 ...

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

    关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条 关于<iframe>可以通过设置属性scrolling="no" 去掉iframe的两个滚动条. 如何只去掉水 ...

  8. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  9. 利用Python计算π的值,并显示进度条

    利用Python计算π的值,并显示进度条  第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...

随机推荐

  1. lambda与常用内置函数

    lambda表达式: lambda arg:arg+1 数值操作: abs() 求绝对值 abs(-1) bin() 将十进制转换成二进制   bin(3) ,’0b11’ hex() 十进制转换为十 ...

  2. powerdesigner-从excel导入table模型

    近在使用pd过程中,遇到一个问题,就是类的字段,方法,类型在excel中整理好了,想导入到pd直接生成类图.网上有很多生成实体表的方法,于是自己模仿写了一个生成类图的,在pd中的工具--扩展--脚本, ...

  3. 解决:/bin/sh: 1: /home/**/custom_app.sh: Permission denied错误

    出现如下错误,一般是执行权限不够. /bin/sh: : /home/custom_app.sh: Permission denied 解决方法是:cd 到此文件目录,对提示的文件赋予可执行权限或读写 ...

  4. oracle普通用户登录em

    刚新创建一个用户,登陆EM(Enterprise Manager) 如下提示: 应用程序要求的数据库权限超出了您当前具有的权限.有关特定版本的详细信息, 解决办法: 给登陆用户赋予 select_ca ...

  5. [转载]抓包,端口镜像,monitor session命令(转)

    原文地址:抓包,端口镜像,monitor session命令(转)作者:浮云皓月 一.SPAN简介 SPAN技术主要是用来监控交换机上的数据流,大体分为两种类型,本地SPAN和远程SPAN. --Lo ...

  6. 11月8日PHP练习《留言板》

    一.要求 二.示例页面 三.网页代码及网页显示 1.denglu.php  登录页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  7. IO

    文件过滤 http://codego.net/9245/ C# 文件处理 http://wenku.baidu.com/link?url=yXKiIA_OZYR4MIynDgz-qhOnfJoCyOQ ...

  8. 处理 input 上传图片,浏览器读取图片大小过程中遇到到的坑(兼容IE8\9)

    为了 解决这个坑~ 已经 累傻了.. 周末再 写吧..

  9. 【WIN10】绑定x:Bind

    在WP8.WP8中,我们知道有一个绑定{Binding},而在Win10中,新增了一个绑定{x:Bind} x:Bind :为编译时绑定 ,内存.内存相对于传统绑定都有优化 特性: 1.为强类型    ...

  10. nyoj 106背包问题(贪心专题)

    背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w< ...