模态对话框创建失败的原因
2012-01-08 19:56 上帝之骰 阅读(1096) 评论(1) 编辑 收藏 举报今天编写一个MFC的文档/视图结构程序,点击菜单项弹出相应的模态对话框。但是遇到一个很诡异的问题:新添加的菜单项点击后有响应(可以跟踪到),但是对话框却没有弹出。
观察DoModal()函数的返回值发现,返回一直为-1,也就是模态对话框创建失败。最后发现是因为对话框中两个DirectX插件失效。由于编译时没有错误,所以一直没注意,弄得还以为是代码部分错了。看了下搜到的资料,模态对话框失败的可能原因还真多:
DoModal失败原因
1、MFC
通常对话框不显示的原因有
1 父窗口HWND无效
2 在ONINITDIALOG里用了ENDDIALOG
3 无效的对话框资源ID
4 使用没有注册的的自定义控件
5 对话框的某些控件创建失败,如RICHEDIT,要加上AfxInitRichEdit();
6 GDI资源无效
7 初始化ActiveX控件失效
8 从DLL中加载资源失效
最有可能出现的是第3条,因此,又经过仔细分析了对话框中的各个资源的ID,终于找到了问题,原来是出在一个菜单栏的ID上面, 在对话框的属性的菜单栏中有一个ID(因为这个对话框是复制过来的,而且原来的对话框有菜单栏的,但是现在这个对话框没有),所以呢,ID虽然存在,但 是,现在的程序中并没有对应的资源,所以,通过讲菜单栏那项设置为空,这样,程序就OK了。
2、dll
使用:
AFX_MAMAGE_STATE(AfxGetStaticModuleState());
CTestDlg dlg;
int rlt = dlg.DoModal();
3、前些日子做一个项目中,需要用到一个对话框。 但是对该对话框使用DoModal函数后该对话框死活弹不出来,单步跟踪的时候也没发现什么大问题。在网上搜索了很多方法都不奏效。后来发现原来是该对话框的属性里面设置了 WS_CHILD 属性。把该属性去掉程序立即可以成功运行了。在项目开发过程中这种问题是最令人心烦的,虽然不是很复杂,却也令人头疼不已。在这里写出来希望对大家有所帮助
4、当unicode时候,对话框不显示~~~,改为多字符则可以,郁闷,·又是一晌