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

先展示一下窗口界面:

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

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

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

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

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

设置ProgressBar进度

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

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

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

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

让进度条消失

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

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

操作ProgressBar01控件

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

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

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

    1 简介 描述统计学(descriptive statistics)是一门统计学领域的学科,主要研究如何取得反映客观现象的数据,并以图表形式对所搜集的数据进行处理和显示,最终对数据的规律.特征做出综合 ...

  2. TCP和UDP的区别以及应用

    TCP定义 传输控制协议 (Transmission Control Protocol).TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算 ...

  3. .net core部署到ubuntu 上传文件超过30MB

    默认的上传文件不能超过30MB,需要修改几个地方 一.web.config中添加配置 <requestLimits maxAllowedContentLength="214748364 ...

  4. 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 ...

  5. C++网络编程卷1、卷2概述

    转载请注明来源:https://www.cnblogs.com/hookjc/ 一:  C++NPv1主要涉及到的类: 1.1.  Logging_Server 是个抽象类,用来定义接口类型,此类不能 ...

  6. Class.getResource和ClassLoader.getResource的路径写法

    Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...

  7. iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL

    以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...

  8. A*算法及其matlab实现

    教程 基本理论教程 A*算法程序 最简单的A*算法

  9. js实现网页回弹小球效果

    直接上效果图 运行页面会首先弹出一个输入框,询问用户想要产生的小球数量,随后后台就会产生指定数量的小球,在页面中来回跳动,触碰到页面边框时,就会回弹,且产生的小球颜色随机,小球在页面中的位置随机,小球 ...

  10. Linux基础:操作系统的启动

    Centos6: # 1.加电自检(BIOS)# 2.MBR引导(512k)dd </dev/zero >/dev/sda bs=1k count=400 # 3.GRUB菜单(选择系统) ...