多视图是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)是指应用程序中只能打开一个...
在"单文档托盘"这个项目中,我们看到开发者想要在单文档程序中集成系统托盘功能。这通常是为了提供更方便的用户交互和管理,比如让程序在后台运行,或者在任务栏不显示主窗口时,用户仍然可以通过托盘图标来访问和...
下面我们将深入探讨这个主题,以及如何实现这些功能。 首先,我们需要创建一个基于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更合适。那么,如何在单文档应用程序中实现...
<br> 二、 实现技术 <br> 新建一个基于CFormView的单文档应用程序,再添加一个窗体和与之对应的基于 CFormView的新视类,然后通过在主框架类里添加控制代码和菜单控制实现这两个窗体的动态 切换...
在这个项目中,我们将关注“单文档”界面,以及如何在该界面上绘制矩形和圆形。 首先,我们要理解“单文档”(Single Document Interface, SDI)的概念。SDI是一种用户界面模式,允许用户在同一时间内处理一个文档...
这个例子程序“MulitView”很可能是实现这些功能的一个小型示例,通过运行和调试,可以更直观地理解这些概念和过程。 总之,单文档窗体切分视图切换是提高用户体验和生产力的重要功能,尤其在处理大量数据或需要...
这个TestApplication可能就是一个实际演示了这些概念的示例项目。通过深入研究和调试源代码,可以更清晰地理解如何在MFC中结合使用OpenGL进行图形绘制,以及如何实现MFC单文档中嵌入Word的功能。这种结合可以为开发...
在这个场景下,我们需要实现的是在主文档界面中弹出一个对话框,然后在该对话框内再弹出一个子对话框,并将子对话框中的用户输入值传递回最初的单文档程序。这一过程涉及到多个步骤,包括对话框的创建、消息处理以及...
这个例子可能会涉及到`OnLButtonDown`、`OnMouseMove`和`OnLButtonUp`等消息处理函数,用于捕捉鼠标事件,动态画出跟随鼠标移动的椭圆。`OnPaint`函数可能用于绘制静态的椭圆,而`OnEraserButton`可能用于清除画布。...
JUnit单元测试框架是基于Java语言的一种...整个文档内容非常全面,不仅为初学者提供了入门知识,也为高级用户提供了深入的指导,对于想要深入理解JUnit 5的测试框架和扩展机制的开发者来说,是一份不可多得的参考资料。