多视图是VC开发中经常要用到的技术之一,一般地实现单文档多视图有两种方式1)通过视图分割的技术(使用CSplitterWnd实现),将窗口分割为多个部分,每个部分显示各自显示不同的视图,这种技术实现起来比较简单,并且相关的资料也很多。2)通过一个文档关联多个视图,窗口显示整个视图。第二种实现较第一种复杂,这里给出详细的实现方法。
Step 1:使用VC 6.0新建一个Project,命名为:MultiView。除选择单文档属性外,一切使用“默认”方式。于是你可以获得五个类:CMainFrame ,CMultiViewApp,CMultiViewDoc,CMultiViewView,和CAboutDlg;
Step 2:新建一个新的视图View,添加一个新的MFC Class(Insert->New Class),基类为CView(或者CView的派生子类,如CEditView等)。类的名字为CAnotherView,这就是新的视图;并为CAnotherView添加GetDocument的实现:
CMultiViewDoc* CAnotherView::GetDocument()
{
return (CMultiViewDoc*)m_pDocument;
}
Step 3:在CMultiViewApp添加成员变量记录这两个视图:
private:
CView* m_pFirstView;
CView* m_pAnotherView;
给程序菜单IDR_MAINFRAME添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数(void CMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview());
Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码:
…….
//创建一个新的视图
CView* m_pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView();
m_pFirstView = m_pActiveView;
m_pAnotherView = new CAnotherView();
//文档和视图关联
CDocument* m_pDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
CCreateContext context;
context.m_pCurrentDoc = m_pDoc;
//创建视图
UINT m_IDFORANOTHERVIEW = AFX_IDW_PANE_FIRST + 1;
CRect rect;
m_pAnotherView->Create(NULL,NULL,WS_CHILD,rect,m_pMainWnd,
m_IDFORANOTHERVIEW,&context);
……
Step 5:现在已经创建了视图,并且都和文档关联起来了。现在要作的就是视图间的转换。在void CMultiViewApp:: OnShowFirstview()中添加实现代码:
void CMultiViewApp::OnShowFirstview()
{
// TODO: Add your command handler code here
UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);
::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);
m_pAnotherView->ShowWindow(SW_HIDE);
m_pFirstView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pFirstView);
((CFrameWnd*) m_pMainWnd)->RecalcLayout();
m_pFirstView->Invalidate();
}
在void CMultiViewApp:: OnShowSecondview()中添加实现代码:
void CMultiViewApp::OnShowSecondview()
{
// TODO: Add your command handler code here
UINT temp = ::GetWindowLong(m_pAnotherView->m_hWnd, GWL_ID);
::SetWindowLong(m_pAnotherView->m_hWnd, GWL_ID, ::GetWindowLong(m_pFirstView->m_hWnd, GWL_ID));
::SetWindowLong(m_pFirstView->m_hWnd, GWL_ID, temp);
m_pFirstView->ShowWindow(SW_HIDE);
m_pAnotherView->ShowWindow(SW_SHOW);
((CFrameWnd*)m_pMainWnd)->SetActiveView(m_pAnotherView);
((CFrameWnd*) m_pMainWnd)->RecalcLayout();
m_pAnotherView->Invalidate();
}
Step 6:为了演示,这里将不同的视图给予一个标记,在CMultiViewView和CAnotherView的OnDraw方法中分别添加以下代码:
pDC->TextOut(400,300,"First View");
pDC->TextOut(400,320,pDoc->GetTitle());
和
pDC->TextOut(400,300,"Another View");
pDC->TextOut(400,320,pDoc->GetTitle());
至此就大功告成了,但是实现过程中有4点说明:
1) 实现中由于使用到相关的类,因此在必要的地方要include相关的头文件,这里省略;CAnotherView的默认构造函数是Protected的,需要将其改为Public,或者提供一个产生CAnotherView对象的方法(因要创建视图对象);
2) 这里给出的是一个示例代码,实际开发中可以通过参考实现获得自己想要实现的具体应用情况(例如视图类的不同、数量不同,更重要的还有业务逻辑的不同实现等);
3) 本文的示例代码已上传到Blog,可以通过下面的地址获得代码。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/swell624/archive/2006/08/14/1062132.aspx
分享到:
相关推荐
在这个"MFC单文档多视图实例"中,我们将深入探讨如何使用MFC来创建一个具有切分窗口、左侧列表视图以及右侧可变视图类型的应用程序。 首先,"单文档"(Single Document Interface, SDI)是指应用程序中只能打开一个...
在这个例子中,我们将扩展SDI,使其包含不止一个视图,以便在同一文档中显示不同类型的信息。 接下来,我们探讨如何实现多视图。在MFC中,可以通过继承CView类并重写其OnDraw()方法来创建自定义视图。但是,为了...
在"单文档托盘"这个项目中,我们看到开发者想要在单文档程序中集成系统托盘功能。这通常是为了提供更方便的用户交互和管理,比如让程序在后台运行,或者在任务栏不显示主窗口时,用户仍然可以通过托盘图标来访问和...
下面我们将深入探讨这个主题,以及如何实现这些功能。 首先,我们需要创建一个基于MFC的SDI应用程序。这可以通过在Visual Studio中选择“新建项目” -> “MFC” -> “MFC应用程序”来完成。在向导中,确保选择“单...
要改变单文档应用的背景颜色,我们通常需要覆盖CView类的OnDraw方法,因为这是绘制视图内容的地方。在OnDraw方法中,我们可以使用设备上下文(Device Context,DC)来设置背景色。设备上下文是GDI(Graphics Device ...
首先,我们要理解什么是单文档接口(Single Document Interface)。在MFC中,SDI允许用户一次打开并处理一个文档。在这种结构中,应用程序通常有一个文档类、一个视图类和一个框架窗口类。在这个案例中,我们的...
【标题】"vs2010单文档示例程序"是一个使用Microsoft Visual Studio 2010开发的软件工程实例,主要展示了如何构建一个基于单文档界面(Single Document Interface, SDI)的应用程序。在SDI中,用户界面通常只显示一...
在这个"**MFC单文档画图程序**"中,我们主要关注的是如何利用MFC框架来实现一个基础的绘图应用,包括图形的选中、反选、移动和删除等功能。 首先,我们要理解MFC中的单文档界面(Single Document Interface, SDI)...
"MFC—单文档画图"这个主题,主要涉及的是如何在MFC的单文档界面(Single Document Interface, SDI)下实现画图功能,并且支持通过用户交互来添加和删除图形。 首先,单文档界面是MFC应用程序设计中的一种模式,它...
分析这个项目可以进一步了解如何在MFC中实现单文档视图、多视图以及控件操作。 总的来说,MFC单文档视图设计允许开发者创建灵活且功能丰富的Windows应用程序。通过熟练掌握文档/视图架构、多视图管理和控件操作,你...
在VC++(Visual C++)开发环境中,"vc单文档切分窗口"是一个常见的功能,它允许用户在一个单一的文档界面(SDI, Single Document Interface)中分割显示多个视图或者工作区。这个功能通常用于增强用户的交互体验,...
"改变单文档背景"这个话题涉及到对MDI子窗口或者主框架窗口背景色的自定义。在本示例中,我们将探讨如何在VC6环境下实现这一功能。 首先,你需要了解MFC框架的基本结构。MFC是微软提供的一个C++类库,它封装了...
在一些情况下,应用程序有许多信息要显示,当一个窗口内显示不下时,VC提供的MDI应用程序可以解决这个问题,但是如果应用程序只是对单个文档,采用多种方式显示,则采用SDI更合适。那么,如何在单文档应用程序中实现...
在这个项目中,我们将关注“单文档”界面,以及如何在该界面上绘制矩形和圆形。 首先,我们要理解“单文档”(Single Document Interface, SDI)的概念。SDI是一种用户界面模式,允许用户在同一时间内处理一个文档...
这个例子程序“MulitView”很可能是实现这些功能的一个小型示例,通过运行和调试,可以更直观地理解这些概念和过程。 总之,单文档窗体切分视图切换是提高用户体验和生产力的重要功能,尤其在处理大量数据或需要...
这个TestApplication可能就是一个实际演示了这些概念的示例项目。通过深入研究和调试源代码,可以更清晰地理解如何在MFC中结合使用OpenGL进行图形绘制,以及如何实现MFC单文档中嵌入Word的功能。这种结合可以为开发...
在这个场景下,我们需要实现的是在主文档界面中弹出一个对话框,然后在该对话框内再弹出一个子对话框,并将子对话框中的用户输入值传递回最初的单文档程序。这一过程涉及到多个步骤,包括对话框的创建、消息处理以及...
这个例子可能会涉及到`OnLButtonDown`、`OnMouseMove`和`OnLButtonUp`等消息处理函数,用于捕捉鼠标事件,动态画出跟随鼠标移动的椭圆。`OnPaint`函数可能用于绘制静态的椭圆,而`OnEraserButton`可能用于清除画布。...
JUnit单元测试框架是基于Java语言的一种...整个文档内容非常全面,不仅为初学者提供了入门知识,也为高级用户提供了深入的指导,对于想要深入理解JUnit 5的测试框架和扩展机制的开发者来说,是一份不可多得的参考资料。