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. SpringBoot前后端数组交互

    前端 后端 Gitee地址 https://gitee.com/zhuayng/foundation-study.git 参考 https://blog.csdn.net/qq_34091758/ar ...

  2. Git简单多人协作

    感谢廖雪峰老师,引自他的Git教程. Git简单多人协作 首先,可以试图用git push origin <branch-name>推送自己的修改: 如果推送失败,则因为远程分支比你的本地 ...

  3. nginx开发: 模块nginx_tcp_proxy_module

    nginx支持ws\wss连接,接入nginx_tcp_proxy_module模块 nginx版本1.14.2,在nginx_tcp_proxy_module模块中的上下行数据接口中处理数据解包与打 ...

  4. request和session获取参数的区别

    说简单点 request对象和session对象的最大区别是生命周期. request request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器 ...

  5. 手势仿QQ侧滑---秀清

    // // SlideViewController.h // qqcehua // // Created by 张秀清 on 15/5/25. // Copyright (c) 2015年 张秀清. ...

  6. 框架3.2--搭建V·P·N

    目录 部署OpenVPN 一.服务端 1.安装openvpn和证书工具 2.生成服务器配置文件 3.准备证书签发相关文件 4.准备签发证书相关变量的配置文件 5.初始化PKI生成PKI相关目录和文件 ...

  7. Pytorch技法:继承Subset类完成自定义数据拆分

    我们在<torch.utils.data.DataLoader与迭代器转换>中介绍了如何使用Pytorch内置的数据集进行论文实现,如torchvision.datasets.下面是加载内 ...

  8. Solution Set - Stirling 数相关杂题

      <好多题的题解>   「洛谷 P5408」第一类斯特林数·行   根据结论 \[x^{\overline{n}}=\sum_i{n\brack i}x^i, \] 我们只需要求出 \( ...

  9. Solution -「AGC 002F」「AT 2000」Leftmost Ball

    \(\mathcal{Description}\)   Link.   给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现 ...

  10. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...