模态对话框创建失败的原因

今天编写一个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时候,对话框不显示~~~,改为多字符则可以,郁闷,MFC这个框架真坑爹!

 

我遇到的问题为上面的第5条,当时真的没想到会是RichEdit的问题!

posted @ 2021-09-15 16:53  秋月的私语  阅读(345)  评论(0编辑  收藏  举报