C# ProgressBar的简单使用
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的简单使用的更多相关文章
- android学习ProgressBar的简单使用
android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...
- ProgressBar的简单使用
当我们的应用在进行耗时操作时,显示一个进度条呈现给用户,让用户知道当前进度是一个很好的体验,接下来我们就来简单了解下ProgressBar(本文主要针对初学者,大神可以绕开啦),先看效果图: 进度条P ...
- Android 打造形形色色的进度条 实现可以如此简单
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重 ...
- Android进度条控件ProgressBar使用
ProgressBar有四种样式,圆形的(大,中,小)和直条形的(水平) 对应的style为 <LinearLayout xmlns:android="http://schemas.a ...
- Android_自定义进度条
转载:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的 ...
- Android简单自定义圆形和水平ProgressBar
ProgressBar简介 继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可 ...
- 最简单的耗时组件(窗口activity里面放一个progressBar)
①.先定义一个activity package com.example.administrator.actionbardemo; import android.app.Activity; import ...
- jqueryui组件progressbar进度条和日期组件datepickers的简单使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jquery ui progressbar简单使用deom
jquery api 和下载: http://api.jqueryui.com/progressbar/#option-value <!doctype html> <html lan ...
随机推荐
- Lesson6——Pandas Pandas描述性统计
1 简介 描述统计学(descriptive statistics)是一门统计学领域的学科,主要研究如何取得反映客观现象的数据,并以图表形式对所搜集的数据进行处理和显示,最终对数据的规律.特征做出综合 ...
- TCP和UDP的区别以及应用
TCP定义 传输控制协议 (Transmission Control Protocol).TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算 ...
- .net core部署到ubuntu 上传文件超过30MB
默认的上传文件不能超过30MB,需要修改几个地方 一.web.config中添加配置 <requestLimits maxAllowedContentLength="214748364 ...
- Jackson中处理map中的null key 或者null value 及实体字段中的null value
1.map中有null key时的序列化 当有null key时,jackson序列化会报 Null key for a Map not allowed in JSON (use a convert ...
- C++网络编程卷1、卷2概述
转载请注明来源:https://www.cnblogs.com/hookjc/ 一: C++NPv1主要涉及到的类: 1.1. Logging_Server 是个抽象类,用来定义接口类型,此类不能 ...
- Class.getResource和ClassLoader.getResource的路径写法
Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...
- iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL
以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...
- A*算法及其matlab实现
教程 基本理论教程 A*算法程序 最简单的A*算法
- js实现网页回弹小球效果
直接上效果图 运行页面会首先弹出一个输入框,询问用户想要产生的小球数量,随后后台就会产生指定数量的小球,在页面中来回跳动,触碰到页面边框时,就会回弹,且产生的小球颜色随机,小球在页面中的位置随机,小球 ...
- Linux基础:操作系统的启动
Centos6: # 1.加电自检(BIOS)# 2.MBR引导(512k)dd </dev/zero >/dev/sda bs=1k count=400 # 3.GRUB菜单(选择系统) ...