如何使用进程控件来实现mfc进度条控件的显示

[vb编程]窗体内标签\进度条等控件显示在程序进程运行的时候不刷新_百度知道
[vb编程]窗体内标签\进度条等控件显示在程序进程运行的时候不刷新
我在窗体中加入了几个label和进度条, 然后在main函数和各个子函数中通过修改这几个控件显示的值来反映程序进行到哪一步. 但是我运行程序的时候整个窗体是卡死的, 就好像死机一样. 系统在后台运行完整个程序之后, 窗体及各个label才刷新.
这不是我想要的效果. 我想实现在程序运行的时候标签能够实时刷新. 请教各位高手.. 我的程序结构大概是这样的: sub main form1.label.text = &现在进行的是f1&f1() form1.label.text = &现在进行的是f2&f2() form1.label.text = &现在进行的是f3&f3() form1.label.text = &现在进行的是f4&f4() end sub function f1() for i = 0 to 10000for j = 0 to 10
form1.label2.text = &现在正在处理& & i & & 和 & & j
nextnext end function...在子函数里对label2的值的修改就不实时刷新, 要等到程序结束之后才刷新..
另外, 我为了方便查找, 我的main函数放在了一个模块里, f1函数放在了另一个模块里. 是因为这个原因么?
function f1()for i = 0 to 10000for j = 0 to 10
form1.label2.text = &现在正在处理& & i & & 和 & & j
'加上这行!其他子函数也这样处理nextnextend function
来自团队:
其他类似问题
为您推荐:
vb编程的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁使用MediaElement播放时,怎样用slider控件来同步显示播放进度?
[问题点数:40分]
使用MediaElement播放时,怎样用slider控件来同步显示播放进度?
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2008年12月 移动平台大版内专家分月排行榜第一
2009年3月 移动平台大版内专家分月排行榜第三2009年1月 移动平台大版内专家分月排行榜第三2008年11月 移动平台大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。天极传媒:天极网全国分站
您现在的位置:
& &&VC技巧:在程序的状态栏中实现进度条
VC技巧:在程序的状态栏中实现进度条
天极开发 08:23
  读者朋友们可能天天使用这个强大的工具来开发程序,不知道注意到没有,Visual++每次装载一个项目的时候,为了使项目加载过程不至于太单调,会在状态栏的左半部分会出现一个装载进度条,用来即时显示Visual C++装载项目的进度,当项目装载完毕后,进度条隐藏。那么这个功能是如何实现的呢?为了说明该功能的实现原理,本例提供了一个范例程序prgsbar,它演示了在编辑视图里显示文本文件,在加载文本文件时,在界面的状态条中的进度指示器仿真显示文件的加载过程,当文本装载完毕后,进度条隐藏。由于该程序在装载文件显示的进度条时无法进行拷屏操作,所以这里没有给出状态条中显示进度条的界面效果图,读者可以运行本书所带光盘中的程序代码观看相应的效果。   一、实现方法  虽然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(...); CR 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消息调用暗示信息。这是从文档到视图/框架传递进度控制信息的最省事的方式。
(作者:刘涛责任编辑:方舟)
欢迎在新浪微博上关注我们
办公软件IT新闻整机
document.write("");如何使用进程控件来实现进度的显示_百度知道
如何使用进程控件来实现进度的显示
提问者采纳
一、实现原理
采用一个完整的图片来作为进度条,每次当进度条改变时,采用先贴图再用背景色擦去不需显示的一段进度的方法来实现进度条的变化,可实现制作任何复杂美观的进度条。
二、准备工作
首先需准备一个如下图样式的进度条图片(当然你可以做你自己喜欢的样式)。然后在窗体中加入一PictureBox控件,属性设置如下:
AutoSize:True
Appearance:Falt
AutoRedraw:True
ScaleMode:
Picture:〃准备的图片〃
再加一辅助控件(只用于保存图片,方便快捷地使用进度条)Image,属性设置如下:
Picture:〃准备的图片〃
Visible:FALSE
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何让程序执行的时候PROGRESS显示进度条,如何实现?希望高手给个源代码做个例子。
[问题点数:40分,结帖人keghappy]
如何让程序执行的时候PROGRESS显示进度条,如何实现?希望高手给个源代码做个例子。
[问题点数:40分,结帖人keghappy]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 asp.net进度条控件 的文章

 

随机推荐