如何关闭打开了一个模态窗口的非模态对话框

碎炎 2014-05-27 01:16:26
A对话框是非模态对话框,B对话框也是个非模态对话框,其中B窗口打开了一个模态对话框堵塞了B对话框。我需要在A窗口中点击某个按钮关闭B对话框,可是因为B对话框上有个模态对话框,直接关闭会导致程序崩溃。

我现在可以枚举到这个以B窗口为父窗口的对话框,那么我如何可以安全的关闭B对话框?关闭B对话框之前肯定需要关闭B上的模态对话框,可是直接Close掉上面的模态对话框程序会崩溃。
...全文
315 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎炎 2014-06-09
  • 打赏
  • 举报
回复
引用 5 楼 lis2012 的回复:
[quote=引用 楼主 sryan 的回复:] A对话框是非模态对话框,B对话框也是个非模态对话框,其中B窗口打开了一个模态对话框堵塞了B对话框。我需要在A窗口中点击某个按钮关闭B对话框,可是因为B对话框上有个模态对话框,直接关闭会导致程序崩溃。 我现在可以枚举到这个以B窗口为父窗口的对话框,那么我如何可以安全的关闭B对话框?关闭B对话框之前肯定需要关闭B上的模态对话框,可是直接Close掉上面的模态对话框程序会崩溃。
你可以想b对画框窗体句柄发送WM_ClOSE消息,最好在其OnClose()函数里面在再向其上的模态对话框发送WM_ClOSE消息,这样就可以解决你的问题了 [/quote] B对话框堵塞的地方 就是B生成的模态对话框domodal的地方,send close过去后,会继续执行下面的代码 会造成崩溃
碎炎 2014-06-09
  • 打赏
  • 举报
回复
引用 4 楼 rxguoblp 的回复:
[quote=引用 3 楼 worldy 的回复:] [quote=引用 1 楼 rxguoblp 的回复:] step1:在最顶层父窗口类中声明两个静态CWnd* 指针并初始化为NULL,例如: public: static CWnd* pwnd1; static CWnd* pwnd2; step2:在B对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd1 = FromHandle(GetSafeHwnd()); step3:在模态对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd2 = FromHandle(GetSafeHwnd()); step4:在A对话框的按钮响应函数中使用关闭功能: void CMyDlgA::OnBnClickedButton1() { if (CXXXDlg::pwnd2 != NULL) { ::SendMessage(CXXXDlg::pwnd2->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } if (CXXXDlg::pwnd1 != NULL) { ::SendMessage(CXXXDlg::pwnd1->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } }
这个代码肯定死锁[/quote] 我已经测试过,木有问题[/quote] 里面牵扯到了消息循环的嵌套 直接close掉程序会崩溃 因为B堵塞的地方下面有代码要继续执行
lis2012 2014-05-28
  • 打赏
  • 举报
回复
引用 楼主 sryan 的回复:
A对话框是非模态对话框,B对话框也是个非模态对话框,其中B窗口打开了一个模态对话框堵塞了B对话框。我需要在A窗口中点击某个按钮关闭B对话框,可是因为B对话框上有个模态对话框,直接关闭会导致程序崩溃。 我现在可以枚举到这个以B窗口为父窗口的对话框,那么我如何可以安全的关闭B对话框?关闭B对话框之前肯定需要关闭B上的模态对话框,可是直接Close掉上面的模态对话框程序会崩溃。
你可以想b对画框窗体句柄发送WM_ClOSE消息,最好在其OnClose()函数里面在再向其上的模态对话框发送WM_ClOSE消息,这样就可以解决你的问题了
rxguoblp 2014-05-28
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
[quote=引用 1 楼 rxguoblp 的回复:] step1:在最顶层父窗口类中声明两个静态CWnd* 指针并初始化为NULL,例如: public: static CWnd* pwnd1; static CWnd* pwnd2; step2:在B对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd1 = FromHandle(GetSafeHwnd()); step3:在模态对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd2 = FromHandle(GetSafeHwnd()); step4:在A对话框的按钮响应函数中使用关闭功能: void CMyDlgA::OnBnClickedButton1() { if (CXXXDlg::pwnd2 != NULL) { ::SendMessage(CXXXDlg::pwnd2->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } if (CXXXDlg::pwnd1 != NULL) { ::SendMessage(CXXXDlg::pwnd1->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } }
这个代码肯定死锁[/quote] 我已经测试过,木有问题
worldy 2014-05-28
  • 打赏
  • 举报
回复
引用 1 楼 rxguoblp 的回复:
step1:在最顶层父窗口类中声明两个静态CWnd* 指针并初始化为NULL,例如: public: static CWnd* pwnd1; static CWnd* pwnd2; step2:在B对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd1 = FromHandle(GetSafeHwnd()); step3:在模态对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd2 = FromHandle(GetSafeHwnd()); step4:在A对话框的按钮响应函数中使用关闭功能: void CMyDlgA::OnBnClickedButton1() { if (CXXXDlg::pwnd2 != NULL) { ::SendMessage(CXXXDlg::pwnd2->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } if (CXXXDlg::pwnd1 != NULL) { ::SendMessage(CXXXDlg::pwnd1->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } }
这个代码肯定死锁
worldy 2014-05-28
  • 打赏
  • 举报
回复
不可以这样做,在这种情况下,建议全部使用非模态对话框
昨夜无风 2014-05-28
  • 打赏
  • 举报
回复
隐藏不行吗?
rxguoblp 2014-05-28
  • 打赏
  • 举报
回复
step1:在最顶层父窗口类中声明两个静态CWnd* 指针并初始化为NULL,例如: public: static CWnd* pwnd1; static CWnd* pwnd2; step2:在B对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd1 = FromHandle(GetSafeHwnd()); step3:在模态对话框的OnInitDialog()函数中赋值: CXXXDlg::pwnd2 = FromHandle(GetSafeHwnd()); step4:在A对话框的按钮响应函数中使用关闭功能: void CMyDlgA::OnBnClickedButton1() { if (CXXXDlg::pwnd2 != NULL) { ::SendMessage(CXXXDlg::pwnd2->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } if (CXXXDlg::pwnd1 != NULL) { ::SendMessage(CXXXDlg::pwnd1->GetSafeHwnd(),WM_CLOSE,(WPARAM)1,(LPARAM)0); } }

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧