AfxMessageBox——模态与非模态的问题

本文探讨在编程中遇到的AfxMessageBox模态与非模态状态变化问题。当AfxMessageBox先于非模态对话框出现时,在非模态对话框关闭后,AfxMessageBox会变为非模态。尝试通过查找并转换AfxMessageBox窗口句柄来解决,但仅适用于特定情况。使用MessageBox替代AfxMessageBox并与非模态对话框关联也无法解决所有问题。最终解决方案是,创建非模态对话框时,以桌面窗口对象为父窗口,这样无论哪种顺序,问题都能得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在实际编程中发现:

1,  先弹出一个AfxMessageBox,使用全局的,它为模态的。

2,  再创建一个非模态对话框,假设为Dialog1

3,  Dialog1关闭时,AfxMessageBox变为非模态的。

 

最后总结了两种情况:

1,  先弹出AfxMessageBox,后创建非模态对话框。

2,  先创建非模态对话框,后弹出AfxMessageBox

这两种情况在非模态对话框关闭时,AfxMessageBox都变为非模态的。

 

试验了几种修改方法,但仍然有问题:

第一种解决方法:

针对上述第一种情况,先查找到AfxMessageBox的窗口句柄,然后转换成CWnd对象,作为指向当前窗口对象的指针。

代码如下:

1,    AfxMessageBox的窗口标题与主程序的工程名相同。

2,    EnumWindows查找窗口句柄。

3,    FromHandle将句柄转换成对象指针。

4,    创建非模态对话框,Create 对话框ID 窗口对象指针 )。

此方法只解决了第一种情况,第二种情况没有解决。

 

其他解决方法:

使用MessageBox替代AfxMessageBox 如果先弹出非模态对话框,那么MessageBox以该非模态对话框为父窗口,此方法也没解决第二种情况。

      

总结一下:

       最后的解决办法是,创建非模态对话框时Create函数第二个参数为桌面的窗口对象。不使用与主程序相关的窗口对象,这样上面的两种情况都解决了。

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值