如何用MFC做一个进度条

如何用MFC做一个进度条,第1张

第一种,用printf模拟输出百分比,在控制台输出,实现进度监控。

#include<stdio.h>

#define N 20

void mBar(float fBar){

int i,j,k,m

for ( i=0i<N+6i++ ) printf("\b")

k=N*fBarm=fBar*100printf("[")

for ( i=0i<ki++ ) printf("=")

for ( j=0j<N-kj++ ) printf(" ")

printf("]%3d%%",m)

}

void delay(int n) { int i,j,kfor ( i=0i<ni++ ) for ( j=0j<0x07fffj++ ) k++}

void main()

{

float x

int i

for ( i=0,x=0i<100i++,x+=0.01 ) { mBar(x)delay(1024)}

mBar(1)

}

第二种,使用窗口组件。这个要看程序工作环境,纯粹的c语言是无法实现的。可以使VC++。Visual C++中的MFC类提供了标准的进度指示器控件(CProgressCtrl)。

m_progress->GetPos()//获取进度条的当前位置

m_progress->GetRange(int min,int max)//获取进度条控件的范围的下限和上限

m_progress->OffsetPos(int nPos)//用指定的增量推进进度条控件的当前位置,重绘进度条反映新位置

m_progress->SetBkColor(COLORREF clrNew)//设定进度条的背景颜色

m_progress->SerPos(int nPos)//设定进度条控件的当前位置,重绘进度条反映新位置

m_progress->SetRange(int min,int max)//设定进度条控件的范围的下限和上限

m_progress->SetRange32(int min,int max)//设定进度条控件的范围的下限和上限

m_progress->SetStep(int nStep)//指定进度条控件的步进增量

m_progress->StepIt()//通过步进增量,推进进度条控件的当前位置,重绘进度条反映新位置

应用:

CProgressCtrl *m_progress//头文件中声明

在OnInitDialog初始化

{

m_progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1)

m_progress->SetRange(0,1000)

m_progress->SetPos(0)

UINT m_timer =(UINT) SetTimer(1,200,NULL)

}

采用在定时器的消息处理函数WM_TIMER内添加不断更新进度条界面的方法

OnTimer (nIDEvent)

{

pos = pos + 50

if(pos>500)

pos = 0

m_Progress->SetPos(pos)

}

或者采用在某种循环体内添加不断更新进展条界面的方法

以Dialog为例简单说明一下:

在Dialog上添加Progress Control控件, 关联控件变量为m_progress_demo

在Dialog所属的类的OnInitDialog()函数里面(新类的话需要手工添加OnInitDialog()函数), 增加初始化处理: m_progress_demo.SetRange(0, 100)m_progress_demo.SetPos(0)表示显示的进度为0~100之间,而且进度从0开始。

在需要进度条更新的场合下,比如进度20,增加:m_progress_demo.SetPos(20) 

你进度条具体的建立过程不知道有没有遗漏的?

将 progress控件拖放到dlg上,然后用mfc向导为他建立一个变量,m_Pro,为dlg类的成员变量。(这时vc会自动帮你把变量与控件建立好联系)

还有就是,进度条的进度显示你最好单弄一个线程,不要影响dlg的本身 *** 作。

--------------------

线程问题不是你这问题的重点,具体要看你的工程需求,我看到你这里用了for循环,如果一直在循环里,可能在短时间内造成你的dlg假死现象。把进度显示和里面的 *** 作放到一个循环中时,最好是在线程里。这里只是优化而已,线程的创建使用可以单查下教程了。

你的问题重点是那个无效句柄

你的无效句柄问题设个断点具体调试看看吧。我只能向你猜测几种可能。

也许你的工程是个文档工程,然后临时创建了一个包含进度条对话框。如果是这种情况,大概就是你的对话框对象提前析构导致的。你可以把声明dlg对象的代码 改成 new一个dlg指针 来替代(记得在dlg析构里delete this)

也许你是用DoModle方法调用的dlg,当IDOK后调用一些列函数,包括Step()

这种情况类似上面,IDOK后dlg析构了,再调用dlg对象可能会产生一些错误。可以改用非模态方法创建。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11651998.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存