分类: C/C++
2011-09-06 13:44:29
动态创建视图时候 AfxCheckDialogTemplate执行出错
在mfc的sdi架构中,准备多做几个视图,试图类继承自formview,但在动态创建视图的时候出了错误,AfxCheckDialogTemplate执行出错。后来通过搜索发现cformview类关联对话框时候,资源必须具备child属性。
1.CFormView类关联的对话框资源必须具有Child属性。
由CFormView派生的类,可以关联一个对话框资源。但该对话框资源必须在属性设定中Style选定[Child]属性,否则的话,
代码可以编译,但Debug运行会报告一个断言错误,跟踪代码,断言在:
#ifdef _DEBUG
// dialog template must exist and be invisible with WS_CHILD set
if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))
{
ASSERT(FALSE); // invalid dialog template name
PostNcDestroy(); // cleanup if Create fails too soon
return FALSE;
}
#endif //_DEBUG
2.CFormView比较特殊,是一个父窗体嵌套了一个子窗体,所以,
CFormView类的派生类的实例不响应WM_CLOSE消息,仅仅响应WM_DESTROY消息。
另外,若要用代码关闭当前View,也不能直接:PostMessage(WM_CLOSE,0,0);
而必须先获取父窗体的指针,然后对父窗体发送WM_CLOSE消息才行,像这样:
GetParent()->PostMessage(WM_CLOSE,0,0);
才能够达到目的。
《深入浅出MFC》第八章461页图8-1清楚地说明了这种情况,View窗口是CChildFrame窗口的子窗口。