您的位置:首页 > 编程语言 > C语言/C++

Debug Assertion Failed! FILE viewform.cpp , line 69

2015-10-16 09:48 746 查看


学习mfc时遇到了与下面类似的问题,折磨了好几天也找不出个所以然来,偶然看到了下面的文章很轻松就解决了,特转载一下共学之

文章出处:http://www.cppblog.com/cs-xiaolee/archive/2011/10/05/157581.aspx


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_child,Style必须选 “下层”SystemMenu和TitleBar属性最好都设为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同仁们的辛勤耕耘!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CC++ mfc