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、在CMainFrame的InitializeRibbon里面注释掉其他没有用的界面设置,比如“剪贴板”面板,“窗口”面板,‘右侧选项卡’等,但是留下定义的东西。 然后,确定初始化主页 // 初始主按钮: m_MainButton.SetImage(IDB_MAIN); m_MainButton.SetText(_T("/nf")); strTemp = "主页";----------------这句自己添自己添的东西 m_MainButton.SetToolTipText(strTemp); 然后添加自己的面板,定义留着, CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);#pragma Region WFC; strTemp = "导入图像视图面板"; CMFCRibbonPanel *pPanelView = pCategoryHome->AddPanel(strTemp,m_PanelImages.ExtractIcon(1)); strTemp = "导入图像"; pPanelView->Add(new CMFCRibbonButton(ID_IMAGE_OPEN,strTemp,0,0)); strTemp = "点选图像标志点"; pPanelView->Add(new CMFCRibbonButton(ID_SELECT_POINT,strTemp,0,1)); strTemp = "图像校正"; pPanelView->Add(new CMFCRibbonButton(ID_IMAGE_ADJUST,strTemp,0,2)); #pragma end ; 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 则设其为活动 { // the requested view class has already been created; show it 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() { SwitchToView(theApp.m_pVideoTemplate, RUNTIME_CLASS(CTestView1)); //第一个为app里你的模板指针,第二个为ctestview1类的类型识别宏。 } 解释: RUNTIME_CLASS为一个宏,其返回一个CRuntimeClass *指针,可进行类的类型识别。 详细定义请见《深入浅出mfc》 |
[转载] 多文档-多视图切换
最新推荐文章于 2018-08-02 10:40:25 发布