该部分基础在理解mfc应用程序框架的基础上。
通过窗口的分割可以得到多视图,但是在实际应用中更多的是以多文档的形式生成多视图程序的。多视图程序主要分为单一文档模板对应文档的多视图显示和多文档模板对应的文档的视图显示。
下面以程序的形式展示:
例1:单文档模板对应多视图
新建项目Example1,当执行“窗口”|“斜体窗口”菜单命令时重新打开一个窗口
1、利用mfc向导创建多视图应用程序框架Example1;
2、为项目添加一个新的视图类CItalicView,基类为CView;
3、编辑应用程序类CExample1App。
(1)添加模板对象指针成员变量,并重写ExitInstance();
classCExample1App: public CWinApp
{
public:
.
.
CMultiDocTemplate*m_pTemplateItalic;
virtual int ExitInstance();
.
.
}
(2)在应用程序源文件InitInstance()函数中添加并构建新的模板对象的代码,并编写虚函数ExitInstance()的实现代码
BOOLCExample1App::InitInstance()
{
.
.
.
.
AddDocTemplate(pDocTemplate);
m_pTemplateItalic = newCMultiDocTemplate(IDR_LI_TYPE,
RUNTIME_CLASS(CExample1Doc);
RUNTIME_CLASS(CChildFrame);
RUNTIME_CLASS(CItalicView));
.
}
intCExample1App::ExitInstance()
{
delete m_pTemplateItalic;
.
}
4、编辑主框架类CMainFrame
(1)打开IDR_LI_TYPE资源,在主菜单中加入菜单项"斜体窗口",并在CMainFrame类中添加对应的响应函数。
voidCMainFrame::OnWindowItalic()
{
CMDIChildWnd * pActiveChild =MDIGetActive();//获得子窗口
CDocument * pDocument;
if(<pActiveChild == NULL||
(pDocument =pActiveChild -> GetActiveDocument())==NULL)
{
TRACEO("Warning,No ActiveDocument");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return;
}
//获得新的文档模板指针
CDocTemplate* pTemplate =((CExample1App*)AfxGetApp())->m_pTemplateItalic;
ASSERT_VALID(pTemplate)
CFrameWnd* pFrame =pTemplate->CreateNewFrame(pDocument, pActiveChild);
if(pFrame == NULL)
{
TRACEO("Warning, Failed to create newframe.\n");
return;
}
pTemplate->InitialUpdateFrame(pFrame,pDocument);//更新视图
}