ProgressBar控件(进度条)用于在win窗体中显示进度,由于它的值会不断更新,为了不让界面假死,一般都是采用多线程的方式对进度条进行管理。有关ProgressBar的理论基础跟详细知识我在这里不多说,官方文档上面都可以查阅参考。这篇随笔我就是简单演示一下对ProgressBar控件的简单使用。

先展示一下窗口界面:

左上角是两个ProgressBar,右上角按钮负责控制ProgressBar进度的开启。右下角的四个按钮看起来很熟悉是吧,因为这是在上一篇博文中所演示的Demo的基础上继续往后做的。

一、首先定义一个控制ProgressBar进度的委托方法,为什么要用委托呢?因为ProgressBar控件是由主线程创建的,而对ProgressBar的操作是放在一个子线程中的,这在后面的跨线程操作控件中需要用到委托方法。代码如下:

1 private delegate void DelSetPro(int pro, ProgressBar proBar);//设置进度条进度的委托方法

二、定义一个共通的方法,用于设置进度条的进度,代码如下:

 1 /// <summary>
2 /// 设置ProgressBar的进度。
3 /// </summary>
4 /// <param name="pro"></param>
5 /// <param name="proBar"></param>
6 private void SetProgressMessage(int pro, ProgressBar proBar)
7 {
8 //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
9 //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
10 //必须执行this.InvokeRequired进行判断。
11 if (this.InvokeRequired)
12 {
13 DelSetPro setPro = new DelSetPro(SetProgressMessage);
14 this.Invoke(setPro, new object[] { pro, proBar });
15 }
16 else
17 {
18 proBar.Value = Convert.ToInt32(pro);
19 }
20 }

设置ProgressBar进度

三、我希望ProgressBar的进度完成后,可以弹出一个确认窗口让我知道,并且确认后消失。这个跟设置ProgressBar的进度大同小异,只是具体的实现细节不一样。委托方法代码如下:

1 private delegate void DelSetProVisi(ProgressBar proBar);//设置进度条消失的委托方法

四、定义一个共通的方法,用于让进度条消失,代码如下:

 1 /// <summary>
2 /// 让控件ProgressBar消失。
3 /// </summary>
4 /// <param name="pro"></param>
5 private void SetProgressBarVisi(ProgressBar pro)
6 {
7 if (this.InvokeRequired)
8 {
9 DelSetProVisi setProVisi = new DelSetProVisi(SetProgressBarVisi);
10 this.Invoke(setProVisi, new object[] { pro });
11 }
12 else
13 {
14 pro.Visible = false;
15 }
16 }

让进度条消失

五、接下就是对第一个进度条的具体操作了,在这个方法里会用到上面已经定义好的两个方法。请注意:ProgressBar的Maximum的默认值为100,Minimum的默认值为0,起初没注意Maximum,导致了超值异常。代码如下:

 1 /// <summary>
2 /// 操作ProgressBar01
3 /// </summary>
4 private void SleepForProgressBar01()
5 {
6 for (int i = 1; i <= 100; i++)
7 {
8 Thread.Sleep(100);
9 SetProgressMessage(i, progressBar1);
10 }
11 DialogResult dr01 = MessageBox.Show("ProgressBar01 has been finished!");
12 if (dr01.Equals(DialogResult.OK))
13 {
14 SetProgressBarVisi(progressBar1);
15 }
16 }

操作ProgressBar01控件

六、对第二个ProgressBar02控件的具体操作跟上面差不多,只是具体的进度不一样。就不赘述了。下面就直接展示一下实现效果图:

七、上面的几个步骤我拆解得比较细一点,可能初看起来有点乱,还有具体的一些细节方面我暂时也没有考虑太多,目前只是单纯的简单上手,在代码的优化方面应该还可以做得更好一点。这个Demo比较简单的,下面我就贴上Form1.cs的所有代码,欢迎各位批评指正。代码如下:

  1 using System;
2 using System.Threading;
3 using System.Windows.Forms;
4 using WinFormsAppGame.Properties;
5
6 namespace WinFormsAppGame
7 {
8 public partial class Form1 : Form
9 {
10 private delegate void DelSetPro(int pro, ProgressBar proBar);//设置进度条进度的委托方法
11 private delegate void DelSetProVisi(ProgressBar proBar);//设置进度条消失的委托方法
12
13 /// <summary>
14 /// 设置ProgressBar的进度。
15 /// </summary>
16 /// <param name="pro"></param>
17 /// <param name="proBar"></param>
18 private void SetProgressMessage(int pro, ProgressBar proBar)
19 {
20 //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
21 //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
22 //必须执行this.InvokeRequired进行判断。
23 if (this.InvokeRequired)
24 {
25 DelSetPro setPro = new DelSetPro(SetProgressMessage);
26 this.Invoke(setPro, new object[] { pro, proBar });
27 }
28 else
29 {
30 proBar.Value = Convert.ToInt32(pro);
31 }
32 }
33
34 /// <summary>
35 /// 让控件ProgressBar消失。
36 /// </summary>
37 /// <param name="pro"></param>
38 private void SetProgressBarVisi(ProgressBar pro)
39 {
40 if (this.InvokeRequired)
41 {
42 DelSetProVisi setProVisi = new DelSetProVisi(SetProgressBarVisi);
43 this.Invoke(setProVisi, new object[] { pro });
44 }
45 else
46 {
47 pro.Visible = false;
48 }
49 }
50
51 /// <summary>
52 /// 操作ProgressBar01
53 /// </summary>
54 private void SleepForProgressBar01()
55 {
56 for (int i = 1; i <= 100; i++)
57 {
58 Thread.Sleep(10);
59 SetProgressMessage(i, progressBar1);
60 }
61 DialogResult dr01 = MessageBox.Show("ProgressBar01 has been finished!");
62 if (dr01.Equals(DialogResult.OK))
63 {
64 SetProgressBarVisi(progressBar1);
65 }
66 }
67
68 /// <summary>
69 /// 操作ProgressBar02
70 /// </summary>
71 private void SleepForProgressBar02()
72 {
73 for (int j = 1; j <= 100; j++)
74 {
75 Thread.Sleep(30);
76 SetProgressMessage(j, progressBar2);
77 }
78 DialogResult dr02 = MessageBox.Show("ProgressBar02 has been finished!");
79 if (dr02.Equals(DialogResult.OK))
80 {
81 SetProgressBarVisi(progressBar2);
82 }
83 }
84
85 /// <summary>
86 /// 监听方向键的KeyDown事件
87 /// </summary>
88 /// <param name="sender"></param>
89 /// <param name="e"></param>
90 private void Form1_KeyDown(object sender, KeyEventArgs e)
91 {
92 switch (e.KeyCode)
93 {
94 case Keys.Left:
95 buttonLeft.BackgroundImage = Resources.left;
96 break;
97 case Keys.Up:
98 buttonUP.BackgroundImage = Resources.up;
99 break;
100 case Keys.Right:
101 buttonRight.BackgroundImage = Resources.right;
102 break;
103 case Keys.Down:
104 buttonDown.BackgroundImage = Resources.down;
105 break;
106 }
107 }
108
109 /// <summary>
110 /// 监听方向键的KeyUp事件
111 /// </summary>
112 /// <param name="sender"></param>
113 /// <param name="e"></param>
114 private void Form1_KeyUp(object sender, KeyEventArgs e)
115 {
116 switch (e.KeyCode)
117 {
118 case Keys.Left:
119 buttonLeft.BackgroundImage = Resources.left_dark;
120 break;
121 case Keys.Up:
122 buttonUP.BackgroundImage = Resources.up_dark;
123 break;
124 case Keys.Right:
125 buttonRight.BackgroundImage = Resources.right_dark;
126 break;
127 case Keys.Down:
128 buttonDown.BackgroundImage = Resources.down_dark;
129 break;
130 }
131 }
132
133 /// <summary>
134 /// 重写ProcessDialogKey,来允许监听方向键
135 /// </summary>
136 /// <param name="keycode"></param>
137 /// <returns></returns>
138 protected override bool ProcessDialogKey(Keys keycode)
139 {
140 switch (keycode)
141 {
142 case Keys.Left:
143 case Keys.Up:
144 case Keys.Right:
145 case Keys.Down:
146 return false;
147 }
148 return true;
149 }
150
151 public Form1()
152 {
153 InitializeComponent();
154 this.KeyPreview = true;//让界面能够捕捉到键盘事件
155 //this.Cursor.Dispose();//在主界面中禁用鼠标
156 }
157
158 private void button1_Click(object sender, EventArgs e)
159 {
160 Thread pro01Thread = new Thread(new ThreadStart(SleepForProgressBar01));
161 Thread pro02Thread = new Thread(new ThreadStart(SleepForProgressBar02));
162 pro01Thread.Start();
163 pro02Thread.Start();
164 }
165 }
166 }

Form1.cs

以上!

C# ProgressBar的简单使用的更多相关文章

  1. android学习ProgressBar的简单使用

    android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...

  2. ProgressBar的简单使用

    当我们的应用在进行耗时操作时,显示一个进度条呈现给用户,让用户知道当前进度是一个很好的体验,接下来我们就来简单了解下ProgressBar(本文主要针对初学者,大神可以绕开啦),先看效果图: 进度条P ...

  3. Android 打造形形色色的进度条 实现可以如此简单

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重 ...

  4. Android进度条控件ProgressBar使用

    ProgressBar有四种样式,圆形的(大,中,小)和直条形的(水平) 对应的style为 <LinearLayout xmlns:android="http://schemas.a ...

  5. Android_自定义进度条

    转载:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的 ...

  6. Android简单自定义圆形和水平ProgressBar

    ProgressBar简介 继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可 ...

  7. 最简单的耗时组件(窗口activity里面放一个progressBar)

    ①.先定义一个activity package com.example.administrator.actionbardemo; import android.app.Activity; import ...

  8. jqueryui组件progressbar进度条和日期组件datepickers的简单使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. jquery ui progressbar简单使用deom

    jquery api 和下载: http://api.jqueryui.com/progressbar/#option-value <!doctype html> <html lan ...

随机推荐

  1. UNIX系统上的抓包工具tcpdump常用命令说明

    tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才 ...

  2. mac版mysql初次密码不知道或以后忘记密码重设密码步骤

    我自己装完MySQL 不知道怎么回事,初始密码就是登陆不了,幸好找到了这个,严格按照步骤就行了, 完全可以复制粘贴 这个是在百度贴吧看到的作者 贴吧id叁寸日光_1987 苹果->系统偏好设置- ...

  3. 编译安装nginx,实现多域名 https

    一.编译安装nginx 1.1 获取源码包 [root@cetnos7 ~]#wget -O /usr/local/src/nginx-1.18.0.tar.gz http://nginx.org/d ...

  4. python篇第10天【While 循环语句】

    while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环,此外"判断条件"还可以是个常值 ...

  5. linux 定时删除图以及crontab介绍

    执行 sudo crontab -e 0 3 1 * * /etc/letsencrypt/certbot-auto renew --renew-hook "sudo nginx -s re ...

  6. linux 普通分区与lvm分区

    安装linux系统时 有时候会提示lvm分区与标准分区 首先普及一下lvm分区:lvm是 logical volume manager (逻辑卷管理),linux环境下对磁盘分区的管理:他解决了安装系 ...

  7. TCP三次握手原理

    本文主要讲述的是 1.TCP协议三次握手原理,以及为什么要三次握手,两次握手带来的不利后果. 2.TCP协议四次挥手原理,为什么要四次挥手. TCP协议三次握手原理: 首先,给张图片,建立TCP三次握 ...

  8. 图解|12张图告诉你MySQL的主键查询为什么这么快

    这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用自增ID作为主键,而 ...

  9. ngixn隐藏版本号、指定404页面

    1.场景:部分系统服务器端返回的HTTP头中,泄露了服务器采用的中间件信息(类型,版本)nginx,apache,攻击者可以缩小攻击范围,针对中间件存在的漏洞发起攻击 修改:ngixn/bin/ngi ...

  10. SRv6规模部署,离不开测试技术保驾护航!

    什么是SRv6? SRv6技术就是采用现有的IPv6转发技术,通过扩展IPv6报文的头域,实现类似标签转发的处理.SRv6将一些IPv6地址定义成实例化的SID(Segment ID),每个SID有着 ...