1--首先創建想切換的兩個視圖類(view類) 比如:
class CTestView1 : public CFormView { } class CTestView2 : public CView { }
2--然后在xx.cpp檔案中(XX代表工程名)即CxxApp類的cpp檔案中 包含切換的兩個類的頭檔案, 如:
#include "TestView1.h"
#include "TestView2.h"
3--在 CxxApp的頭檔案里申請兩個CMultiDocTemplate 指標 如:
CMultiDocTemplate* m_pTemplateTestView1;
CMultiDocTemplate * m_pTemplateTestView2;
4--在CxxApp的InitInstance()函式內,創建上面兩個指標指向的實體
BOOL CXXApp::InitInstance()
{ ...
m_pTemplateTestView1= new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestViewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CTestView1)); AddDocTemplate(m_pTemplateTestView1);
m_pTemplateTestView2= new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestViewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CTestView2));
AddDocTemplate(m_pTemplateTestView2); //添加到此app的模板管理類中
... }
注意CMultiDocTemplate()內第一個引數指向一個字串的資源ID,如果存在多個字串,則在開始時會彈出對話框讓你選擇采用哪個模板,這時可以將其中一個ID換為不指向字串資源的id,屏蔽此對話框,也可多載app里的OnFileNew()函式,在里面選擇自己需要一開始創建的模板 如:
void CXXApp::OnFileNew()
{ CDocTemplate * pTemplate=NULL;
int i;
pTemplate=m_pTemplateTestView1;
ASSERT(pTemplate != NULL);
ASSERT_KINDOF(CDocTemplate,pTemplate);
return
pTemplate->OpenDocumentFile(NULL); //創建doc,創建frame,創建view }
注意CMultiDocTemplate()內第二個引數必為CChildFrame
注意CMultiDocTemplate()內第三個引數為你創建需要切換的view視圖類
5--此時程式已經包含多個視圖的模板,切換是在Mainframe類中實作。在mainframe添加下面這個函式
void CMainFrame::SwitchToView(CDocTemplate * pTemplate, CRuntimeClass * pViewClass)
{
CMDIChildWnd *pMDIActive = MDIGetActive();//獲得活動子視窗
CDocument *pDoc = pMDIActive->GetActiveDocument(); //獲得活動doc
CView *pView;
POSITION pos = pDoc->GetFirstViewPosition(); //查詢此doc下的所有已創建view
while (pos != NULL)
{
pView = pDoc->GetNextView(pos);
if (pView->IsKindOf(pViewClass)) //如果已創建此view 則設其為活動 顯示它。 pView->GetParentFrame()->ActivateFrame(); //
pView->UpdateWindow();//視圖更新顯示;
return;
}
pView->UpdateWindow();
}
CMDIChildWnd *pNewFrame = (CMDIChildWnd *) (pTemplate->CreateNewFrame(pDoc, NULL));
// 如果沒有創建,則創建此view的childframe及view
if (pNewFrame == NULL) return; pTemplate->InitialUpdateFrame(pNewFrame, pDoc);
}
6----在mainframe中回應你的切換按鈕,呼叫switchtoView如
void CMainFrame::OnViewTestView1()//用視圖1的方式顯示 ,用視圖二類似如此方法
{ SwitchToView(theApp.m_pVideoTemplate, RUNTIME_CLASS(CTestView1));
//第一個為app里你的模板指標,第二個為ctestview1類的型別識別宏。 } 解釋: RUNTIME_CLASS為一個宏,其回傳一個CRuntimeClass *指標,可進行類的型別識別,IsKindof()。
uj5u.com熱心網友回復:
美中不足的是,在視圖切換前不能關閉所有視圖,否則報錯。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/250930.html
標籤:界面
上一篇:為什么同一個函式要求的引數不一樣
