当前位置:文档之家› 基于XML的J2EE框架研究与设计

基于XML的J2EE框架研究与设计

M O D E R N C OM P U T E R

2009.2

现代计算机(总第三

一期)

0引言

随着J2EE 的不断发展,人们提出了许多不同层面

的Web 应用框架,例如Struts 、Hibernate 、Spring 等[2]。但是,此类框架的广泛应用受到诸多因素的制约:(1)项目的开发与员工的培训周期长、成本高;(2)基于此框架的系统过于庞大复杂,搭建较为困难,维护和扩展的成本较高;(3)框架侧重于业务逻辑层的实现,尤其对于JavaScript 、Ajax 、HTML 组件、XSTL 等客户端的技术支持不够。

1问题的提出

目前,尽管MVC 模式的应用越来越广泛,但是由图1所示,仅仅基于MVC 模式并配以业务逻辑层和持久层的J2EE 架构设计会带来以下的一些不足:

首先,利用传统的数据库连接技术,页面的数据显示需采用分页机制,那么在大数据量的情况下,用户每查询一页,都要重新进行一次SQL 语句拼接和查询操作,并重新对查询结果作出处理,在浏览器端显示给用户。如果用户进行频繁查询操作以及多个用户查询同一数据的情况下,服务器端更要反复对数据库进行相同的查询操作,大量重复的数据将会在客户端和服务器端进行传输,这样就会占用相对宝贵的带宽和数据库服务器资源,并且还会导致网络阻塞、服务器瘫痪。

其次,在持久层中,系统不可避免的要对数据库进行增、删、改、查等操作,并且频繁的建立与关闭连接,会极大的减低系统的性能,甚至还会造成内存泄漏。

在View (JSP )视图中,JSP 页面中的Sriptlet 代码随着应用系统复杂度的增加而增多,甚至在视图组件中还把控制逻辑、数据访问逻辑和格式逻辑都混在一起,这必然会导致系统在模块化、重用和维护等方面违背了J2EE 架构的初衷。同时,随着企业应用的多样化,单一的浏览器模式应用远远不够,诸如手机无线上网、系统管理员通过GUI 界面访问企业级应用等多种新需求都给View 的实现提出新的要求。

图1J2EE 的MVC 结构

2基于XML 的Web 框架设计

通过上述分析,在构建框架时以J2EE 多层架构

为基础,在各层次间采用XML 作为数据表达和交换的工具,在表示层添加应用控制器对用户请求进行集中、模块化地管理,在持久层设置了一个统一数据连接池接口,不仅改进了表示层中传统的MVC 模式,将业务逻辑层和持久层更好的分离,而且提高了系统存取性能,并具备良好的扩展性。

基于XML 的J2EE 框架研究与设计

伍杰华

章成源

(广东工贸职业技术学院计算机系,广州

510510)

要:关键词:XML ;J2EE ;数据交互

收稿日期:2008-11-19

修稿日期:2009-02-13

作者简介:伍杰华(1982-),男,广东新兴人,研究生,助教,研究方向为数字图像处理、模式识别、软件工程

针对已有的J2EE 模型,提出了一个基于XML 的J2EE Web 应用框架。该框架运用XML

技术作为各层次间的数据交互格式,在表示层使用应用控制器对请求集中、模块化地进行操作管理,并在业务逻辑层提供一系列基础服务组件和在持久层用连接池技术实现高效的数据存取。应用实例证明,运用该框架能够有效降低各层次间耦合,提高系统扩展性和开发效率。

貋貟貧

现代计算机(总第三

期)

M O D E R N C OM P U T E R 2009.22.1表示层和业务逻辑层设计

在该框架中,表示层由接入控制器(Servlet )、页面显示(JSP )、数据模型(JavaBean )以及应用控制器(ApplicationController )等几个部分组成,业务逻辑则主要由权限管理、会话管理、数据访问、日志管理等各业务组件组成,两层之间还有一个XML 数据转换组件,该组件是一个基于特定格式的XML 格式变换接口,主要负责各层次间数据和XML 的转换,具体设计如图2所示。

图2表示层和业务逻辑层设计

在表示层中,接入控制器接受用户请求并发送至应用控制器,应用控制器在响应请求后根据用户的请求命令,选择业务逻辑层相应的业务组件完成操作,它的作用是把请求管理这些内容从一个基于Servlet 的前端控制器中分离出来,使请求处理组件的获取和调用集中化。在实现中,在控制器中应用命令策略模式,图3中的类图显示了本模式中输入请求是如何映射到与其相关的组件上。

图3表示层控制器设计类图

首先ApplicationCont roller 类调用Command -

Factory 类解析输入请求,然后CommandFactory 使用CommandMap 把输入的请求转换为处理组件的名称,同时创建一个命令,并返回Application-Controller 把相应的请求包装成命令委派到各组件相应的操作上,在这里,CommandFactory 类作用是一个工厂,Com -

mandMap 则设计成配置文件,该文件记录业务组件以及实现的方法名称,实现的顺序图如下图所示:

图4表示层控制器顺序图

2.2XML 数据转换组件

XML 数据转换组件是本框架的一个重要组成部分,它实质上是一个基于特定XML 格式的变换接口。在功能上该接口分为数据转换和XML 解析两部分。数据转换接口有两个职责,一是负责把客户端传来的数据转换成XML 数据,传给业务逻辑层相应的组件;二是把经过持久层处理返回的结果集转换成XML 数据,并根据其业务逻辑返回表示层的数据模型组件,显示在客户端,或者送往另外一个事务进行数据处理,由于

XML 的标准性和扩展性,可以在浏览器、GUI 、移动等不同的客户端进行相应需求进行数据显示。XML 解析接口主要负责把XML 语句进行解析,根据相应组件所实现方法的功能拼接成SQL 语句,进行数据处理。

2.3持久层

在业务逻辑层和持久层我们设置一个统一数据接口,该接口可以实现对异构数据库的存取及连接池机制。当统一数据接口接受来自业务逻辑层的数据访

问请求时,连接池就会从缓冲区取出一个连接,数据存

取完毕后,该连接就会被收回,而结果集则返回XML 数据转换组件中的数据转换接口进行XML 转换,再根据业务逻辑需求进行数据显示或者进一步的事务处

理,其具体实现以及数据流动过程如下图所示:

图5持久层数据流程图

貟貨

现代计算机(总第三○一期)

Design and Implementation of IEEE802.1Q VLAN's Frame Switching Principle Experiment

WANG Bao-ping,CHENG Xin-dang

(Department of Computer and Information Techniques,Nanyang Normal University,Nanyang473061)

Abstract:

Keywords:IEEE802.1Q;VLAN;Wireshark;Linux

Aiming at the complexity and abstract characteristics of VLAN,design experimental items

to facilitate students better understanding frame structures and switching principles of

IEEE802.1Q VLAN.Students'integrative practice capacity is promoted greatly,and their

creative and thinking ability are strengthened and enhanced.The practice shows that the

experimentation items has achieved its desired purpose and has universal significance to

promote students'integrative use ability for correlative knowledge and techniques.Some

frondose experiments are illuminated for exploring the practical process of experimental

teaching.

Research and Design of a J2EE Framework

Based on XML

WU Jie-hua,ZHANG Chen-yuan

(School of Computer Science and Technology,Guangdong College of Industry and Commerce,Guangzhou510510)Abstract:

Keywords:XML;J2EE;Data Alternatives

According to J2EE model,proposes a Web application framework based on XML is pro-

posed in the paper.We use XML as the data alternative format among layers and use ap-

plication controller to handle the request intensively and modularizely,furthermore,supplies

a series of service discreteness in business layer and apply connection pool to realize the

efficient data access in persistent layer.The instance proves that this framework can effec-

tively reduce coupling,improves the system expansibility and development efficiency.

3结语

实践证明,使用该框架所开发的系统不仅有效降

低了各层次间的耦合度,而且提高了框架的可扩展性

和可重用性,并改进了数据库的存取性能和提高了人

员的开发效率。

参考文献

[1]刘秋梅,郑耿忠.基于J2EE和XML的数字图书馆系统

设计及实现.情报杂志,2006:22~26

[2]林星,徐锡山.基于Struts、EJB、Hibernate的J2EE框架研

究.福建电脑,2007

[3]蔡七年,王明强.XML语法特性在SAX中的应用研究.

软件技术,2008:64~67

[4]牛纪祯,陆坤,宋丹.以XML扩充的MVC设计模式.计

算机工程与设计,2005:3372~3374

○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○(上接第154页)

貋貟販

M O D E R N C OM P U T E R2009.2

关于单文档多视与MFC的初始化过程

单文档多视的实现 多视图是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 个子菜单“视图一”和“视图二”,添加相应函数: (void CMultiViewApp::OnShowFirstview()和 void CMultiViewApp::OnShowSecondview()); 注意这里将菜单消息的响应都放在app对象里面,而不是放到MainFrame对象中进行。 Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加

Step 5:现在已经创建了视图,并且都和文档关联起来了。现在要作的就是视图间的转换。在void CMultiViewApp::OnShowFirstview()中添加实现代

第三章 单文档应用程序

第三章单文档应用程序 在本学习情境中主要学习: (1)单文档应用框架 (2)文档与视图 3.1 MFC消息处理 3.1.1事件驱动程序设计 事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图1所示: 图1事件驱动程序模型 3.1.2 MFC的消息处理 在DOS应用程序下,可以通过getchar()、getch()等函数直接等待键盘输入,并直接向屏幕输出。而在Windows下,由于允许多个任务同时运行,应用程序的输入输出是由Windows 来统一管理的。 Windows操作系统包括三个内核基本元件:GDI, KERNEL ,USER。其中GDI(图形设备接口)负责在屏幕上绘制像素、打印硬拷贝输出,绘制用户界面包括窗口、菜单、对话框等。系统内核KERNEL支持与操作系统密切相关的功能:如进程加载,文本切换、文件I/O,以及内存管理、线程管理等。USER为所有的用户界面对象提供支持,它用于接收和管理所有输入消息、系统消息并把它们发给相应的窗口的消息队列。消息队列是一个系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程。每个窗口维护自己的消息队列,并从中取出消息,利用窗口函数进行处理。框图2如下:

vc 6.0打造单文档界面与多文档界面的编程

vc++6.0打造单文档界面与多文档界面的编程 VC++6中,可以利用MFC向导分别创建单文档和多文档界面的应用程序。有了这两种类型的应用程序,您就可以实现简单的记事本,写字本和WORD的功能了。 以下介绍一个在文档中输出一段文字,点击菜单项,输入文字内容按OK按钮后可以更改输出的文字。 1.首先,点击MFC向导,选择多文档视图类型,新建一个名为MdiDemo的工程。 2.新建一个对话框。上面放置一个Static控件和一个Edit控件,按CTRL+W,将Edit控件改成m_Caption. 3.新建一个类与对话框对应,如CDlgDemo类。 4.在菜单中,增加一项Demo,并增加菜单项Test.按 CTRL+W,并双击后,在消息的上面选择Doc,下面选择Command,双击就产生了对应的事件处理函数。 5.在MdiDemoDoc.cpp类中输入以下: // DlgDemo.cpp : implementation file // #include "stdafx.h" #include "MdiDemo.h" #include "DlgDemo.h" #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgDemo dialog CDlgDemo::CDlgDemo(CWnd* pParent /*=NULL*/) : CDialog(CDlgDemo::IDD, pParent) { //{{AFX_DATA_INIT(CDlgDemo) m_Caption = _T(""); //}}AFX_DATA_INIT } void CDlgDemo::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgDemo) DDX_Text(pDX, IDC_EDIT1, m_Caption); //}}AFX_DATA_MAP }

单文档和多文档窗口使用方法解析

单文档和多文档窗口使用方法解析 一.实验目的 掌握利用开发平台创建单文档和多文档窗口方法 掌握在窗口中输出文字、图形的方法及 MFC 中相关类的使用 二.实验要求 1 创建一个单文档窗口,在文档类定义一个整型变量,其取值范围从 0 ~ 1000 循环,在视图的中间显示该数字,当用户点击窗口的不同区域时,变量值按不同的增量增加并显示。 提示:在修改数据后,使用 Invalidate() 函数引起 MFC 对 OnDraw() 的调用,这样就可以用修改后的数据进行画图了。关于对文档类的访问,见本实验的技术支持。 2 创建一个单文档窗口,鼠标在窗口上单击后在鼠标的位置显示一正方形,点击 20 次后清窗口,新的点击将不再增加新的正方形,而是将已输入的正方形在原位置显示,当然,在每20 单击后要重新清窗口。(要求用 MFC 的通用类保存单击的信息,如 CList 类) 知识点:画线 当单击鼠标左键时,就可以获得一个点,即线条的起点。接着按住鼠标左键并拖动一段距离后松开鼠标,此时也可以获得一个点,即线条的终点。也就是说,我们需要捕获两个消息,一个是鼠标左键按下消息(WM_LBUTTONDOWN),在该消息响应函数中可以获得将要绘制的线条的起点;另一个是鼠标左键弹起来的消息(WM_LBUTTONUP),在该消息响应函数中可以获得将要绘制的线条的终点。有了这两个点就可以绘制出一条线。 利用SDK全局函数实现画线功能 为了进行绘图操作,必须获得一个设备描述表(DC),因此,首先定义一个HDC类型的变量:hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。因为CWnd类有一个成员变量(m_hWnd),而CView类派生于CWnd类,因此该类也有这样的一个成员变用于保存窗口句柄,而GetDC函数可以直接把这个成员变量作为参数来使用。 利用MFC的CDC类实现画线功能 该类提供一个数据成员m_hDC类用来保存与CDC相关的DC句柄。其道理与CWnd 类提供成员变量m_hWnd保存与窗口相关的窗口句柄是一样的。 CDC* pDC = GetDC(); pDC->MoveTo(m_ptOriginal); pDC->LineTo(point); ReleaseDC(pDC);

SDI(单文档界面)

英文全称Single Document Interface 如果使用过基于 Windows 的应用程序,也许已经注意到不是所有用户界面看上去或操作起来都一样。用户界面样式主要有两种:单文档界面(SDI) 和多文档界面(MDI)。SDI 界面的一个示例就是Microsoft Windows 中的WordPad(记事本)应用程序(图 6.1)。在WordPad 中,只能打开一个文档,想要打开另一个文档时,必须先关上已打开的文档。 图记事本,一个单文档界面(SDI) 应用程序 象Microsoft Excel 和 Microsoft Word for Windows 这样的应用程序就是MDI 界面;它们允许同时显示多个文档,每一个文档都显示在自己的窗口中(图 6.2)。按照是否包含有能在窗口或文档之间进行切换的子菜单的Windows 菜单项,就能识别出 MDI 应用程序。 图Microsoft Excel,一个多文档界面 (MDI) 应用程序 要决定哪种界面样式最好,需要看应用程序的目的。一个处理保险索赔的应用程序可能要用多文档界面MDI 样式,一个职员很可能会同时处理一个以上索赔,或者需要对两个索赔进行比较。另一方面,日历程序最好设成SDI(单文档界面)样式,因为不大需要同时打开一个以上日历;在极少的情况下,可以再打开一个单文档界面应用程序的实例。 SDI 样式更常用,《程序员指南》中的大多数实例都采用SDI 应用程序。关于创建 MDI 应用程序有一些需要单独考虑的问题和技巧,放在本章后面“多文档界面 (MDI) 应用程序”一节。

除了以上两个最常用的界面样式SDI 与MDI 外,第三种界面样式变得越来越流行,这就是资源管理器样式的界面(图 6.3)。资源管理器样式界面是包括有两个窗格或者区域的一个单独的窗口,通常是由左半部分的一个树型的或者层次型的视图和右半部分的一个显示区所组成,如在Microsoft Windows 的资源管理器中所见到的那样。这种样式的界面可用于定位或浏览大量的文档、图片或文件。 图Windows 的资源管理器,资源管理器样式的界面 除了本章所附的 MDI 与SDI 应用程序示例,实用程序向导还提供了一种比较界面样式差别的方法。可以用向导来为每一种样式生成一个框架,然后观察它生成的窗体与代码。 此外,在AUTO CAD绘图程序中,有SDI 口令,通过该口令可以设置CAD程序是当文档显示或多文档显示。SDI有0、1两个值。当设置为0时,为单文档显示;设置为1时为多文档显示,即每次打开一个图形文件,都会启动一次CAD程序。

VC++多文档编程

教案 2007 ~2008 学年第一学期 主讲教师 课程名称面向对象程序设计(VC++)课程类别专业基础课 学时及学分80、4 授课班级 使用教材 VC++的使用及面向对象软件工程实例分析 系(院、部) 教研室(实验室) 计算机应用教研室

课时授课计划 课次序号: 一、课题:ch6 多文档编程 二、课型:讲授 三、目的要求: 1、理解多文档程序的结构,熟悉多文档窗口的特点。 2、掌握多文档程序的设计方法。 3、熟悉视图分割的方法和应用。 四、重点、难点: 重点:多文档程序的结构和设计方法。 难点:多文档程序中视图与文档的交互作用较难理解。 五、教学方法及手段: 案例式教学:设计目标、关键技术、结合实例讲解语法、总结。 六、参考资料: 《面向对象程序设计与VC++实践》揣锦华编著,西安电子科技大学出版社,第11章 《C++面向对象程序设计》李涛编著,高等教育出版社,第9章 七、作业: 习题6.2 6.3 6.4 6.6 八、授课记录: 九、授课效果分析:

十、教学进程(教学内容、教学环节及时间分配等) 1、复习 多文档程序的框架结构:5个主要的类比如, 创建多文档程序ex_mdi,包含的主要类有:CmainFrame Cex_mdiView Cex_mdiDoc Cex_mdiApp CchildFrame 与单文档程序相比,多了一个子窗口类类CchildFrame 2、导入课题 多文档程序可以运行用户同时打开和使用多个文档,比单文档程序更方便,比如Word、Excel等。 3、教学内容 ch6.1 多文档程序的结构和多文档窗口特点 [通过实例分析] 例6-1:建立一个多文档应用程序,用户能打开多个文档,并能在多个文档中输入信息,并可以利用“保存/另存为”保存每个文档中输入的信息,也可以利用“打开”新建的子窗口显示文件的内容。 关键技术: 利用视图类的ONCHAR消息映射函数OnChar实现键盘输入; 利用文档的串行化实现数据的保存、文件的打开。 实现过程: (1)建立单文档应用程序ex_mdi (2)为文档类Cex_mdiDoc添加一个字符串变量,用于保存输入的字符串。 CString m_strText; (3)在文档类Cex_mdiDoc的构造函数中初始化字符串变量。 m_strText.Empty(); //初始化字符串为空 (4)处理键盘输入:为视图类添加WM_CHAR消息映射函数OnChar(),在函数 中添加“取得输入字符”代码: pDoc->m_strText+=nChar; Invalidate(); //强迫调用OnDraw()函数,更新视图 [运行:从键盘输入,但看不见输入的信息] (5)在视图中显示输入的内容:在视图类的OnDraw()中添加输出代码。 pDC->TextOut(0,10,pDoc->m_strText);

单文档多视图

相信这就是vc的弊病吧!项目作了很久发现应该用多视图,可是刚开始建立工程的时 候考虑不周阿,没办法,只能从网上搜了,竟搜到了一个不错的函数可以解决这个问题:void CMainFrame::SwitchToView(int nForm) { //CDocument* pDoc = GetActiveDocument(); CView *pOldActiveView=GetActiveView(); //保存旧视图 CView *pNewActiveView=(CView*)GetDlgItem(nForm); //取得新视图 if(pNewActiveView==NULL) { switch(nForm) //这些ID是对话框的标志符,但也可以用其他的标志 { case IDD_PLANT_VIEW : pNewActiveView=(CView*)new CPlantView; break; case IDD_HSUB_VIEW : pNewActiveView=(CView*)new CHSubView; break; } CCreateContext context; //将文挡和视图相连 context.m_pCurrentDoc=pOldActiveView->GetDocument(); pNewActiveView->Create(NULL,NULL,WS_BORDER|WS_CHILD,CFrameWnd::rectDefault,this,nForm, &context); pNewActiveView->OnInitialUpdate(); } SetActiveView(pNewActiveView); //改变活动的视图 pNewActiveView->ShowWindow(SW_SHOWMAXIMIZED); //显示新的视图 pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图 pNewActiveView->GetDocument()-SetTitle(\"。。。。\"); if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CHSubView)) pOldActiveView->SetDlgCtrlID(IDD_HSUB_VIEW); else if(pOldActiveView-GetRuntimeClass() ==RUNTIME_CLASS(CPlantView)) pOldActiveView-SetDlgCtrlID(IDD_PLANT_VIEW); pNewActiveView-SetDlgCtrlID(AFX_IDW_PANE_FIRST); delete pOldActiveView; //删除旧视图 RecalcLayout(); //调整框架窗口 }; 这个函数很好用大家可以参考一下。其中IDD_HSUB_VIEW 等都是新建立的FormView,也就是继承了CFormView类的新类。注意将各个新类中的构造函数改成public,才能用此函数不出错。 由于最近做的一个程序用到了单文档多视图切换,所以把它总结一下。内容如下:

MFC多文档和单文档视结构

MFC多文档和单文档视结构 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ //这一页的代码最重要了,呵呵……什么都在这里面呢; 单文档新建: CWinApp_________docManager->docSingleTemplate 的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。 多文档新建: CWinApp_________docManager->docMultTemplate的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。 单文档打开:CWinApp_________docManager中经过一个

打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调 用父类的此函数___________docSingleTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。 多文档打开:CWinApp_________docManager中经过一个 打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调 用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。 他们两个只有在docMultTemplate和docSingleTemplate的OpenDocumentFile函数中的动作不同,单文档负责新建框架类和视类但是如果存在了我们就不重建了,只是给其赋值。而多文档无论如何都会新建一个视类和框架类文档类,这也就是为什么他是多文档结构的原因。

基于单文档的(MFC)窗口分割

基于单文档的窗口分割 简介部分是对于MFC应用程序的介绍,在博客上看到的,觉得受益匪浅,所以写到这里。不需要的朋友可以从第二部分程序设计开始看起。

目录 基于单文档的窗口分割 (1) 简介 (3) MFC应用程序类型简介 (3) 单文档与多视图 (5) 单文档多视图程序设计 (6) Step1:创建单文档的MFC程序 (6) Step2:声明相关的变量。 (6) Step3:重载OnCreateClient()函数,进行窗口的分割 (7) Step4:设置行列初始值 (9) 附:代码 (10)

简介 MFC应用程序类型简介 在Microsoft VC++ 6.0中,基于MFC的应用程序一般分为以下几种: 多文档界面(MDI) 单文档界面(SDI) 基于对话框的应用程序。 图1-1 应用程序类型 其中单文档又可分为单视图的和多视图的。

图1-2 单文档单视图 图1-3 单文档多视图 一般情况下,单文档仅需要单视图就够了,如Windows自带的记事本、画图程序等等,但

在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。 在MFC的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了增加视图(AddView)与删除视图(RemoveView)函数,以及当文档内容改变时通知其所有视图的方法(UpdateAllViews)。 1-4 类视图 通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多视图的主要方法。单文档与多视图 一般地,单文档与多视图有三种情况: 1)在多文档界面MDI中,每个视图位于MDI的一个独立子文档框架中,视图对象基于同一个视图类。用户可以通过“窗口|新窗口”菜单,为同一文档的视图再创建一个窗口,通过新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动实现同步,用户修改一个视图的内容,在另外的视图中也自动更新。 MFC框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,并且是完全自动的。 2)视图对象基于同一视图类,所有视图位于同一文档框架中。 分割窗口将单文档窗口的视图区分割成几个独立的视图,框架从同一视图类创建多个视图对象。Word的子窗口即属于这种类型。 3)视图对象基于不同的视图类,所有的视图位于同一文档框架中。 多个视图共享同一文档框架,但从不同的视图类创建,每个视图可以为文档提供不同的观察和编辑方法。比如在一个窗口里观察文档的不同部分,或者是在一个窗口里用不用类型的视图观察同一个文档。这种类型的实现方法是通过重载框架类CMainFrame的成员函数OnCreateClient实现,用户可以根据不同需要将窗口分为垂直或水平的多个分割窗口。

使用VC++实现单文档多视图的一种方法

使用VC++实现单文档多视的程序框架 91550部队指控中心池晓春赵鹤群 摘要:本文分析了在对同一数据源使用多种形式显示的情况下,采用单文档多视的程序框架开发显示软件的原因,介绍了单文档多视框架(SDMV)的实现方法,并在Windows 2000环境下,使用Visual C++ 6.0创建开发单文档多视框架的示例程序。 关键词:单文档多视(SDMV)视图切换 1选择SDMV程序框架的原因 程序员使用Visual C++ 6.0开发软件时,为了缩短开发时间和工作量,通常借助AppWizard生成基于MFC的SDI或MDI应用程序框架。但是要实现对同一数据源使用多种形式显示的功能,使用SDI或MDI的框架进行软件开发都有各自的缺陷,不能较好的满足软件需求,这是因为: 使用SDI框架的应用程序具有单一文档和单一视图,即程序运行时只能够生成一个文档类对象和一个视图类对象,虽然满足使用同一数据的要求,但是由于只有一个视图窗口,无法实现以多种形式显示试验数据。 使用MDI框架的应用程序具有多窗口的特点,可以使用多个子窗口来实现对不同数据源的浏览,但它的视图和文档一一对应,即视图+文档构成一个子窗口。由于各个子窗口之间数据相互独立,如果要保持数据同步更新就需要采用特殊的技术,所以对于用户在程序各个窗口之间对同一数据源进行不同形式的浏览,用这种方式实现起来既费时又费力。 由于SDI和MDI这两种Windows标准应用程序框架不能满足软件开发的需要,就特别需要一种被称为“单文档多视”的应用程序框架。顾名思义,该框架用单一的文档类来统一管理应用程序的所有数据,同时用多个视图以多种显示形式(如:表格、曲线、趋势图)等来显示这些数据。程序在任何时刻都可以用同一个窗口,通过切换视图的方法以不同的形式显示同一数据。可以看出,使用SDMV程序框架开发数据显示软件,就能够更好的满足用户的需求。 2SDMV程序框架的实现方法 SDMV程序框架的本质是文档-视图结构,它针对同一数据源使用不同的形式在多个视图中显示。如果数据发生改变,所有和数据相关的视图中的显示内容也会随之改变来反映数据的变化。针对这种特点,可以考虑通过改造SDI框架来实现SDMV框架,借助VC ++提供的AppWizard生成SDI应用程序框架,可以在很大程度上减少工作量,

实验4单文档和多文档窗口

实验4 单文档和多文档窗口 一.实验目的 掌握利用开发平台创建单文档和多文档窗口方法 掌握在窗口中输出文字、图形的方法及 MFC 中相关类的使用 二.实验要求 1 创建一个单文档窗口,在文档类定义一个整型变量,其取值范围从 0 ~ 1000 循环,在视图的中间显示该数字,当用户点击窗口的不同区域时,变量值按不同的增量增加并显示。 提示:在修改数据后,使用 Invalidate() 函数引起 MFC 对 OnDraw() 的调用,这样就可以用修改后的数据进行画图了。关于对文档类的访问,见本实验的技术支持。 2 创建一个单文档窗口,鼠标在窗口上单击后在鼠标的位置显示一正方形,点击 20 次后清窗口,新的点击将不再增加新的正方形,而是将已输入的正方形在原位置显示,当然,在每20 单击后要重新清窗口。(要求用 MFC 的通用类保存单击的信息,如 CList 类) 知识点:画线 当单击鼠标左键时,就可以获得一个点,即线条的起点。接着按住鼠标左键并拖动一段距离后松开鼠标,此时也可以获得一个点,即线条的终点。也就是说,我们需要捕获两个消息,一个是鼠标左键按下消息(WM_LBUTTONDOWN),在该消息响应函数中可以获得将要绘制的线条的起点;另一个是鼠标左键弹起来的消息(WM_LBUTTONUP),在该消息响应函数中可以获得将要绘制的线条的终点。有了这两个点就可以绘制出一条线。 利用SDK全局函数实现画线功能 为了进行绘图操作,必须获得一个设备描述表(DC),因此,首先定义一个HDC类型的变量:hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。因为CWnd类有一个成员变量(m_hWnd),而CView类派生于CWnd类,因此该类也有这样的一个成员变用于保存窗口句柄,而GetDC函数可以直接把这个成员变量作为参数来使用。 利用MFC的CDC类实现画线功能 该类提供一个数据成员m_hDC类用来保存与CDC相关的DC句柄。其道理与CWnd 类提供成员变量m_hWnd保存与窗口相关的窗口句柄是一样的。 CDC* pDC = GetDC(); pDC->MoveTo(m_ptOriginal); pDC->LineTo(point); ReleaseDC(pDC);

将多页单文档分解成一页多文档

将多页文档拆分为单页或多页: 1、在Word里面打开那个需要分割的文档(假设它的文件名叫做“原始文档.doc”); 2、键入ALT+F11打开VBA编辑器,选择菜单“插入-模块”; 3、粘贴下面的代码: Option Explicit Sub SplitPagesAsDocuments() Dim oSrcDoc As Document, oNewDoc As Document Dim strSrcName As String, strNewName As String Dim oRange As Range Dim nIndex As Integer Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Set oSrcDoc = ActiveDocument Set oRange = oSrcDoc.Content oRange.CollapsewdCollapseStart oRange.Select For nIndex = 1 To https://www.doczj.com/doc/c95146549.html,rmation(wdNumberOfPagesInDocument) oSrcDoc.Bookmarks("\page").Range.Copy oSrcDoc.Windows(1).Activate Application.Browser.Target = wdBrowsePage Application.Browser.Next strSrcName = oSrcDoc.FullName strNewName = fso.BuildPath(fso.GetParentFolderName(strSrcName), _ fso.GetBaseName(strSrcName) & "_" &nIndex& "." &fso.GetExtensionName(strSrcName)) Set oNewDoc = Documents.Add Selection.Paste oNewDoc.SaveAsstrNewName oNewDoc.Close False Next Set oNewDoc = Nothing Set oRange = Nothing

MFC单文档实现多视图

一.介绍: 多视图是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添加一个菜单项目“视图”,该菜单项有两个子菜单“视图一”和“视图二”,添加相应函数:voidCMultiViewApp:: OnShowFirstview()和void CMultiViewApp:: OnShowSecondview() Step 4:创建新的视图:在BOOL CMultiViewApp::InitInstance()中添加代码:

第10讲 单文档与多文档

第11章单文档与多文档本章主要介绍Visual C++中的文档/视图结构的工作机制

11.1 概述

11.1.1单文档界面与多文档界面 VC的MFC库支持三种不同的应用程序单文档界面(SDI) 多文档界面(MDI) 基于对话框的应用程序 SDI的应用程序 只有一个窗口 MDI的应用程序每次 可以读写多个文件或 文档,可同时对多个 文档进行操作,可以 有多个子窗口 主 要 差 别 在创建SDI界面的应用程序时,不生成 CChildFrame类,CMainFrame类的基类 为CFrameWnd 在创建MDI界面的应用程序时, CMainFrame类的基类为 使用AppWizard创建SDI和MDI界面的应用程序的过程几乎完全一样

视图是文档的不同表现形式,一个*.html 语言的文件,在浏览器里和在记事本中打 开的表现形式是不同的但它们操作的是同 一个文件这就是一个文档对应两视图 由于每一个文档可以有多个视图,但 每个视图只能对应于一个确定的文档 多文档程序需要解决的问题仅仅是多 个文档的数据管理方法的问题 多文档程序,最初的文档模板只支持主窗口,但每次打开一个新文档时都调用CDocument的函数OnNewDocument,建立一个由CMDIChildWnd派生的新的MDI子窗口,这些窗口

11.1.2 文档/视图结构在文档/视图结构中 对数据进行管理和维 护,数据保存在文档 类的成员变量中文档类通过串行化 的过程将数据保存 到磁盘文件或数据库中 文档类还可处理来自如菜单、工具栏按钮和加 速键的WM_COMMAND 消息 除WM_COMMAND 外,文档不能处理其它的Windows 消息 由此我们可以看出,命令消息可以被多种对象处理,这些对象除了窗口和视图外,还可以是文档、文档模板或应用程序本身这一点与Windows 消息和控件通知消息不同,因为Windows 消息和控通过调用文档和视图的接口将修 在文档和用户之 间起中介作用视图可以直接或间接 的访问文档类中的成 员变量,它从文档类 中(而不是从存储介质 中)将文档中的数据取 出来,然后在屏幕上 它可以接收用户的输入,并接受用户的修改

相关主题
文本预览
相关文档 最新文档