VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题

VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题       
54人阅读 评论(0) 收藏 举报

       这个问题怎么说呢,是我在按照公司一个文档做开发时候发现的,上网查了一下好像没人遇到这样的问题(要不就是我搜的关键字不对),我仔细检查了一下程序,发现了原因,虽然不是什么大的问题(因为我这个问题遇到太巧了),但是如果是新手的话可能会很头疼,我觉得这个应该是VC6的一个bug。

这个问题是这样发生的,首先我先建立一个mfc.exe的工程,然后选择single document,并且底下那个Document/View architecture support不要勾选,一会儿我再来说一下勾选和不勾选的区别。

然后点击Next,到下面这个图的界面:

VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题_第1张图片

在这个界面中除了3D Controls 都不要选,然后点Finish,就可以了。

一个新的工程做好了,这时候我们编译,运行,然后。。。VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题_第2张图片

居然上来就错了。为什么会这样?

我们看一下代码,在这个工程的.cpp文件中的InitInstance函数中我们可以找到答案。在我们选择single document这页的选项时,没有勾选Document/View architecture support,所以我们所建的工程和勾选了这个选项的有本质的区别,我理解的是,如果勾选的话,MainFrame ,View 和Document是同级的,而且会有Document这么个东西,不勾选就根本没有Document这层,而且它的View是在MainFrame层中的,也就是MainFrame中会有个View的对象。我们先看一下勾选了的工程在InitInstance中是如何初始化MainFrame,View和Document的:

VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题_第3张图片

它用了RUNTIME_CLASS这么个宏,剩下的都是交给系统去处理了,包括Create什么的,所以如果当初勾选了Document/View architecture support的话,后边只选3D Controls也没什么关系,还是可以正常运行。

但是不勾选的话,在InitInstance中就是这么处理的了:

VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题_第4张图片

看到吗,有本质的区别,这个就是很简单的new一个mainframe指针,然后show一下。如果这个时候你不做任何处理的话,就会崩溃,因为这个时候,CMainFrame中的 View对象还没有初始化,没有Create,也就是说这个View还不知道它自己是个什么鬼样子,所以出错就是必须的了。

解决这个问题的方法很简单,就是在CMainFrame类中加入OnCreate消息响应,如下图就行了,就是给View初始化一下。

VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题_第5张图片

这样就不会错了,其实我很不明白,为什么不选择那两项就没有OnCreate函数。系统应该默认给一个,要不然,一上来就错的工程会很让人抓狂-_-!!! 

PS:关于这几层的关系我不是很清楚,只能从代码上找原因,我不是那种特别抠系统的人,所以很多地方不是很懂,前边关于MainFrame,View和Document关系时候可能说的不对,所以请新手们不要太相信,你就知道怎么解决问题就行了,我是这么觉得。。。当然,如果有特别懂的人,也欢迎给我讲讲,我看完书就忘。

你可能感兴趣的:(VC6创建single document 不勾选 Docking toolbar 或Initial status bar崩溃问题)