duoview

来源:互联网 发布:美家预算软件 编辑:程序博客网 时间:2024/05/22 18:37

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》

原创粉丝点击