在VC中调用OnOK()为什么不会关闭对话框,

我在对话框中定义的是点击确定键,就会调用另外的一个窗口,但是这时这个对话框不关闭,另一个小的窗口 也出现了。要怎样才能关闭这个对话框啊?
 我来答

答题抽奖

首次认真答题后

即可获得3次抽奖机会,100%中奖。

更多问题
邀请更新
2013-12-07 最佳答案

OnOK没有运行完成的话,窗口是不会消失的。

但是OnOK完成的话,窗口就关闭了,和对话框程序的框架是冲突的

我的理解是,你现在需要一个这样的程序,即使主窗口不在了它也能正确运行。

基于Dialog的程序框架不修改的话是无法满足这个要求,因为这个框架下,一旦主窗口被销毁,程序就退出了


修改程序框架,使得主窗口销毁以后程序还能继续运行,修改程序启动时入口点的DoModal,以及修改另一个对话框的打开方式(不用DoModal打开),手动添加消息循环

修改对话框关闭时的行为(正常情况下对话框关闭使得DoModal返回,现在要在需要退出程序的时候抛出WM_QUIT,否则消息循环不会结束,程序也无法退出。


要注意的地方就是,所有可能会导致“最后一个对话框消失”的地方,都要加上AfxPostQuitMessage,否则程序就会无法正常退出


全工程搜索“注意这里”四个字,可以看到我特别加上的注释


其他地方DoModal还是可以用的,归纳一下是,

DoModal函数在对话框关闭之前不会返回,

空雪梦见

采纳率:78% 来自团队:快乐之家 擅长: C/C++ C#/.NET VC++

其他回答

/*CTestDlg dlg;
dlg.DoModal();
ShowWIndow(SW_HIDE);*///这里建议用非模态对话框。
在你弹出的对话框中,点击按钮:
CParentDlg *p=(CParentDlg*)GetParent(); //如果主窗口没有显示出来。你要用exit(1)关闭掉当前窗口,不然程序会在后台一直运行的。
p->ShowWindow(SW_SHOW);//这时候主窗口就显示出来了。
絕情—離慶 | 发布于2013-12-05
评论
估计你是在一个模态窗口(用 DoModal() 打开)上打开了另一个模态窗口(用 DoModal() 打开)。
最好改成一个模态窗口关闭后,根据 DoModal() 的返回值再打开另一个的模态窗口,比如:
CMyDialog1 dlg1;
if(dlg1.DoModal() == IDOK)
{
CMyDialog2 dlg2;
dlg2.Initialize(&dlg1); //可以自己写一个初始化函数,把dlg1的信息传递给dlg2
dlg2.DoModal();
}
在打开 dlg2 时, dlg1仍然存在于内存(但窗口已经卸载,窗口句柄无效,但其中的数据还是存在的), 因此可以传递给 dlg2 ,以进行一些必要的数据传递。
要使DoModal() 的返回值变为你需要的任何值,可以这样关闭对话框:
int nReturnCode = IDYES; // 或者你想设置的任何值
EndDialog(nReturnCode);

其实OnOk() 所做的事情就是: EndDialog(IDOK);
如果要使 dlg2 看起来是 dlg1的子窗口,dlg2 结束后还要回到dlg1 那么可以这样写:
CMyDialog1 dlg1;
while(TRUE)
{
if(dlg1.DoModal() == IDOK)
{
CMyDialog2 dlg2;
dlg2.Initialize(&dlg1); //可以自己写一个初始化函数,把dlg1的信息传递给dlg2
dlg2.DoModal();
}
else
{
break;
}
}

如果非要在一个窗口未关闭的(但隐藏,此时窗口句柄有效)情况下打开另一个对话框,这个第一个窗口可以按非模态形式打开,比如用 ShowWindow 函数,而第二个窗口可以用 DoModal() 打开。
但你又不想在程序中设置一个全局的或类成员形式的对话框变量,也就是说想让变量仅仅在一个函数内创建并使用,可以这样做:
处理对话框的 NC_DESTORE 消息,这是窗口卸载前最后一个能得到的消息,其中可以这样写:
delete this; //删除当前窗口
可以这样打开这个窗口
CMyDialog * pDialog = new CMyDialog;
pDialog->SHowWindow(SW_NORMAL);
要关闭这个窗口可以在对话框内部这样做:
DestoreWindow();
当然你可以在这个窗口内打开另一个模式窗口,打开前后可以隐藏和显示当前窗口:
ShowWindow(SW_HIDE);
CDialog2 dlg2;
dlg2.DoModal();
ShowWindow(SW_NORMAL);
展开
xingze_chi | 发布于2013-12-06
评论
不能关闭父对话框,只能隐藏
追问
是这样的,我建立了一个子对话框是派生于CDialog的子对话框,在这个子对话框中点击OK时调用另一个对话框,但是我调用了新的对话框后,这个子对话框不能关闭。
,而且不是应该结束对话框消息循环关闭对话框吗?
追答
你想下,你在子对话框中调用了另一个对话框,那么这个子对话框就是调用了的那个对话框的父对话框,如果父对话框都销毁了那么子对话框还怎么存在。不知道你能不能看懂。
追问
我明白了,谢谢!
ForTheDream521 | 发布于2013-12-05
评论
收起 其他1条回答

为您推荐:

×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消