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. 【XR-4】文本编辑器

    直接做是困难的,不妨依照部分分来思考. - Subtask 3 首先会进入一个误区:维护修改,通过循环串的性质在 \(\tt KMP\) 自动机上优化遍历. 但可以发现这样很难处理,我们不妨 直接维护 ...

  2. @property中的copy关键字

    1.@property中的copy的作用 防止外界修改内部的值 @interface Person : NSObject @property (nonatomic, retain) NSString ...

  3. Serializable接口中serialVersionUID字段的作用

    序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类. 如果接收者加 ...

  4. 如何使PreparedStatement支持命名参数

    http://m.blog.csdn.net/wallimn/article/details/3734242

  5. 我的新书——《PHP程序员面试笔试宝典》

    你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试宝典>. 一.创作过程 <PHP程序员面试笔试宝典>是我的第一本书, ...

  6. 基于3U PXIe的ZU7EV图像编解码设计方案

    1.板卡简介 基于3U PXIe的ZU7EV图像编码卡用于加固设备的图像接入,编解码采集存储.用于机载.舰载.车载等工作场景,支持工业级温度工作.(此方案是由北京太速设计的,已应用到实际领域) 2.主 ...

  7. JVM学习——类加载机制(学习过程)

    JVM--类加载机制 2020年02月07日14:49:19-开始学习JVM(Class Loader) 类加载机制 类加载器深入解析与阶段分解 在Java代码中,类型的加载.连接与初始化过程中都是在 ...

  8. Spring是什么? 核心总结

    Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.  然而,Spring ...

  9. 上架打包错误:error itms-90086

    这是一个很纠结的错误 大家第一反应肯定是 赶紧去看看 位数是否设置  然后发现没有问题  就开始懵逼了 (比如我) 然而无意看到了一个人写的简书 这个人在 Overflow 找到了一个答案 比如你选择 ...

  10. Java诊断神器:Arthas常用功能

    最新原文:https://www.cnblogs.com/uncleyong/p/14944401.html Arthas是Alibaba开源的Java诊断工具,功能很强大,它是通过Agent方式来连 ...