如何在程序执行比较长时间的处理时弹出一个等待对话框 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
谢谢!