61阅读

c进度条-C# WinForm进度条实现浅析

发布时间:2018-02-21 所属栏目:开发

一 : C# WinForm进度条实现浅析

C# WinForm进度条实现:首先是进度条窗体,需要在上面添加进度条,然后去掉ControlBox。除此外,还要增加一个方法,用来控制进度条的增加幅度,具体如下:

  1. ///﹤summary﹥
  2. ///Increaseprocessbar
  3. ///﹤/summary﹥//C# WinForm进度条实现
  4. ///﹤paramname="nValue"﹥thevalueincreased﹤/param﹥
  5. ///﹤returns﹥﹤/returns﹥
  6. publicboolIncrease(intnValue)
  7. {
  8. if(nValue﹥0)
  9. {
  10. if(prcBar.Value+nValue﹤prcBar.Maximum)
  11. {
  12. prcBar.Value+=nValue;
  13. returntrue;
  14. }
  15. else
  16. {
  17. prcBar.Value=prcBar.Maximum;
  18. this.Close();
  19. returnfalse;
  20. }
  21. }
  22. returnfalse;
  23. }

C# WinForm进度条实现之主窗体:

如何进行操作了,首先需要定义两个私有成员,一个委托。其中一个私有成员是保存当前进度条窗体对象,另一个是保存委托方法(即增加进度条尺度),具体如下:

  1. privatefrmProcessBarmyProcessBar=null;
  2. privatedelegateboolIncreaseHandle(intnValue);
  3. privateIncreaseHandlemyIncrease=null;

C# WinForm进度条实现之在主窗体中提供函数来打开进度条窗体,如下:

  1. ///﹤summary﹥
  2. ///Openprocessbarwindow
  3. ///﹤/summary﹥
  4. privatevoidShowProcessBar()
  5. {
  6. myProcessBar=newfrmProcessBar();
  7. //Initincreaseevent
  8. myIncrease=
  9. newIncreaseHandle(myProcessBar.Increase);
  10. myProcessBar.ShowDialog();
  11. myProcessBar=null;
  12. }

C# WinForm进度条实现之开始创建线程来运行,具体如下:

  1. ///﹤summary﹥
  2. ///Subthreadfunction
  3. ///﹤/summary﹥
  4. privatevoidThreadFun()
  5. {
  6. MethodInvokermi=
  7. newMethodInvoker(ShowProcessBar);
  8. this.BeginInvoke(mi);
  9. Thread.Sleep(1000);
  10. //Sleepawhiletoshowwindow
  11. boolblnIncreased=false;
  12. objectobjReturn=null;
  13. do
  14. {
  15. Thread.Sleep(50);
  16. objReturn=this.Invoke(
  17. this.myIncrease,
  18. newobject[]{2});
  19. blnIncreased=(bool)objReturn;
  20. }
  21. while(blnIncreased);
  22. }

注意以上,在打开进度条窗体和增加进度条进度的时候,一个用的是BeginInvoke,一个是Invoke,这里的区别是BeginInvoke不需要等待方法运行完毕,而Invoke是要等待方法运行完毕。还有一点,此处用返回值来判断进度条是否到头了,如果需要有其他的控制,可以类似前面的方法来进行扩展。

C# WinForm进度条实现之启动线程,可以如下:

  1. ThreadthdSub=newThread(
  2. newThreadStart(ThreadFun));
  3. thdSub.Start();

这样,一个用模式打开进度条窗体就做完了。

C# WinForm进度条实现的基本情况就向你介绍到这里,希望对你学习和了解C# WinForm进度条实现有所帮助。

二 : C++怎么输出类似进度条的效果。。求源文件。

++怎么输出类似进度条的效果。。求源文件。


一、实现方法

虽然 Visual C++中的MFC类提供了标准的进度指示器控件(progress control),但是我们不能在状态栏里直接使用这个控件,要解决这 个问题,可以创建一个可重用C++类CProgStatusBar,这个类从CStatusBar派生,用来来实现状态条中的进度指示。整个实现过程不是 很难,思路是在状态栏创建一个进度指示器控制,把它作为子窗口来对待,然后根据不同的状态来显示或者隐藏进度指示器。

在具体实现 CProgStatusBar类的过程中,首先在CProgStatusBar派生类中加了一个

CProgressCtrl类型的数据成员 --m_wndProgBar,然后重载CstatusBar类的二个重要成员函数:OnCreate()、OnSize(),最后还要在该类中添加一个 自定义成员函数OnProgress()。在上述三个函数中, OnCreate()负责在状态栏第一次被创建时接收控制,继而创建进度指示器并将它初始 化为一个子窗口,它的实现代码如下:

int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs) {

lpcs->style |= WS_CLIPCHILDREN; VERIFY(CStatusBar::OnCreate(lpcs)==0);

VERIFY(m_wndProgBar.Create(WS_CHILD, CRect(), this, 1)); m_wndProgBar.SetRange(0,100); return 0; }

OnCreate()函数在状态栏的式样中加了一个WS_CLIPCHILDREN,它告诉Windows不要绘制子窗口以下的状态栏区域,这样可以减 少屏幕闪烁。接着OnCreate()函数创建进度指示器控件并将它的范围设置成[0,100]。注意在这里创建进度指示器控件时没有用 WS_VISIBLE,因为我们要实现的目标是仅仅当装载文件时进度条才显现,其余时间内应用程序都隐藏它。

熟悉Windows编程 的人都清楚,无论何时,只要在某个窗口里添加子窗口,那么一定要负责管理它的大小尺寸,也就是说,当父窗口大小改变后,子窗口的大小也要跟着作相应的改 变。一般来说,这个工作由父窗口的WM_SIZE消息处理函数OnSize()来作,所以我们也要处理该类的OnSize()函数。

void CProgStatusBar::OnSize(...) {

CStatusBar::OnSize(...); CRect rc;

GetItemRect(0, &rc);//获取状态条的第一个窗口的尺寸;

m_wndProgBar.MoveWindow(&rc,FALSE);//移动进度条到状态条的第一个窗口; }

从上述代码可以看出,CProgStatusBar::OnSize()将进度指示器放在了状态栏的第一个窗格,这个窗格通常用来显示程序的"就绪"信 息和命令提示信息。注意这里不论进度指示器是处于可见状态还是隐藏状态,MoveWindow都照样起作用--所以即便是进度指示器处于隐藏状态,其窗口 大小同样是可调的。

调整好进度指示器的窗口大小后,下面要作的就是进度指示器的显示,进度指示器当前进度状态的显示在 CProgStatusBar::OnProgress中完成。它有一个类型为UINT的入口参数:参数值的范围从0到100,表示进度百分比,0表示进 度没开始,100表示全部完成。如果这个参数的值大于0,则OnProgress显示进度控制并设置指示器的位置;如果参数值等于0, 则 OnProgress隐藏进度控制。

虽然子窗口控件通常都是放在父窗口能绘制的区域的最上面,但这样做在绘制方面是有一定风险 的。在隐藏/显示进度控制时尤其如此,这时候会出现两个问题:第一,因为进度指示器显示在状态栏的第一个窗格位置,所以如果进度条指示器显示时已经显示有 状态信息,那么进度指示器和状态信息文本就会有冲突,相互干扰。之所以会这样,是因为进度控制假设其绘制背景是干净的,并且只绘制进度控制的着色部分。解 决这个问题最简单的方法是调用CStatusBar::SetWindowText(NULL)函数在显示进度指示器之前打扫一下环境卫生,清除以前的文 本。

对于状态栏来说,SetWindowText函数的作用是设置状态栏第一个窗格的文本。反之,当调用OnProgress(0) 清除进度控制时也存在类似的问题,CProgStatusBar::OnProgress 隐藏进度控制后,状态栏第一个窗格该显示什么信息呢?一般显 示"就绪"或其它的提示信息。当应用程序不做任何事情时,MFC程序总是在这个位置显示资源串AFX_IDS_IDLEMESSAGE表示的文本,其缺省 值为"就绪",当然读者朋友们可以在当前项目的RC文件中任意修改这个值,不管怎样,在MFC程序的状态栏中显示"就绪"信息很容易,需要作的就是在 CProgStatusBar::OnProgress()函数中调用语句

GetParent()->PostMessage(WM_SETMESSAGESTRING,AFX_IDS_IDLEMESSAGE)向父窗口 发送一个WM_SETMESSAGESTRING消息就可以了,需要注意的是,使用消息

WM_SETMESSAGESTRING时必须包含它的定义文 件"afxpriv.h",否则程序会报告编译错误。

上述CprogStatusBar类实现了状态栏中包含进度条控件,该类的使用 方法很简单,首先在应用程序的CmainFrame类中用CProgStatusBar代替CStatusBar声明实例,然后在任何想要显示进度控制指 示的地方调用CProgStatusBar::OnProgress。本例中定义了一个消息MYWM_PROGRESS,它将进度条当前的进度作为 WPARAM参数传递到CProgStatusBar::OnProgress()函数。

经过上述处理,想要使用进度指示的任何对象 都可以通过发送一个消息到主框架来调用状态栏进行进度条的显示。例如,在例子程序中,文档的Serialize()函数在加载文本文件时,利用 Sleep()函数仿真耗时加载,每隔150毫秒报告一次进度状态。如果你不想从文档发送Windows消息,可以用MFC的视图更新机制来做。你可以发 明一个"暗示"代码以及一个小结构来保存进度百分比数据,并通过向框架发送MYWM_PROGRESS消息调用暗示信息。这是从文档到视图/框架传递进度 控制信息的最省事的方式。

二、编程步骤

1、 启动Visual C++6.0,生成一个单文档应用程序prgsbar,项目的视图类的基类选择CEdit类;

2、 在程序的Resource.h文件中添加自定义消息的定义:

#define MYWM_PROGRESS (WM_USER+1)

3、 在程序的主框架窗口CMainFrame类的头文件中声明MYWM_PROGRESS的消息响应函数 afx_msg LRESULT OnProgress(WPARAM wp, LPARAM lp),在该类的实现中添加消息映射 ON_MESSAGE(MYWM_PROGRESS,OnProgress);

4、 将CMainFrame类中的工具条对象改为CProgStatusBar m_wndStatusBar;

5、 重载CPrgsbarDoc::Serialize(CArchive& ar)函数,用来处理读取文件时的进度条仿真;

6、 添加代码,编译运行程序。

三 : [为学杯C组]趟进高二这条河

  高一是小溪,涓涓细流,两岸桃花落英缤纷;高二是河,一路向东,蜿蜒崎岖;高三是海,高一高二滴水集会于此,而我,现在正在高二这条河里奔腾向前。

  人们常说高考是人生的转折点,其实不然,高二亦是人生的转折点。高一的傻傻呆呆,高三的安静拼搏,唯独高二学子在学校很冲直撞,习惯了高中生活,也想着高考离我们甚远,自由,快乐,轻松充实着生活。趟进高二这条河,我意识到成功在此一举,在别人努力的时候努力,在别人松懈的时候更是自己超过他们之时。,我懂得了时机一到,要开始在大河中扬帆起航了。

  晚上,我经常躺在床上,人有各种想象萌发,我想象着高考考场上的拼命厮杀,想象着我拿到高校录取通知书后父母欣慰的样子,想象着大学的生活,甚至想象到了成人后自己的工作,生活…….伴随着各种想象进入梦中,迎接第二天的黎明。

  我看到同学在外面玩,我看到他们开心的样子,多少次想加入其中,就在灵魂出窍之时,仿佛灵魂在召唤,大学门向我打开,无数学哥学姐在想我呐喊加油。于是,静下心来重新回到座位上。有时,自己想过放弃,毕竟条条道路通罗马,但这种念头只是一扫大脑而过,因为我是个农村孩子,我没有显着的家庭背景,我没有腰缠万贯的爹,在这个勾心斗角的社会里要想立足,我明白。进入大学是我唯一的出路,人可以白手起家,但不可以手无寸铁,于是,努力,拼搏。

  趟进高二这条河,我变得安静,变得宽容,不会因为小事斤斤计较,因为我明白“躬自后而薄责于人,则远怨矣!”趟进高二这条河,我变的坚强,因为我知道“岁寒,然后知松柏之后凋也。”亦知道阳光总在风雨后;趟进高二这条河,我懂得了坚持,因为我真正读懂了“不积跬步,无以至千里,不积小流,无以成江河。”“锲而不舍,金石可镂,锲而舍之,朽木不折。”

  高二这条河,崎岖不平;高二这条河,路途很艰辛,但是,这又怎样,它阻挡不了追梦人的脚步,我也相信,经过不懈努力,我终将汇入大海,然后拍起无限高的浪花。

  一年半的时间,努力了意味着成功,高二的生活预告我们,要学会忍受孤独,忍受困难。

  趟进高二这条河,我改变和好多。我会向所有人证明,我不是年少轻狂

    高二:刘迪

四 : C#进度条的使用

设置进度栏的显示值的最直接方式是设置 Value 属性。(www.61k.com]该操作可以在设计时或运行时进行。

直接设置 ProgressBar 值

设置 ProgressBar 控件的 Minimum 和 Maximum 值。

在代码中,将该控件的 Value 属性设置为已设定的最小值与最大值之间的一个整数值。

注意

如果将 Value 属性设置为 Minimum 和 Maximum 属性设定的边界之外的值,该控件将引发 ArgumentException 异常。

下面的代码示例说明如何直接设置 ProgressBar 值。该代码从数据源中读取记录,并在每次读取数据记录时更新进度栏和标签。该示例要求窗体有一个 Label 控件、一个 ProgressBar 控件以及一个数据表,该数据表中名为 CustomerRow 的行具有 FirstName 和 Last Name 字段。

C# 复制代码 public void createNewRecords() { // Sets the progress bar's Maximum property to // the total number of records to be created.

progressBar1.Maximum = 20; // Creates a new record in the dataset. // NOTE: The code below will not compile, it merely // illustrates how the progress bar would be used.

CustomerRow anyRow = DatasetName.ExistingTable.NewRow(); anyRow.FirstName = "Stephen"; anyRow.LastName = "James";

ExistingTable.Rows.Add(anyRow);

// Increases the value displayed by the progress bar. progressBar1.Value += 1; // Updates the label to show that a record was read. label1.Text = "Records Read = " + progressBar1.Value.ToString();

}

如果要显示按固定时间间隔增长的进度,则可以设置该值,然后调用方法,使 ProgressBar 控件的值按该时间间隔递增。对于计时器以及其他一些您无法以整体的百分比测量进度的方案,这是非常有用的。

使进度栏按固定值递增

设置 ProgressBar 控件的 Minimum 和 Maximum 值。

c#进度条 C#进度条的使用

将控件的 Step 属性设置为一个整数,该整数代表进度栏的显示值递增的数量。[www.61k.com)

调用 PerformStep 方法,使显示值按 Step 属性中设置的数量进行更改。

下面的代码示例说明进度栏如何维护复制操作中的文件计数。 在下面的示例中,当每个文件读入内存时,进度栏和标签都会相应地更新,以反映读取的文件总数。该示例要求窗体有一个 Label 控件和一个 ProgressBar 控件。

C# 复制代码 public void loadFiles() { // Sets the progress bar's minimum value to a number representing // no operations complete -- in this case, no files read. progressBar1.Minimum = 0; // Sets the progress bar's maximum value to a number representing // all operations complete -- in this case, all five files read. progressBar1.Maximum = 5; // Sets the Step property to amount to increase with each iteration. // In this case, it will increase by one with every file read.

progressBar1.Step = 1;

// Uses a for loop to iterate through the operations to be // completed. In this case, five files are to be copied into memory, // so the loop will execute 5 times. for (int i = 0; i <= 4; i++) {

// Inserts code to copy a file progressBar1.PerformStep(); // Updates the label to show that a file was read. label1.Text = "# of Files Read = " + progressBar1.Value.ToString(); }

}

最后,可以使进度栏的显示值每次递增的数量都是唯一的。这在您记录一系列唯一的操作时非常有用,例如将不同大小的文件写入硬盘,或者按整体的百分比测量进度。

使进度栏按动态值递增

设置 ProgressBar 控件的 Minimum 和 Maximum 值。

调用 Increment 方法,使显示值按指定的整数进行更改。

下面的代码示例说明在复制操作期间,进度栏如何计算已使用的磁盘空间量。

c#进度条 C#进度条的使用

在下面的示例中,当每个文件写入硬盘时,进度栏和标签都会相应地更新,以反映可用的硬盘空间量。[www.61k.com]该示例要求窗体有一个 Label 控件和一个 ProgressBar 控件。

C# 复制代码 public void readFiles() { // Sets the progress bar's minimum value to a number // representing the hard disk space before the files are read in. // You will most likely have to set this using a system call. // NOTE: The code below is meant to be an example and // will not compile. progressBar1.Minimum = AvailableDiskSpace(); // Sets the progress bar's maximum value to a number // representing the total hard disk space. // You will most likely have to set this using a system call. // NOTE: The code below is meant to be an example // and will not compile.

progressBar1.Maximum = TotalDiskSpace(); // Uses a for loop to iterate through the operations to be // completed. In this case, five files are to be written // to the disk, so it will execute the loop 5 times.

for (int i = 1; i<= 5; i++) { // Insert code to read a file into memory and update file size. // Increases the progress bar's value based on the size of // the file currently being written.

progressBar1.Increment(FileSize); // Updates the label to show available drive space. label1.Text = "Current Disk Space Used = " + progressBar1.Value.ToString(); }

}

最好去看看MSDN

附: 由于需要,自己在网上搜了垂直进度条,可以玩玩 牛人真多!!!!

http://files.cnblogs.com/peterzb/VerticalProgressBar.rar

61阅读/ www.61k.net

五 : C#进度条实现实例

C#进度条实现实例是如何操作的呢?让我们看看下面的代码:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. //C#进度条实现实例
  4. usingSystem.ComponentModel;
  5. usingSystem.Data;
  6. usingSystem.Drawing;
  7. usingSystem.Text;
  8. usingSystem.Windows.Forms;
  9. namespace进度条2
  10. //C#进度条实现实例
  11. {
  12. publicpartialclassForm1:Form
  13. {
  14. privateBackgroundWorkerworker=
  15. newBackgroundWorker();
  16. intN=0;
  17. publicForm1()
  18. {
  19. InitializeComponent();
  20. worker.WorkerReportsProgress=true;
  21. worker.WorkerSupportsCancellation=true;
  22. worker.DoWork+=newDoWorkEventHandler(DoWork);
  23. worker.ProgressChanged+=
  24. newProgressChangedEventHandler(ProgessChanged);
  25. worker.RunWorkerCompleted+=
  26. newRunWorkerCompletedEventHandler(CompleteWork);
  27. }
  28. publicvoidDoWork(
  29. objectsender,DoWorkEventArgse)
  30. {
  31. e.Result=ComputeFibonacci(worker,e);
  32. }
  33. publicvoidProgessChanged(
  34. objectsender,ProgressChangedEventArgse)
  35. {
  36. progressBarX1.Value=e.ProgressPercentage;
  37. intV=(int)(e.ProgressPercentage/N);
  38. progressBarX1.Text=Convert.ToString(V)+"%";
  39. }
  40. //C#进度条实现实例
  41. publicvoidCompleteWork(
  42. objectsender,RunWorkerCompletedEventArgse)
  43. {
  44. progressBarX1.Text="处理完毕!";
  45. }
  46. privateintComputeFibonacci(
  47. objectsender,DoWorkEventArgse)
  48. {
  49. for(inti=0;i<=92800;i++)
  50. {
  51. if(worker.CancellationPending)
  52. {
  53. e.Cancel=true;
  54. return-1;
  55. }
  56. else
  57. { //C#进度条实现实例
  58. worker.ReportProgress(i);
  59. //引发ProgessChanged事件
  60. }
  61. }
  62. return-1;
  63. }
  64. privatevoidbtnStart_Click(
  65. objectsender,EventArgse)
  66. {
  67. N=92800/100;
  68. progressBarX1.Maximum=92800;
  69. worker.RunWorkerAsync();
  70. //开始执行后台操作
  71. }
  72. privatevoidbtnPause_Click(
  73. objectsender,EventArgse)
  74. {
  75. worker.CancelAsync();
  76. //请求暂停后台操作
  77. }
  78. } //C#进度条实现实例
  79. }

C#进度条实现实例的相关内容就向你介绍到这里,希望对你了解和学习C#进度条实现有所帮助。

本文标题:c进度条-C# WinForm进度条实现浅析
本文地址: http://www.61k.com/1145489.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1