我在单文档中,菜单中模态弹出对话框,在这个对话框中创建一个视图(创建成功),但:点击视图中的任意地方出现断言错误。
具体错误如下:
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);
希望各位大虾能提供些建议。注:相同的代码在对话框中一点问题都没有。
具体错误如下:
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);
希望各位大虾能提供些建议。注:相同的代码在对话框中一点问题都没有。
它总是依赖于框架类。
---------------------------------------------------------------------------------------------------
楼主,你的父窗口是模态对话框呀,属于ws_popup风格的,所以模态对话框的父窗口你是拿不到的。
pParentFrame == pDesktopWnd || pDesktopWnd->IsChild(pParentFrame));类似这些句柄你都要搞清楚关系,
还是把那个对话框做成非模态的吧(如果可以的话)。
把你的view类的构造函数改为公有的,直接在对话框的OnInitDialog里面调用view = new YourVIew();view->Create就行
http://topic.csdn.net/u/20090227/13/211461FA-FA6B-4AAC-B9E6-EAC49C0DAAA0.html
直接创建View,如果对话框支持拖大小的话,View能跟着变吗?
应该会有很多细节问题的吧!
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.再在你的单文档中弹出这个测试对话框,模态或者非模态的都行