該部分基礎在理解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);//更新視圖
}