有读者对我前一篇文章里写的出现错误的处理不太明白,对视图类的继承不太明白,我决定再写一篇文章进行说明,希望对大家有帮助,如果有不对的地方,也希望各位高手指出。
在VS.NET2003中新建一个项目,取名为“MMC”,在“应用程序类型”中选择“单文档”,在“用户界面功能”中选中“拆分窗口”。这样创建的工程与默认的工程相比,在CMainFrame类中多了一个数据成员CStatusBar m_wndStatusBar;在BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)中出现了return m_wndSplitter.Create(this, 2, 2, CSize(10, 10), pContext),这个函数就是默认将视图切分成2行2列。这四个子视图,都是CMMCView类。我们需要做的就是改写CMainFrame::OnCreateClient函数。
在改写这个函数之前,我们要做一些准备工作。
新建一个从视图类,选择“项目”->“新建类” ,在左侧“类别”中选择“MFC”,在右侧“模板”中选择“MFC类”,点击“打开”,在“类名”中输入“LeftTree”,“基类”选择“CTreeView”。这样,一个新的视图类就建好了,这个类很简单,甚至连OnDraw()函数都没有。
下面,我们改写刚才说到的函数,函数改写后如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(LeftTree),CSize(100,100),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMMCView),CSize(100,100),pContext);
return TRUE;
}
其中:m_wndSplitter.CreateStatic(this,1,2)将this指针所指的框架也就是当前框架切分成1行2列。m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(LeftTree),CSize(100,100),pContext)给第0行第0列关联一个视图,视图类名为LeftTree。m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMMCView),CSize(100,100),pContext)给第0行第1列关联一个视图,视图类名为CMMCView。
其实,到这里,切分视图的工作就已经做完了,但是这个时候运行的话,会报错,很明显LeftTree类和CMMCView类存在命名空间的问题,我们需要加入两个头文件:#include "MMCView.h",#include "LeftTree.h",在MainFrm.cpp文件中添加。
于是就出现了一些读者问到的问题,编译报错,错误为:
error C2143: 语法错误 : 缺少“;”(在“*”的前面);
error C2501: “CMMCView::CMMCDoc” : 缺少存储类或类型说明符;
error C2501: “CMMCView::GetDocument” : 缺少存储类或类型说明符;
warning C4183: “GetDocument”: 缺少返回类型;假定为返回“int”的成员函数
经过仔细分析以后,在MMCView.h中发现了这么一个东西:CMMCDoc* GetDocument() const,很显然,在MMCView.h并没有对CMMCDoc进行声名,本来应该报错的,但是,如果不对视图进行切分,就不会报错,一旦对视图进行了切分,就会报错,上面的错误就是这个原因,没有对CMMCDoc这个类声名,那么,我们在MMCView.h中添加包含文件#include "MMCDoc.h"。这样编译就一点问题也没有了,我们可以看到像WINDOWS的MMC那样的结构了。
至于上面出现的这个问题,目前我还没有找到答案,学习中,等有了答案,像