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 ...
随机推荐
- lambda与常用内置函数
lambda表达式: lambda arg:arg+1 数值操作: abs() 求绝对值 abs(-1) bin() 将十进制转换成二进制 bin(3) ,’0b11’ hex() 十进制转换为十 ...
- powerdesigner-从excel导入table模型
近在使用pd过程中,遇到一个问题,就是类的字段,方法,类型在excel中整理好了,想导入到pd直接生成类图.网上有很多生成实体表的方法,于是自己模仿写了一个生成类图的,在pd中的工具--扩展--脚本, ...
- 解决:/bin/sh: 1: /home/**/custom_app.sh: Permission denied错误
出现如下错误,一般是执行权限不够. /bin/sh: : /home/custom_app.sh: Permission denied 解决方法是:cd 到此文件目录,对提示的文件赋予可执行权限或读写 ...
- oracle普通用户登录em
刚新创建一个用户,登陆EM(Enterprise Manager) 如下提示: 应用程序要求的数据库权限超出了您当前具有的权限.有关特定版本的详细信息, 解决办法: 给登陆用户赋予 select_ca ...
- [转载]抓包,端口镜像,monitor session命令(转)
原文地址:抓包,端口镜像,monitor session命令(转)作者:浮云皓月 一.SPAN简介 SPAN技术主要是用来监控交换机上的数据流,大体分为两种类型,本地SPAN和远程SPAN. --Lo ...
- 11月8日PHP练习《留言板》
一.要求 二.示例页面 三.网页代码及网页显示 1.denglu.php 登录页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...
- IO
文件过滤 http://codego.net/9245/ C# 文件处理 http://wenku.baidu.com/link?url=yXKiIA_OZYR4MIynDgz-qhOnfJoCyOQ ...
- 处理 input 上传图片,浏览器读取图片大小过程中遇到到的坑(兼容IE8\9)
为了 解决这个坑~ 已经 累傻了.. 周末再 写吧..
- 【WIN10】绑定x:Bind
在WP8.WP8中,我们知道有一个绑定{Binding},而在Win10中,新增了一个绑定{x:Bind} x:Bind :为编译时绑定 ,内存.内存相对于传统绑定都有优化 特性: 1.为强类型 ...
- nyoj 106背包问题(贪心专题)
背包问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w< ...