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

love_codecsde 2010-07-25 12:57:39
我的程序:
对话框A_Dlg中有一个按钮A_Btn;当按下A_Btn;运行一个函数C_pro,时间有个3到4秒,我想要实现的功能:当我按下A_Btn时,显示一个进度条,当C_pro运行完成后,进度条也自动关闭。如何实现,我是新手,请给出代码,在下感谢万分。。
本人没做个大的mfc,所以请各位尽量说得详细一点。。
...全文
292 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuwanxuwan 2012-04-05
  • 打赏
  • 举报
回复
貌似没这么简单吧,设计到多线程编程啊
love_codecsde 2010-07-30
  • 打赏
  • 举报
回复
就是让他不在对话框中显示了。。。。程序运行完了,进度条当然要关闭或者隐藏。
junliang0824 2010-07-30
  • 打赏
  • 举报
回复
你说的函数运行完的时候就关闭进度条,是什么意思,是叫它不显示在对话框中,还是不动,
要只是不动的话很简单 ,在函数运行过程中,设置进度条数值就可以了。
love_codecsde 2010-07-29
  • 打赏
  • 举报
回复
谢谢你们的帮忙,我的问题还是没有完美的解决。。。
austin_minny 2010-07-28
  • 打赏
  • 举报
回复
期待问题的解决!遇到同样问题
dvlinker 2010-07-28
  • 打赏
  • 举报
回复
呵呵~我也只是简单的用过,帮忙顶一个吧~
dvlinker 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秒,如果我不知道程序运行几秒又怎么办呢???????
dvlinker 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
  • 打赏
  • 举报
回复
就是在你那按钮里面添加代码操作进程控件,时间到了就关闭进程控件就好了
zgsdzhaolanxiang1 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);
}

}
晒月光的青蛙 2010-07-25
  • 打赏
  • 举报
回复
先在界面上创建一个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)
zgsdzhaolanxiang1 2010-07-25
  • 打赏
  • 举报
回复
晕,,把C_pro() 添加或者设置成类成员函数,,类上点右键,添加成员函数,,
love_codecsde 2010-07-25
  • 打赏
  • 举报
回复
没有实现,因为C_pro()不是A_Dlg的成员函数,C_pro是另一个类的函数。C_pro所属的类,没有对话框,请高手再次支招!!!
加载更多回复(3)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧