(66大顺)请教各位:对话框的进度条

love_codecsde 2010-07-25 12:57:39
我的程序:
对话框A_Dlg中有一个按钮A_Btn;当按下A_Btn;运行一个函数C_pro,时间有个3到4秒,我想要实现的功能:当我按下A_Btn时,显示一个进度条,当C_pro运行完成后,进度条也自动关闭。如何实现,我是新手,请给出代码,在下感谢万分。。
本人没做个大的mfc,所以请各位尽量说得详细一点。。
...全文
237 1 收藏 23
写回复
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuwanxuwan 2012-04-05
貌似没这么简单吧,设计到多线程编程啊
回复
love_codecsde 2010-07-30
就是让他不在对话框中显示了。。。。程序运行完了,进度条当然要关闭或者隐藏。
回复
junliang0824 2010-07-30
你说的函数运行完的时候就关闭进度条,是什么意思,是叫它不显示在对话框中,还是不动,
要只是不动的话很简单 ,在函数运行过程中,设置进度条数值就可以了。
回复
love_codecsde 2010-07-29
谢谢你们的帮忙,我的问题还是没有完美的解决。。。
回复
austin_minny 2010-07-28
期待问题的解决!遇到同样问题
回复
xingpacer 2010-07-28
呵呵~我也只是简单的用过,帮忙顶一个吧~
回复
xingpacer 2010-07-28
先计算一下:假设你用的时间为3秒,而进度条设置为跳30次,则应该3s/30=100ms跳一次,这样就可以通过定时器来实现,具体参考代码如下:
(1)在进度条对话框CWaitDlg中拖入进度条,然后添加进度条变量:

CProgressCtrl m_progress;
m_nCalculagraph; //记录跳的次数(初始化为0)

(2)在进度条对话框CWaitDlg的OnInitDialog()中添加初始化代码:

#define ID_TIMER_PROCESS 505
......

BOOL CWaitDlg::OnInitDialog(void)
{
CDialog::OnInitDialog();

m_progress.SetRange(0, 30); //总共跳30次
m_progress.SetStep(1); //每次跳的步进值为1
m_progress.SetPos(0); //初始位置为0
m_nCalculagraph = 0; //计数,记录跳的次数,一共跳30次(3s)
SetTimer(ID_TIMER_PROCESS, 100, NULL); //100*30=3000,每100ms跳一次,跳30次正好3000ms

return TRUE;
}

(3)添加定时器响应函数:

void CWaitDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == ID_TIMER_PROCESS)
{
if(m_nCalculagraph < 30)
{
m_progress.StepIt(); //向前跳1次
m_nCalculagraph++; //计数
}
else //跳完30步,关闭定时器,退出对话框
{
KillTimer(ID_TIMER_PROCESS);
OnOK();
}

}

CDialog::OnTimer(nIDEvent);
}
回复
love_codecsde 2010-07-28
[Quote=引用 17 楼 chenlycly 的回复:]
我的代码应该能满足需求的,LZ试试吧
[/Quote]

你的代码很好,也很有水平,不过好像跟我的程序没申明关系,你的这个对话框该如何调用,你又怎么把它和C_pro函数完美结合呢?? 你的是假设的3秒,如果我不知道程序运行几秒又怎么办呢???????
回复
xingpacer 2010-07-28
我的代码应该能满足需求的,LZ试试吧
回复
love_codecsde 2010-07-27
void C_pro(CProgressCtrl * pctrl)
{
for(int i=0;i<100;i++)
{
pctrl->SetPos(i);
Sleep(30);
}

}
我的C_pro 有一些代码是执行过程的,那么,那个for 循环,应该怎样添加,就差这一步了。。。。。。。
回复
love_codecsde 2010-07-27
[Quote=引用 11 楼 fangongdalu7148 的回复:]
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_ctrl.ShowWindow(SW_SHOW);
C_pro(&m_ctrl);
m_ctrl.SetRange(0,100);
m_ctrl.SendMessage(WM_CLOSE);
}
……
[/Quote]
怎么还是不对啊。。。。。
回复
junliang0824 2010-07-26
就是在你那按钮里面添加代码操作进程控件,时间到了就关闭进程控件就好了
回复
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
m_ctrl.ShowWindow(SW_SHOW);
C_pro(&m_ctrl);
m_ctrl.SetRange(0,100);
m_ctrl.SendMessage(WM_CLOSE);
}
void C_pro(CProgressCtrl * pctrl)
{
for(int i=0;i<100;i++)
{
pctrl->SetPos(i);
Sleep(30);
}

}
回复
先在界面上创建一个CProcessCtrl控件,然后你在函数C_pro执行的过程中,定时调用CProcessCtrl的SetPos就可以了,当然set的值要是递增的
回复
love_codecsde 2010-07-25
大侠们,帮帮忙啊,我是用vc6.0做,急啊。
回复
love_codecsde 2010-07-25
如何把这个对话框的指针 给A_dlg,我是菜鸟,什么都不懂,来点代码啊!!!!!!!!
回复
love_codecsde 2010-07-25
C_pro() 是c类的成员函数,怎么能到A_dlg类呢???? 而且这个程序 也不能这样设置。。。。。
回复
flight9 2010-07-25
如果C_pro()是其他地方的函数,建议把对话框指针传给这函数,函数内疚可以操作进度条了(进度条设置为public)
回复
晕,,把C_pro() 添加或者设置成类成员函数,,类上点右键,添加成员函数,,
回复
love_codecsde 2010-07-25
没有实现,因为C_pro()不是A_Dlg的成员函数,C_pro是另一个类的函数。C_pro所属的类,没有对话框,请高手再次支招!!!
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告