一 : C# WinForm进度条实现浅析
C# WinForm进度条实现:首先是进度条窗体,需要在上面添加进度条,然后去掉ControlBox。除此外,还要增加一个方法,用来控制进度条的增加幅度,具体如下:
- ///﹤summary﹥
- ///Increaseprocessbar
- ///﹤/summary﹥//C# WinForm进度条实现
- ///﹤paramname="nValue"﹥thevalueincreased﹤/param﹥
- ///﹤returns﹥﹤/returns﹥
- publicboolIncrease(intnValue)
- {
- if(nValue﹥0)
- {
- if(prcBar.Value+nValue﹤prcBar.Maximum)
- {
- prcBar.Value+=nValue;
- returntrue;
- }
- else
- {
- prcBar.Value=prcBar.Maximum;
- this.Close();
- returnfalse;
- }
- }
- returnfalse;
- }
C# WinForm进度条实现之主窗体:
如何进行操作了,首先需要定义两个私有成员,一个委托。其中一个私有成员是保存当前进度条窗体对象,另一个是保存委托方法(即增加进度条尺度),具体如下:
- privatefrmProcessBarmyProcessBar=null;
- privatedelegateboolIncreaseHandle(intnValue);
- privateIncreaseHandlemyIncrease=null;
C# WinForm进度条实现之在主窗体中提供函数来打开进度条窗体,如下:
- ///﹤summary﹥
- ///Openprocessbarwindow
- ///﹤/summary﹥
- privatevoidShowProcessBar()
- {
- myProcessBar=newfrmProcessBar();
- //Initincreaseevent
- myIncrease=
- newIncreaseHandle(myProcessBar.Increase);
- myProcessBar.ShowDialog();
- myProcessBar=null;
- }
C# WinForm进度条实现之开始创建线程来运行,具体如下:
- ///﹤summary﹥
- ///Subthreadfunction
- ///﹤/summary﹥
- privatevoidThreadFun()
- {
- MethodInvokermi=
- newMethodInvoker(ShowProcessBar);
- this.BeginInvoke(mi);
- Thread.Sleep(1000);
- //Sleepawhiletoshowwindow
- boolblnIncreased=false;
- objectobjReturn=null;
- do
- {
- Thread.Sleep(50);
- objReturn=this.Invoke(
- this.myIncrease,
- newobject[]{2});
- blnIncreased=(bool)objReturn;
- }
- while(blnIncreased);
- }
注意以上,在打开进度条窗体和增加进度条进度的时候,一个用的是BeginInvoke,一个是Invoke,这里的区别是BeginInvoke不需要等待方法运行完毕,而Invoke是要等待方法运行完毕。还有一点,此处用返回值来判断进度条是否到头了,如果需要有其他的控制,可以类似前面的方法来进行扩展。
C# WinForm进度条实现之启动线程,可以如下:
- ThreadthdSub=newThread(
- newThreadStart(ThreadFun));
- 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#进度条实现实例是如何操作的呢?让我们看看下面的代码:
- usingSystem;
- usingSystem.Collections.Generic;
- //C#进度条实现实例
- usingSystem.ComponentModel;
- usingSystem.Data;
- usingSystem.Drawing;
- usingSystem.Text;
- usingSystem.Windows.Forms;
- namespace进度条2
- //C#进度条实现实例
- {
- publicpartialclassForm1:Form
- {
- privateBackgroundWorkerworker=
- newBackgroundWorker();
- intN=0;
- publicForm1()
- {
- InitializeComponent();
- worker.WorkerReportsProgress=true;
- worker.WorkerSupportsCancellation=true;
- worker.DoWork+=newDoWorkEventHandler(DoWork);
- worker.ProgressChanged+=
- newProgressChangedEventHandler(ProgessChanged);
- worker.RunWorkerCompleted+=
- newRunWorkerCompletedEventHandler(CompleteWork);
- }
- publicvoidDoWork(
- objectsender,DoWorkEventArgse)
- {
- e.Result=ComputeFibonacci(worker,e);
- }
- publicvoidProgessChanged(
- objectsender,ProgressChangedEventArgse)
- {
- progressBarX1.Value=e.ProgressPercentage;
- intV=(int)(e.ProgressPercentage/N);
- progressBarX1.Text=Convert.ToString(V)+"%";
- }
- //C#进度条实现实例
- publicvoidCompleteWork(
- objectsender,RunWorkerCompletedEventArgse)
- {
- progressBarX1.Text="处理完毕!";
- }
- privateintComputeFibonacci(
- objectsender,DoWorkEventArgse)
- {
- for(inti=0;i<=92800;i++)
- {
- if(worker.CancellationPending)
- {
- e.Cancel=true;
- return-1;
- }
- else
- { //C#进度条实现实例
- worker.ReportProgress(i);
- //引发ProgessChanged事件
- }
- }
- return-1;
- }
- privatevoidbtnStart_Click(
- objectsender,EventArgse)
- {
- N=92800/100;
- progressBarX1.Maximum=92800;
- worker.RunWorkerAsync();
- //开始执行后台操作
- }
- privatevoidbtnPause_Click(
- objectsender,EventArgse)
- {
- worker.CancelAsync();
- //请求暂停后台操作
- }
- } //C#进度条实现实例
- }
C#进度条实现实例的相关内容就向你介绍到这里,希望对你了解和学习C#进度条实现有所帮助。
本文标题:c进度条-C# WinForm进度条实现浅析61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1