如何在程序执行比较长时间的处理时弹出一个等待对话框 VC/MFC / 基础类

来源:百度文库 编辑:神马文学网 时间:2024/04/28 07:00:30

如何在程序执行比较长时间的处理时弹出一个等待对话框

楼主shjqk(QQ)2003-09-16 10:01:53 在 VC/MFC / 基础类 提问

我的程序有几处比较长时间处理的过程,我想弹出一个提示用户的等待对话框  
  我如果用DoModal显示对话框后就停在那了  
  我看了一些程序的效果,好象是模态对话框,但后面的程序也在做处理。  
  请问该怎么做  
  问题点数:50、回复次数:14Top

1 楼milson(ifaq)回复于 2003-09-16 10:09:56 得分 5

I   think   you   should   use   another   thread   to   shouw   the   wait   dialog.Top

2 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-16 10:11:58 得分 30

CDlg   dlg;  
  dlg.Create(ID....);  
  dlg.ShowWindow(RE_STORE);Top

3 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-16 10:13:00 得分 0

关闭对话框:  
  其实,一般窗口的销毁可以用DestoryWindow(),对话框的销毁可以用EndDialiog().  
  EndDialog(IDOK);  
  DoModal()的返回值为IDOK,但不会执行用户定义的OnOK.  
  只要发送WM_CLOSE消息,就会有响应的函数处理的。  
  SendMessage(WM_CLOSE);  
  PostMessage(WM_CLOSE);  
   
  void   CTestDialog::OnButton1()    
  {  
  GetParent()->DestroyWindow();  
  }  
  窗口和对话框一起关  
  PostMessage(WM_QUIT);  
  SendMessage(WM_QUIT);//不行  
  无模式对话框用DestroyWindow();  
  用EndDialog  
  你再打开原对话框就有问题  
  自动添加的OnOK也要改Top

4 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-16 10:13:26 得分 0

技术上可行  
  符合你的要求吗?  
  如果不明白  
  请给我发短消息  
  请附:   帖子的地址Top

5 楼whoishere(我来也)回复于 2003-09-16 10:16:03 得分 0

如果是模式对话框的话,那么就要另外开一个线程了。  
  一个做法就是在提示用户等待的对话框的OnInitDialog中创建一个线程,  
  然后在该线程中进行长时间的处理过程,  
  同时该线程还可以控制等待对话框显示一些提示信息Top

6 楼shootingstars(有容乃大,无欲则刚)回复于 2003-09-16 10:35:22 得分 5

使用多线程  
  一下是.cpp文件  
   
  //显示“初始化”对话框  
  int     InitDlgRes;  
  //   对话框处理函数  
  static   LRESULT   CALLBACK   InitDlgProc(HWND   hwnd,   UINT   iMsg,    
        WPARAM   wParam,   LPARAM   lParam)   {  
  switch   (iMsg)   {  
  case   WM_INITDIALOG:  
  {  
  CentreWindow(hwnd);  
  return   TRUE;  
  }  
   
  case   WM_CLOSE:  
  EndDialog(hwnd,   TRUE);  
  return   TRUE;  
   
  }  
  return   FALSE;  
  }  
   
  DWORD   WINAPI   InitDlgThreadProc(LPVOID   lpParameter){  
  InitDlgRes   =   DialogBox(pApp->m_instance,    
    DIALOG_MAKEINTRESOURCE(IDD_INITDLG),  
  NULL,   (DLGPROC)   InitDlgProc);  
  return   TRUE;  
  }  
   
  void   ShowInitDlg()  
  {  
  LPSECURITY_ATTRIBUTES   lpta   =   NULL;  
  DWORD   dwsz   =   0;  
  LPTHREAD_START_ROUTINE   lpsr   =   InitDlgThreadProc;  
  LPVOID   lpp   =   NULL;  
  DWORD   dwcf   =   0;  
  DWORD   lptid;  
  HANDLE   handle   =   CreateThread(  
  lpta,     //   pointer   to   security   attributes  
  dwsz,         //   initial   thread   stack   size  
  lpsr,           //   pointer   to   thread   function  
  lpp,             //   argument   for   new   thread  
  dwcf,           //   creation   flags  
  &lptid         //   pointer   to   receive   thread   ID  
  );  
   
  }  
   
  void   EndInitDlg(){  
  Sleep(1000);  
  HWND   hwnd   =   FindWindow(NULL,"你的对话框的名字");  
  if(hwnd){  
  PostMessage(hwnd,WM_CLOSE,NULL,NULL);  
  }  
  }  
   
  以下是.h文件  
  void   ShowInitDlg();  
  void   EndInitDlg();  
   
  在耗时的地方前面加上ShowInitDlg();后面加上EndInitDlg();Top

7 楼blue2moon(蓝狐)回复于 2003-09-16 10:48:24 得分 0

CDlg   dlg;  
  dlg.Create(ID....);  
  dlg.ShowWindow(SW_SHOW);  
  最好加一个progressbar动态显示进度  
  Top

8 楼wangweintk(枫杨)回复于 2003-09-16 10:54:54 得分 0

可以做一个动态链接库,在以后的其它程序中也可以使用。Top

9 楼milson(ifaq)回复于 2003-09-16 11:09:59 得分 0

he_zhidan(何志丹:壮志在我心)   (   )   说的方法好像最简单了,我也写了  
  测试代码  
  CDialog   dlg;  
  dlg.Create(IDD_DIALOG1);  
  dlg.CenterWindow(this);  
  dlg.SetDlgItemText(IDT_WAIT,   "Wait   begin......");  
  dlg.ShowWindow(SW_SHOWNOACTIVATE);  
  CString   str;  
  for(int   i=0;i<5;i++){  
  Sleep(1000);  
  str.Format("Wait......%02d",   i+1);  
  dlg.SetDlgItemText(IDT_WAIT,   str.GetBuffer(0));  
  }  
  Sleep(1000);  
  dlg.SetDlgItemText(IDT_WAIT,   "Wait   end");  
  Sleep(1000);  
  dlg.EndDialog(0);Top

10 楼tonybaobao(Tony宝宝)回复于 2003-09-16 11:14:19 得分 0

三星金将军都说了,没什么好说了,呵呵Top

11 楼shjqk(QQ)回复于 2003-09-16 11:21:25 得分 0

谢谢  
  为什么我用dlg.SetDlgItemText(IDT_WAIT,   "Wait   begin......");  
  不能设置提示语言啊  
  还有就是如何让弹出的等待框在父窗体的中央啊?  
  请教,谢谢Top

12 楼heartliubin(bin)回复于 2003-09-16 11:43:29 得分 0

好像应该是有一个:CenterWnd的函数,记不清楚了  
   
  你应该在窗口中画一个静态控件,把ID设置为IDT_WAIT,就可以了Top

13 楼lightwell(大道不过两三行)回复于 2003-09-16 11:56:05 得分 10

修改一下:  
  CDialog   dlg;  
  dlg.Create(IDD_DIALOG1);  
                    dlg.SetParent(this);//设置父窗口  
  dlg.CenterWindow(this);  
  dlg.SetDlgItemText(IDT_WAIT,   "Wait   begin......");  
  dlg.ShowWindow(SW_SHOWNOACTIVATE);  
  CString   str;  
  for(int   i=0;i<5;i++){  
  Sleep(1000);  
  str.Format("Wait......%02d",   i+1);  
  dlg.SetDlgItemText(IDT_WAIT,   str.GetBuffer(0));  
  }  
  Sleep(1000);  
  dlg.SetDlgItemText(IDT_WAIT,   "Wait   end");  
  Sleep(1000);  
  dlg.EndDialog(0);  
  Top

14 楼shjqk(QQ)回复于 2003-09-16 12:04:49 得分 0

我加了控件,但好象不起作用Top

15 楼shjqk(QQ)回复于 2003-09-16 13:28:45 得分 0

谢谢!

如何在程序执行比较长时间的处理时弹出一个等待对话框 VC/MFC / 基础类 dll中如何得到一个对话框的句柄 - VC/MFC / 基础类 如何让基于对话框的MFC程序启动后自动隐藏对话框 VC/MFC / 界面 2如何让基于对话框的MFC程序启动后自动隐藏对话框 VC/MFC / 界面 - 社区 community.csdn.net 编译成release版本与debug版本的程序有何执行上的区别? VC/MFC / 基础类... 用独立线程解决弹出模态对话框后执行自定义函数问题 - VC/MFC - 提供最全面实用的J... 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 如何将CString转换为char[] VC/MFC / 基础类 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 - CSDN社区 community.csdn.net 如何让基于对话框的MFC程序启动后自动隐藏对话框--==>肯肯编程小屋<== 接触VC之二:MFC类基础,C++程序编写规范介绍 MFC中基于对话框程序快捷键的实现 MFC中基于对话框程序快捷键的实现 求助:软件加密方式! - VC/MFC / 基础类 在ADO中如何获得一个表中记录的总数? VC/MFC / 数据库 - CSDN社区 com... MFC程序的消息处理顺序 (zz) Confirm对话框在数据库操作前的弹出 ASP.NET中使用AJAX时如何弹出对话框 ASP.NET中使用AJAX时如何弹出对话框 VC知识库文章 - MFC程序员的WTL指南: Part IV - 对话框与控件 【原创&交流】PE文件格式的一些研究 - VC/MFC / 基础类 如何在Internet Explorer的右键菜单加上一个命令,并且和我的程序关??VC/... 如何在Internet Explorer的右键菜单加上一个命令,并且和我的程序关??VC/... VC中, 为何每次都要重新编译? VC/MFC / 基础类 - CSDN社区 commu...