我建了一个MDI程序,想要用不同的视图类,工程视图类继承于CRichEditView,代码如下:class CsplitRichEditView : public CRichEditView
{
protected: // 仅从序列化创建
CsplitRichEditView();
DECLARE_DYNCREATE(CsplitRichEditView)// 属性
public:
CsplitRichEditDoc* GetDocument() const;// 操作
public:// 重写
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void OnInitialUpdate(); // 构造后第一次调用
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);// 实现
public:
virtual ~CsplitRichEditView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endifprotected:// 生成的消息映射函数
protected:
afx_msg void OnDestroy();
DECLARE_MESSAGE_MAP()
};在CMainFrame类中加入CSplitterWnd类的对象m_wndSplitter,代码如下:class CMainFrame : public CMDIFrameWnd
{
DECLARE_DYNAMIC(CMainFrame)
public:
CMainFrame();// 属性
public:
CSplitterWnd m_wndSplitter;//CSplitterWnd 类对象// 操作
public:// 重写
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);// 实现
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endifprotected:  // 控件条嵌入成员
CStatusBar  m_wndStatusBar;
CToolBar    m_wndToolBar;// 生成的消息映射函数
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
};然后重载OnCreateClient函数,代码如下:BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CRichEditView),CSize(150,250),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CRichEditView),CSize(150,250),pContext);//可以
//m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CEditView),CSize(150,250),pContext);//可以
         //m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CsplitRichEditView ),CSize(150,250) ,pContext);
        //“CTreeView”: 不是类或命名空间名称
//m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CTreeView),CSize(150,250) ,pContext);
        //“CTreeView”: 不是类或命名空间名称
//m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView),CSize(150,250),pContext);//运行时出错
//m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CFormView),CSize(150,250),pContext);//运行时出错
//m_wndSplitter.CreateView(0,0,pContext->m_pNewViewClass,CSize(150,250),pContext);
        //可以,pContext->m_pNewViewClass什么意思?
return CMDIFrameWnd::OnCreateClient(lpcs, pContext);
}
但是除了CRichEditView和CEditView之外,其它的视图类都不能用,不是说"不是类或命名空间名称",就是运行时出错。而且本工程中的CsplitRichEditView 类也不能用,出错说"不是类或命名空间名称"。请问分隔为不同类型的子视图有什么要求吗?一定要与工程中视图类的父类有关才可以吗?还有pContext->m_pNewViewClass是什么意思,pContext有什么用?

解决方案 »

  1.   

    出错说"不是类或命名空间名称"。
    ---
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    所在文件是否包含了这些类的头文件
      

  2.   

    调用过::AfxInitRichEdit()这个函数了吗?
      

  3.   

    CView CFormView 都需要继承才能使用,不能直接使用,因为CView类有纯虚函数,不能实例化,CFormView需要继承类的对话框资源定义。
      

  4.   

    1、在资源视图下右键,展开Dialog的树形条,新建一个IDD_FORMVIEW,在上面加一个控件,进入ClassWizzard,会提示是否新建一个类,你为刚添加的这个formview形式的对话框建一个类与之绑定:如CMyFormView.
    2、在mainframe.cpp中#include MyFormView.h
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CFormView),CSize(150,250),pContext);//运行时出错改成:
    m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyFormView),CSize(150,250),pContext);
      

  5.   

    这个问题我也遇到过 你说的错误 在深入浅出MFC中有说明,你可以去看一下,具体给你说太麻烦了,也不好说清除,要是还搞不定,可以把你的代码发给我,我给你弄一下