切换视时基于FormView的对话框属性设置与ASSERT报错的问题 (Debug Assertion Failed!)

分类:  vc++2012-10-03 13:40  101人阅读  评论(0)  收藏  举报
     最近做的项目中用到了 FormView切换视图,其主要原理是:先新建一些Dialog对话框,然后给这些对话框绑定对应的View,注意:这些View要基于FormView。
      一开始还好好的,利用 切换视的代码进行的很顺利(网上的相关代码很多,我就不赘述了),但是,后来新加了两个Dialog,不知我怎么弄的,奇怪的事发生了:先前添加了Dialog都能正常的切换,但是,一切换新添加的Dialog,每次运行到:

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);          // invalid dialog template name    
  PostNcDestroy();        // cleanup if Create fails too soon     
  return FALSE;
 }
#endif //_DEBUG


中的ASSERT时就报错,而在Release版本下却不会报错。我检查了一下这两个新加的Dialog与先前的Dialog属性有哪些不同,原来是自己把后来加的Dialog的Visible属性设置成了TRUE了, 根据代码的要求是:对话框模板必须存在,属性要设置成不可见和子窗口风格。SystemMenu和TitleBar属性最好都设为False,改完以后,一切正常~~
注:还有一种方法就是在添加Dialog资源时,在Dialog列表上点右键->添加资源,选择Dialog->IDD_FORMVIEW,再点“新建”按钮,这样新建出来的Dialog属性就会自动配好了

 

分割窗口时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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值