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. ApacheCN JavaScript 译文集(二) 20211123 更新

    使用 Meteor 构建单页 Web 应用 零.前言 一.制作 Meteor 应用 二.构建 HTML 模板 三.存储数据和处理集合 四.控制数据流 五.使我们的应用与路由通用 六.保持会话状态 七. ...

  2. linux修改root用户登陆密码

    如果不是以root用户登录的,请先切换到root用户下, 执行命令:su root 然后按提示输入root用户的密码. 英文系统: [root@localhost ~]# passwd Changin ...

  3. curl 查看接口的网络分段响应时间

    示例如下 curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_tota ...

  4. 通过示例学习PYTORCH

    注意:这是旧版本的PyTorch教程的一部分.你可以在Learn the Basics查看最新的开始目录. 该教程通过几个独立的例子较少了PyTorch的基本概念. 核心是:PyTorch提供了两个主 ...

  5. Java架构师必备技能:docker使用大全

    前言   java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...

  6. app内嵌H5网页(webviewJavaScriptBridge)

    摘要:使用的插件为webviewJavaScriptBridge,app端需要引入一下这个包,html页面只需一段JS代码 与IOS交互 <! 申明交互(此处代码固定) > functio ...

  7. Learning Schedules

    近期目标 1. 争取搞定小论文 2. Java SE 学习 3. 剑指Offer每日1-2题

  8. [题解]第十一届北航程序设计竞赛预赛——L.偶回文串

    题目描述 长度为偶数的回文串被称为偶回文串.如果一个字符串重新排序之后能够成为一个偶回文串,则称为可回文的. 给一个字符串,求可回文的子串个数.字符串只含小写字母,单个字符串长度不超过10^5,所有数 ...

  9. REACT 使用antd Table 中rowSelection遇到的问题

    首先项目是尚硅谷的后台谷粒平台,在用到antd Table 中的 rowSelection时,出现了一个问题(P87时遇到的问题): 表格中的每一项前面有一个radio单选框可以选中,本来是想利用ro ...

  10. Blazor和Vue对比学习(基础1.1):组件结构

    难度:★ 简单说一说: 1.Vue和Blazor都遵循单文件结果,即HTML(视图模板).CSS(样式).JS/C#(代码逻辑)写在一个文件里,Vue的文件后缀为.vue,Blazor的文件后缀为.r ...