如何刷新对话框中的进度条

yu_sn0w 2015-07-10 10:12:18
我要弄一个对话框程序,对话框中有一个进度条,表示软件更新的进度。先假设更新的实际操作暂时模拟一下,比如循环十一次,从0%,10%更新到100%结束。点击确定。退出。
问题是主要代码:
CUpdateDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
//
}

如何实现进度条刷新呢?DoModal选择OK之后啥都没了。能不能先让他进度条一直刷新,最后选择OK。或者别的方式实现等同效果
...全文
256 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu_sn0w 2015-07-16
  • 打赏
  • 举报
回复
目前的方案是 AfxBeginTHread(SetProgress, (lPVOID)&dlg); dlg.DoModual(); 感谢大家回帖。
笨笨仔 2015-07-12
  • 打赏
  • 举报
回复
这么简单的问题也会搞的如此复杂。 你的进度条窗口被DoModal()后,窗口内部不退出怎么会到OK? 进入进度窗口后,初始化时禁掉OK键,在进度结束时激活它,再点击就完成了,如果要自动关闭可以在完成后直接调用OK键处理函数。至于窗口间的数据交换应该会吧?
chopin3 2015-07-11
  • 打赏
  • 举报
回复
服了。。。。谁提出用Create代替再加线程的。。。你加的地方不对,你要搞清楚原理,执行CDialog::DoModal(),会创建对话框,此时会走CDialog::OnInitDialog函数,你在那里面加个定时器操作进度条不就完了吗?你放在DoModal之后是不可以的,因为DoModal执行完该对话框已销毁,包括里面的进度条什么的,你可以在该对话框类内部处理OnInitDialog
  • 打赏
  • 举报
回复
引用 7 楼 king191923157 的回复:
我原来做进度条,刷新比较多 新起个线程更新的,数据少没试过
正解!你应该新起一个线程来更新进度条,如果你在主线程里弄,可能会导致对话框无响应。
c_upsoft 2015-07-11
  • 打赏
  • 举报
回复
消息阻塞了,做个消息的分发,网上搜下
king191923157 2015-07-10
  • 打赏
  • 举报
回复
我原来做进度条,刷新比较多 新起个线程更新的,数据少没试过
king191923157 2015-07-10
  • 打赏
  • 举报
回复
好多年不用VC了,你试试这个吧 dlg.Create(IDD_UPDATE_DIALOG, &dlg); dlg.ShowWindow(SW_SHOW); while(dlg.GetCurProgressValue < 100) { dlg.AddProgressValue(10); Sleep(10); }
yu_sn0w 2015-07-10
  • 打赏
  • 举报
回复
dlg.Create(IDD_UPDATE_DIALOG, &dlg); while(dlg.GetCurProgressValue < 100) { dlg.ShowWindow(SW_SHOWNA | SW_SHOWNOACTICATE); dlg.AddProgressValue(10); } dlg.ShowWindow(SW_SHOWNA | SW_SHOWNOACTICATE); 麻烦看下这里有什么问题。创建没问题。进入循环之后对话框就卡死了。因为调试的时候肯定是VC 程序在桌面上,进入循环后,点不开对话框了。完全卡死。还有就是ShowWindow可选模式太多了。感觉我这个写应该是错的。麻烦帮看看。没写过MFC。
king191923157 2015-07-10
  • 打赏
  • 举报
回复
你可以不用.DoModal()创建对话框用create 你可以加刷新按钮,关闭按钮
yu_sn0w 2015-07-10
  • 打赏
  • 举报
回复
还有就是刷新流程加在哪里?我的感觉是DoModal调用完会获取到OK或者别的点击信息。然后对话框废了。再也弄不出来,除非新建一个对话框,表现的和之前的一样或者延续之前的状态。比如伪码: DlgA(进度10); DlgB(进度20); 。。。 如何实现: DlgA.SetProgreddValue(10); ShowWindow(); DlgA.SetProgreddValue(20); ShowWindow(); ..这种效果
yu_sn0w 2015-07-10
  • 打赏
  • 举报
回复
引用 1 楼 king191923157 的回复:
你可以把ok按钮设置不能用,进度条走完之后再设置可以使用啊 按钮。enablewindows(好像是这个函数)
我的对话框没有关闭键,只能通过点击确定或者取消退出。现在设置成不可用了,如何刷新进度条呢? 我设置进度的函数,增加进度函数都写好了,关键是这种效果怎么实现,就是进度条一直在增加。 谢谢~
king191923157 2015-07-10
  • 打赏
  • 举报
回复
你可以把ok按钮设置不能用,进度条走完之后再设置可以使用啊 按钮。enablewindows(好像是这个函数)
yu_sn0w 2015-07-10
  • 打赏
  • 举报
回复
BOOL bCreateSuccess = dlg.Create(IDD_UPDATE_DIALOG, &dlg); if (!bCreateSuccess) { return FALSE: // 创建失败,返回 } dlg.ShowWindow(SW_SHOW); while(dlg.GetCurProgressValue < 100) { dlg.AddProgressValue(10); Sleep(10); } 感谢楼上回复。我的现象是:执行了Create之后对话框就出现了,且进度条没有进度(为0),但是实际进度应该是55(我的设定),同时我有一个静态文本框显示了“当前进度55%”;文本框的设置和进度条的SetPos是一样进行的。 最关键的是这时候的对话框是卡死的,不能通过点击任务兰的程序图标点出来,而是最小化桌面的其他图标看见的。鼠标放在上面一直打圈,后面我增加进度文本框内容正确变化了。别的不变。依然卡死。 期望大神回复。

16,370

社区成员

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

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

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