Debug Assertion Failed! FILE viewform.cpp , line 69

Debug Assertion Failed! FILE viewform.cpp , line 69

最近做一个基于MFC的开发项目需要用到一个替换View功能的模块,在网上搜索后,参考MSDN中的例子后,得到如下代码
 1  void  CMainFrame::ReplaceView(CRuntimeClass  * pViewClass)
 2  {
 3      CView  * pOldActiveView  =  GetActiveView();
 4       if  (pOldActiveView -> IsKindOf(pViewClass)  ==  TRUE) {
 5           return ;
 6      }
 7      CCreateContext context;
 8      context.m_pNewViewClass  =  pViewClass;
 9      context.m_pCurrentDoc  =  GetActiveDocument();
10      context.m_pLastView  =  NULL;
11      context.m_pNewDocTemplate  =  NULL;
12      context.m_pCurrentFrame  =  NULL;
13      CView  * pNewView  =  (CView  * )CreateView( & context);
14       if  (pNewView  !=  NULL) {
15          pNewView -> ShowWindow(SW_SHOW);
16          pNewView -> OnInitialUpdate();
17          SetActiveView(pNewView);
18          RecalcLayout();
19          
20          pOldActiveView -> DestroyWindow();
21      }
22  }
但是debug版报错
“Debug Assertion Failed! FILE viewform.cpp , line 69 ”
于是我开始对照和MSDN中例程collect的差别。。。但是没有进展。。。网上例子也是。。。
今天痛定思痛,发现居然遗漏了最好的方式,“google一下”
于是有了下面几篇文章
http://www.cnweblog.com/vcbird/archive/2005/10/10/36404.html
http://archive.cnblogs.com/a/1931083/

分割窗口时CFormView与Pane关联时出现的问题

分割窗口时,其中一个窗格Pane,所关联的视,这个视若是从 CEditView, CTreeView, CView等类导出的,则没有问题,若是从 CFormView导出的, 那么编译正常,但执行那个时会出现

 

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: D:\VC_PROJECT\testMultiPane\Debug\testMultiPane.exe
File: viewform.cpp
Line: 69

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort(A) Retry(R) Ignore(I) 
---------------------------

 

错误,

原因是 CFormView 的导出类,需要与一个Dialog资源关联,这个Dialog的属性必须是ws_childStyle必须选 “下层”SystemMenuTitleBar属性最好都设为False

参见 http://www.cnweblog.com/vcbird/archive/2005/10/10/36404.html

 

以前在出现

 

错误提示时,不知如何处理,在这次通过点击“重试”,debugger停在了

 

the debugge point to this line

Code:

               ASSERT(FALSE);          // invalid dialog template name

which appears in the following code snippet of the file VIEWFORM.cpp

Code:

BOOL CFormView::Create(LPCTSTR /*lpszClassName*/, LPCTSTR /*lpszWindowName*/,

        DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,

        CCreateContext* pContext)

{

        ASSERT(pParentWnd != NULL);

        ASSERT(m_lpszTemplateName != NULL);

 

        m_pCreateContext = pContext;    // save state for later OnCreate

 

#ifdef _DEBUG

        // dialog template must exist and be invisible with WS_CHILD set

        if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE))

        {

               ASSERT(FALSE);   //<====== debugger stops at this line       // invalid dialog template name

               PostNcDestroy();        // cleanup if Create fails too soon

               return FALSE;

        }

#endif //_DEBUG

 

        // initialize common controls

        VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));

        AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);

 

        // call PreCreateWindow to get prefered extended style

        CREATESTRUCT cs; memset(&cs, 0, sizeof(CREATESTRUCT));

        if (dwRequestedStyle == 0)

               dwRequestedStyle = AFX_WS_DEFAULT_VIEW;

        cs.style = dwRequestedStyle;

        if (!PreCreateWindow(cs))

               return FALSE;

 

        // create a modeless dialog

        if (!CreateDlg(m_lpszTemplateName, pParentWnd))

               return FALSE;

 

        m_pCreateContext = NULL;

 

        // we use the style from the template - but make sure that

        //  the WS_BORDER bit is correct

        // the WS_BORDER bit will be whatever is in dwRequestedStyle

        ModifyStyle(WS_BORDER|WS_CAPTION, cs.style & (WS_BORDER|WS_CAPTION));

        ModifyStyleEx(WS_EX_CLIENTEDGE, cs.dwExStyle & WS_EX_CLIENTEDGE);

 

        SetDlgCtrlID(nID);

 

        CRect rectTemplate;

        GetWindowRect(rectTemplate);

        SetScrollSizes(MM_TEXT, rectTemplate.Size());

 

        // initialize controls etc

        if (!ExecuteDlgInit(m_lpszTemplateName))

               return FALSE;

 

        // force the size requested

        SetWindowPos(NULL, rect.left, rect.top,

               rect.right - rect.left, rect.bottom - rect.top,

               SWP_NOZORDER|SWP_NOACTIVATE);

 

        // make visible if requested

        if (dwRequestedStyle & WS_VISIBLE)

               ShowWindow(SW_NORMAL);

 

        return TRUE;

}

 

如何,Google dialog template must exist and be invisible with WS_CHILD set”发现网文

http://www.cnweblog.com/vcbird/archive/2005/10/10/36404.html

呵呵呵,看来解决该有望了,先去吃饭,回来继续


最终的解决办法是这样的,我重建了该工程,选择Insert Resource时选中“IDD_FORMVIEW”

其他代码没有变化

然后就成功了,呵呵呵,我表示非常欣慰,非常感谢在网络上分享的IT同仁们的辛勤耕耘!

你可能感兴趣的:(Debug Assertion Failed! FILE viewform.cpp , line 69)