ProgressBar显示进度值,垂直或者水平滚动条
过去一段时间,在研究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显示进度值,垂直或者水平滚动条的更多相关文章
- python使用progressbar显示进度条
progressbar安装: pip install progressbar 用法一 # -*- coding=utf-8 -*- import time from progressbar impor ...
- C# WinForm ProgressBar垂直显示进度和从右向左显示进度
1. 尝试将ProgressBar的RightToLeft属性设置为System.Windows.Forms.RightToLeft.Yes,同时将RightToLeftLayout属性设置为true ...
- easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条)
easyui datagrid 表头固定(垂直滚动条).列固定(水平滚动条),每页显示1000行 最近用多了easyui 之后还是觉得它的功能还是很强大的.它原有的功能就已经能够满足90%以上的界面需 ...
- MFC 控件编程之水平滚动条跟垂直滚动条
MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个 ...
- CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z
public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// ...
- WPF中DataGrid在没有数据的时候也可以显示水平滚动条
今天做项目中遇到个问题,就是页面加载后默认DataGrid是不加载数据的,但是DataGrid的列很多,就导致了运行效果上,此窗口的DataGrid没有水平滚动条,类似图片的效果. 经过百度和摸索,使 ...
- 关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条
关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条 关于<iframe>可以通过设置属性scrolling="no" 去掉iframe的两个滚动条. 如何只去掉水 ...
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...
- 利用Python计算π的值,并显示进度条
利用Python计算π的值,并显示进度条 第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...
随机推荐
- 如何实现CDN的ns智能解析和动手验证Akamai的实现
1.什么是ns智能解析 通常CDN业务中,智能解析域名,是根据请求方ip的不同给出不同的A记录. 而ns智能解析,是根据请求方ip的不同让他去不同的ns上解析域名,把ns推向离用户更近的边缘节点来缩短 ...
- tensrflow python [defunct]
在ubuntu上面安装了GPU版本的tensorflow后,很容易碰到zombie thread 的问题,无法正常关闭tensorflow的线程,用ps aux|grep python可以看到 pyt ...
- rsync数据同步备份
一.rsync简介 (1)rsync是什么? rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具. (2)rsync作用比较 远程拷贝:有点类似ssh的scp ...
- Elasticsearch集群状态脚本及grafana监控面板导出的json文件
脚本文件: #!/usr/bin/env python import datetime import time import urllib import json import urllib2 imp ...
- 第二轮冲刺-Runner站立会议08
今天:优化日历界面 明天:将日历界面与主程序结合
- No module named django.core
在虚拟环境中将django-admin.py startproject tango_with_django_project替换为django-admin startproject tango_with ...
- Spring系列之Spring常用注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 关于学习JavaScript 的 高三编程 一些心得(二)
今天在看高三的过程中,解决了之前我在 面试过程中遇到的一个问题. 就是将一段英文 颠倒过来. 下面就是我的代码: var zhang = "my name is zhangge !" ...
- PHP采集curl应用的一点小疑惑
CURL 是 Client URL Library Functions 的缩写,由 Daniel Stenberg 创建,更多内容可以参考他的网站.最近几天突然对 HTTP 采集有了兴趣.之前我在做这 ...