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

我在对话框中定义的是点击确定键,就会调用另外的一个窗口,但是这时这个对话框不关闭,另一个小的窗口 也出现了。要怎样才能关闭这个对话框啊?
我有更好的答案
邀请更新
2013-12-07 最佳答案
现在要在需要退出程序的时候抛出WM_QUIT,否则消息循环不会结束?shareid=3530455370&uk=1026841186" name="dlg2_20131207171632。


要注意的地方就是,所有可能会导致“最后一个对话框消失”的地方,都要加上AfxPostQuitMessage。

但是OnOK完成的话,

空雪梦见

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

其他回答

你要用exit(1)关闭掉当前窗口;ShowWindow(SW_SHOW); //如果主窗口没有显示出来;这里建议用非模态对话框。
p->,点击按钮:
CParentDlg *p=(CParentDlg*)GetParent()///.DoModal()。
在你弹出的对话框中;
ShowWIndow(SW_HIDE);*/,不然程序会在后台一直运行的;//*CTestDlg dlg;
dlg
絕情—離慶 | 发布于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

提交
取消