CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

如何解决在用户移动窗口时,窗口中的进度条刷新的问题,先谢谢了。

楼主gzl(HR)2004-09-03 16:39:38 在 VC/MFC / 界面 提问

大家看到windows资源管理器中复制文件时的进度对话框了吧,用户移动时,它还会指示当前的操作进度。我现在做了个加/解密的进度对话框,用了2个线程,可是,当用户移动它时,进度就停止刷新了,可是后台还在工作啊!如何做到windows资源管理器的效果!!  
   
   
    感谢!!感谢!! 问题点数:30、回复次数:3Top

1 楼yaozijian110()回复于 2004-09-03 17:07:39 得分 20

你是怎么实现进度条的走动的?  
  如果是用全局变量表示进度,在线程中改变这个变量的值,在对话框中每隔一定时间刷新的话,是不行的。因为移动窗口的时候,进入一个特殊的模态过程,它会阻止窗口过程的执行的。  
  你可以把更新进度条的操作放到线程里面,这样即使拖动窗口,后台的线程也可以刷新进度条。  
   
  下面的程序是我写着玩的,希望对你有一定的参考价值:  
   
  DWORD   CALLBACK   CalculateProc(LPVOID   p)  
  {  
  THREAD_PARAM   *param   =   (THREAD_PARAM   *)p;  
  UINT   n,result,i;  
  HWND     hProgressBar;  
   
  n   =   param->n;  
  result   =   1;  
  hProgressBar   =   ::GetDlgItem(param->hDlg,IDC_PROGRESS1);  
  DWORD   dwError   =   GetLastError();  
  for(i   =   1;   i   <=   n;   i++)  
  {  
  result   *=   i;  
  //显示进度  
  ::SendMessage(hProgressBar,PBM_SETPOS,100   *   i   /   n,0);  
  //看有没有取消的请求  
  if   (WaitForSingleObject(param->hCancel,0)   ==   WAIT_OBJECT_0)  
  return   0;  
  }  
  param->result   =   result;  
  return   0;  
  }  
   
  void   CTempttDlg::OnCal()    
  {  
  UINT     nID;  
  DWORD   dwID;  
   
  nID   =   GetWindowLong(m_wndcal.m_hWnd,GWL_ID);  
   
  if   (nID   ==   IDC_CAL)  
  {  
  if   (m_param   ==   NULL)   m_param   =   new   THREAD_PARAM;  
   
  m_param->hDlg   =   this->m_hWnd;  
  m_param->n         =   2000000;  
  m_param->hCancel   =   CreateEvent(NULL,FALSE,FALSE,NULL);  
   
  ::SetWindowText(m_wndcal.m_hWnd,TEXT("取消计算"));  
  ::SetWindowLong(m_wndcal.m_hWnd,GWL_ID,IDC_CANCLE);  
  //启动计算线程  
  CreateThread(NULL,0,CalculateProc,(LPVOID)m_param,0,&dwID);  
  }  
  else   if   (nID   ==   IDC_CANCLE)  
  {  
  if   (MessageBox(TEXT("真的要取消计算吗?"),TEXT("取消计算"),MB_YESNO)   ==   IDYES)  
  {  
  SetEvent(m_param->hCancel);  
  ::SetWindowText(m_wndcal.m_hWnd,TEXT("计算"));  
  ::SetWindowLong(m_wndcal.m_hWnd,GWL_ID,IDC_CAL);  
  m_progress.SetPos(0);  
  }  
  }  
  }  
  Top

2 楼evlon(阿牛)回复于 2004-09-03 17:22:02 得分 10

把设置操作放在工作线程中.同意楼上!Top

3 楼gzl(HR)回复于 2004-09-04 11:00:54 得分 0

对话框在一个界面线程中,加/解密操作在主线程中。通过主线程向界面线程中postmessage来更新界面的。Top

相关问题

  • 请问“进度条” 如何刷新。
  • gauge进度指示刷新的问题
  • 刷新applet弹出来的进度条
  • 怎么防止用户刷新本页面。另,用PHP怎么才可以做进度条,用JSP也行,谢谢!
  • 如何刷新用户区?
  • 请问:使用“进度条”时 如何刷新窗口。
  • 1,文件刷新问题;2,进度条问题
  • 高分求助:如何无抖动,无ie进度条刷新!!
  • 有没有办法屏蔽刷新时的进度条???
  • 用户控件的刷新问题

关键词

  • 线程
  • 移动
  • idc
  • 用户
  • 界面
  • null
  • 进度
  • wndcal
  • 刷新
  • 对话框

得分解答快速导航

  • 帖主:gzl
  • yaozijian110
  • evlon

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo