文档视图结构中拆分窗口用到CFormView的情况有时出现“创建空文档失败”而不能创建视图?
不知道大家使用过程中遇到过没有,如下(其中CTestFormView继承自CFormView):
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
int xlong=lpcs->cx/2;
int ylong=lpcs->cy/2;
if(!m_pWndSplitter0->CreateStatic(this, 2,1)||
   !m_pWndSplitter0->CreateView(0,0,RUNTIME_CLASS(CMyEditView), CSize(ylong,0),pContext)||
   !m_pWndSplitter1->CreateStatic(m_pWndSplitter0, 1, 2,WS_CHILD|WS_VISIBLE,m_pWndSplitter0->IdFromRowCol(1,0))||
   !m_pWndSplitter1->CreateView(0,0,RUNTIME_CLASS(CEyeEditView), CSize(xlong, 0),pContext)||
   !m_pWndSplitter1->CreateView(0,1,RUNTIME_CLASS(CTestFormView), CSize(0,0),pContext))
   return FALSE;
return TRUE;
}
这样ok!
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
int xlong=lpcs->cx/2;
int ylong=lpcs->cy/2;
if(!m_pWndSplitter0->CreateStatic(this, 2,1)||
   !m_pWndSplitter0->CreateView(0,0,RUNTIME_CLASS(CMyEditView), CSize(ylong,0),pContext)||
   !m_pWndSplitter1->CreateStatic(m_pWndSplitter0, 1, 2,WS_CHILD|WS_VISIBLE,m_pWndSplitter0->IdFromRowCol(1,0))||
   !m_pWndSplitter1->CreateView(0,0,RUNTIME_CLASS(CTestFormView), CSize(xlong, 0),pContext)||//这一句返回FALSE
   !m_pWndSplitter1->CreateView(0,1,RUNTIME_CLASS(CTestFormView), CSize(0,0),pContext))
   return FALSE;
return TRUE;
}
这样失败
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
// TODO: Add your specialized code here and/or call the base class
int xlong=lpcs->cx/2;
int ylong=lpcs->cy/2;
if(!m_pWndSplitter0->CreateStatic(this, 2,1)||
   !m_pWndSplitter0->CreateView(0,0,RUNTIME_CLASS(CTestFormView), CSize(ylong,0),pContext)||//这一句返回FALSE
   !m_pWndSplitter1->CreateStatic(m_pWndSplitter0, 1, 2,WS_CHILD|WS_VISIBLE,m_pWndSplitter0->IdFromRowCol(1,0))||
   !m_pWndSplitter1->CreateView(0,0,RUNTIME_CLASS(CEyeEditView), CSize(xlong, 0),pContext)||
   !m_pWndSplitter1->CreateView(0,1,RUNTIME_CLASS(CTestFormView), CSize(0,0),pContext))
   return FALSE;
return TRUE;
}
这样也失败,跟踪MFC的源代码可以发现是俩种情况在创建FormView的时候创建失败,具体为:hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,
pParentWnd->GetSafeHwnd(), AfxDlgProc);创建失败。
而:
 !m_pWndSplitter1->CreateView(0,1,RUNTIME_CLASS(CTestFormView), CSize(0,0),pContext)成功。
这是怎么回事?!

解决方案 »

  1.   

    FormView创建的确可能失败,例如有控件创建失败时WM_CREATE处理返回-1。确保需要用到的控件已经注册并且在程序中做了必要的初始化。可以参考AfxInitRichEdit的文档。Command what is yours
    Conquer what is not
      

  2.   

    真的很谢谢 jiangsheng(蒋晟.Net) 大侠!我为了这个问题到处找原因弄了一天,确实是没有初始化RichEditCtrl,我的formview中用到了RichEditCtrl, 我哭....另外还请指点一下为什么在没有调用AfxInitRichEdit的时候第一种情况可以了?难道在某个地方初始化了。
    还有CRichEditView中的RichEditCtrl控件是不一样的吧,例如如果在98下中调用CRichEditView中的RichEditCtrl的SetWindowText如果是中文则为乱码。它是不是用的是操作系统自带的RichEditCtrl。再次表示感谢!!!
      

  3.   

    CRichEditView有自动AfxInitRichEdit……
    http://www.vckbase.com/document/viewdoc.asp?id=485