我建了一个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有什么用?
{
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有什么用?
解决方案 »
- 帮推荐一本多线程设计的书籍
- ExtractIcon好像返回的是大图标,怎么样提取小图标??
- 写了一个多播的,碰到一个问题,就是程序在编译到setsockopt时,老是暴错,错误代码是10049,我查了一下,意思好像是说多播地址有问题,
- 目录加口令,进出文件夹时口令鉴别身份,请指点!
- 怎么可以使显示在编辑框中的内容覆盖上一次内容的?
- MFC程序大小的标准是多少?(不要嫌分少啊)
- 怎样制作自动运行文件?
- 在release中可以设置断点进行调试吗?
- dynamic_cast崩溃
- 我现在想学VC,可以吗,
- 基于对话框的应用程序怎么才能使用CFileDialog
- 如何统计在一块二值图象区域内的像素为1的个数?最好有程序说明,谢谢
---
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
所在文件是否包含了这些类的头文件
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);