duoview

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》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值