多文档-多视图切换

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》

转载于:https://www.cnblogs.com/cwbo-win/articles/3382535.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值