我在单文档中,菜单中模态弹出对话框,在这个对话框中创建一个视图(创建成功),但:点击视图中的任意地方出现断言错误。
具体错误如下:
int CView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
     ...
     ASSERT(pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame));//MFC 封装类中ERROR
     ...
}
void CFrameWnd::SetActiveView(CView* pViewNew, BOOL bNotify)
{
#ifdef _DEBUG
if (pViewNew != NULL)
{
ASSERT(IsChild(pViewNew));));//MFC 封装类中ERROR
ASSERT_KINDOF(CView, pViewNew);
}
...
}
以上2处错误,都是断言导致。把单文档改为对话框,一点问题都没有。
创建视图代码:
//.h
         CRuntimeClass *pViewClass;
CSubFormView * pFormView;//.cpp
CRect rc; 
GetClientRect(&rc); 
pViewClass = RUNTIME_CLASS(CSubFormView);
CCreateContext * pContext; 
pContext = new CCreateContext; 
pContext->m_pCurrentDoc = NULL; 
pContext->m_pCurrentFrame = NULL; 
pContext->m_pLastView = NULL; 
pContext->m_pNewDocTemplate =NULL; 
pContext->m_pNewViewClass = pViewClass; 
CWnd * pWnd = NULL; 
pWnd = DYNAMIC_DOWNCAST(CWnd,pViewClass->CreateObject());
pWnd->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0),this,IDD_DIALOG2,pContext); 
delete pContext; 
pFormView = DYNAMIC_DOWNCAST(CSubFormView,pWnd); 
pFormView->SetScrollSizes( MM_TEXT, CSize(600, 400) ); 
pFormView->MoveWindow(rc.left,rc.top,rc.right - rc.left-160, rc.bottom -rc.top-50,TRUE);
希望各位大虾能提供些建议。注:相同的代码在对话框中一点问题都没有。

解决方案 »

  1.   

    你的视图是如何创建的?指定child风格了么?
      

  2.   

    视图天生就是child风格的。
    它总是依赖于框架类。
      

  3.   

    视图创建,直接在资源中继承CFormView指定风格,Child
      

  4.   

    void CFrameWnd::SetActiveView(CView* pViewNew, BOOL bNotify) --- 这处断言就是因为视图调用框架类函数造成的。
      

  5.   

    我在单文档中,菜单中模态弹出对话框,在这个对话框中创建一个视图(创建成功),但:点击视图中的任意地方出现断言错误。 
    ---------------------------------------------------------------------------------------------------
    楼主,你的父窗口是模态对话框呀,属于ws_popup风格的,所以模态对话框的父窗口你是拿不到的。
    pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame));类似这些句柄你都要搞清楚关系,
    还是把那个对话框做成非模态的吧(如果可以的话)。
      

  6.   

    谁说一定要框架类
    把你的view类的构造函数改为公有的,直接在对话框的OnInitDialog里面调用view = new YourVIew();view->Create就行
      

  7.   

    去这里看看吧
    http://topic.csdn.net/u/20090227/13/211461FA-FA6B-4AAC-B9E6-EAC49C0DAAA0.html
      

  8.   

    个人感觉还是应该搞个 CFrameWnd 作中间层
    直接创建View,如果对话框支持拖大小的话,View能跟着变吗?
    应该会有很多细节问题的吧!
      

  9.   

    都有试过了。直接把VIEW类构造与析构改为公共,结构还是一样的。
      

  10.   

    你的CSubFormView是从CView类派生的还是从CFormView类派生的
      

  11.   

    将VIEW和CFormView嵌入对话框是没有问题的,我用过,我先试一下再告诉你
      

  12.   

    1.新建一个对话框,将其属性改成Child None,双击生成一个CFormView类(如叫:CMyFormView)
    2.将该类的构造函数和析构函数改成public,并重载虚函数Create(注意是Create,而不是消息响应函数OnCreate)
    3.在你的测试对话框(View或者是CFormView将被嵌入的对话框)中添加一个CMyFormView*类的变量m_TestView,并在OnInitDialog函数中加入
      如下代码:
      CRect rect;
      GetDlgItem(IDC_T)->GetWindowRect(&rect);
      ScreenToClient(&rect);  CRuntimeClass *pViewRuntimeClass=RUNTIME_CLASS(CTTFormView);
      m_TestView=(CTTFormView*)pViewRuntimeClass->CreateObject();
      m_TestView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,rect,this,101);
      m_TestView->OnInitialUpdate();  注意:rect是view将要显示的位置,这儿我是在测试对话框上放了一个图片控件IDC_T,用它来获取一个矩形
    4.将你的测试对话框的属性改成overlapped或者是child,不能是popup5.再在你的单文档中弹出这个测试对话框,模态或者非模态的都行