来源(博客频道 - CSDN.NET)

From: http://blog.csdn.net/xuqiang918/article/details/29592239

CFormView的create函数的使用以及dlgcore.cpp line:173错误的可能

(2014-12-05 10:22:14)

转载 ▼ 标签: it

背景如下:

昨天编码了一天,就是想实现把一个动态库ComControl中派生的一个CFormView贴到框架 MainFrm中的View上(即通常说的贴在窗口里) ,这样方便以后扩展一个特殊的对话框动态库都可以单独保存,需要的时候贴到框架中即可,无需每次都在框架中增加类,实现架空框架。

然后遇到2个大问题,第一个是CFormView与CDialog不同,CDialog::Create(ID,lpParentWnd)是public方法,而CFormView::Create("","",AFX_WS_DEFAULT_VIEW, rect, lpParentWnd, ID, NULL)是protect方法无法直接调用,为了解决这个方法有个很方便的方法(应急用)可以在CFormView的派生类中的头文件中添加友元类(要使用CFormView::Create的类),这样及可在其他类中使用CFormView::Create方法了。

注:我传递的lpParentWnd是MainFrm的this指针,最终生成的界面达到了我想要的界面,及在MainFrm窗口中贴了一个CFormView,可是奇怪的是CFormView中的所有控件都无法使用,后来发现SDI中MainFrm中本来就贴了一个CMainFrmView窗,故所有的响应事件会被CView截获,无法传递到CFormView中,正确的做法为lpParentWnd传递CMainFrmView的this指针,即应该将CFormView贴在CMainFrmView上,而不是MainFrm上。

而第二个问题是我每次调用CFormView::Create()函数时,参数都没有传错,窗口指针也没问题,可以就是报dlgcore.cpp line:173 和 winocc.cpp line:301错误,我去网上搜索发现很多创建时都出现这个问题。后来总结了下,一般为两种情况:

1、Create()参数有问题,请仔细检查,而我是第二种情况;

2、由于我的CFormView框是从其他地方复制过来的,所以而CFormView关联的类关联出了问题(通常通过打开类向导,仔细查看这个类的变量和方法是否和CFormView框上的控件一一对应),如果关联除了问题,就会出现上述异常。

Link: http://www.asm32.net/article_details.aspx?id=7198