在实际编程中发现:
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函数第二个参数为桌面的窗口对象。不使用与主程序相关的窗口对象,这样上面的两种情况都解决了。
本文探讨在编程中遇到的AfxMessageBox模态与非模态状态变化问题。当AfxMessageBox先于非模态对话框出现时,在非模态对话框关闭后,AfxMessageBox会变为非模态。尝试通过查找并转换AfxMessageBox窗口句柄来解决,但仅适用于特定情况。使用MessageBox替代AfxMessageBox并与非模态对话框关联也无法解决所有问题。最终解决方案是,创建非模态对话框时,以桌面窗口对象为父窗口,这样无论哪种顺序,问题都能得到解决。
1873

被折叠的 条评论
为什么被折叠?



