com应用程序框架
软件构架、架构和框架的区别

软件构架、架构和框架的区别nizhigang2000的文章软件框架(Software Framework)介绍面向某领域(包括业务领域,如ERP,和计算领域,如GUI)的、可复用的“半成品”软件,它实现了该领域的共性部分,并提供一系列定义良好的可变点以保证灵活性和可扩展性。
可以说,软件框架是领域分析结果的软件化,是领域内最终应用系统的模板。
随着软件规模的扩大、应用的广泛和软件复用技术的发展,以子程序或类(Class)为单位的软件复用有许多不足:(1)子程序库日趋其庞大以致于使用人员难以掌握,(2)大多数类粒度很小,且其自身往往不能完成有用的功能。
这一问题迫使人们在复用中将一组类(或模块)及其交互作为一个整体来考虑,由此出现了软件框架。
软件框架至少包含以下组成部分:(1)一系列完成计算的模块,在此称为构件。
(2)构件之间的关系与交互机制。
(3)一系列可变点(也称热点,Hot-spots,或调整点)。
(4)可变点的行为调整机制。
开发人员通过软件框架的行为调整机制,将领域中具体应用所特有的软件模块绑定到该软件框架的可变点,从而得到最终应用系统,这一过程称为软件框架的例化(instantiation)。
通过软件框架的使用,开发人员可将主要精力放在应用所特有的模块的开发上,从而大大提高了软件生产率和质量。
软件框架的行为调整机制是指如何针对具体的应用调整该框架的可变部分、如何在可变点加入特定应用模块所采用的方法和规则。
行为调整机制可分为四种:(1)模板参数化。
软件框架提供代码自动生成工具,该工具根据用户设置的参数自动生成所需的代码。
(2)继承和多态。
通过面向对象中的子类继承和重载,在子类中加入新的功能或改变父类的行为。
(3)动态绑定。
在运行时刻动态绑定所需的对象服务,可通过软件模式技术实现。
(4)构件替换。
通过替换框架中可插拔的构件来加入业务特定的功能,不同于一般的可复用软件制品,软件框架的一个显著特点是逆向控制(Inversion of Control),在复用过程中,前者需被显式调用,控制是在应用特定的模块中,软件框架则不然,应用开发人员只要将应用特定的模块绑定到框架内,框架则根据自己的交互机制自动调用该模块,控制由框架负责。
mfc面试题

mfc面试题MFC(Microsoft Foundation Classes)是微软公司开发的一套C++类库,用于进行Windows应用程序的开发。
MFC面试题主要涉及MFC框架的基本概念、使用方法和相关编程技巧。
以下将以问题和答案的形式介绍几个常见的MFC面试题。
问题1:MFC是什么?它的作用是什么?答:MFC全称为Microsoft Foundation Classes,是微软在VisualC++中提供的一组类库。
它的作用是封装了Windows操作系统的API,简化了Windows应用程序的开发过程。
通过使用MFC,开发人员可以更加方便地创建图形界面、响应用户操作和调用系统功能。
问题2:MFC的架构是怎样的?答:MFC的架构可以分为三层:应用程序层、框架层和操作系统层。
应用程序层是开发人员编写的具体应用程序代码,包括窗口类、对话框类、消息处理函数等。
框架层是MFC提供的类库,包括CWinApp、CFrameWnd、CView等类,用于管理应用程序的生命周期、创建主窗口、处理消息等。
操作系统层是Windows操作系统提供的API,MFC通过封装这些API,以提供更高层次的抽象和易用性。
问题3:如何创建一个MFC应用程序?答:创建MFC应用程序的步骤如下:1. 打开Visual Studio,选择创建新项目。
2. 选择Visual C++ -> MFC -> MFC应用程序。
3. 输入项目名称,选择保存位置,点击确定。
4. 在向导中选择应用程序类型(单文档、多文档、对话框等)、界面风格和其他选项。
5. 点击完成,Visual Studio将自动生成一个基本的MFC应用程序框架。
问题4:如何处理MFC中的消息?答:MFC中的消息处理通过消息映射表和消息处理函数完成。
首先,需要在类声明中使用`DECLARE_MESSAGE_MAP()`宏来声明消息映射表。
然后,在类实现中使用`BEGIN_MESSAGE_MAP`和`END_MESSAGE_MAP`宏来定义消息映射表的起止位置。
MFC学习笔记-窗口创建

MFChierarchy chart(类库列表)MFC与Win321 win32:函数,使用API一步一步搭建应用程序。
(常使用FileView操作)2 MFC编程:实现仍然调用API函数,但是是用类封装API函数,使用向导自动生成应用程序框架。
(常使用ClassView操作)2.1需要掌握的技能2.1.1断点调试2.1.2堆栈调用的查看MFC课程内容1 MFC:MFC的六大机制,文档式架构,常用的MFC类,(10--12)。
2 COM(组件对象模型):COM的原理和应用(6)。
3 ADO/Socket:MFC访问数据库以及一些简单的网络编程。
MFC应用程序编程1 MFC的历史:92(VC1)98(VC6)……………………….2 MFC库基础:2.1 MFC库,微软基础类库。
封装了Windows应用程序编程的各种API以及相关机制的C++类库3 类库的相关头文件件★afx-application framework(应用程序框架x)3.1<stdafx.h>-不是类库头文件,是项目的头文件,称为VC下编译的预编译头文件,用来提高编译速度的。
(*.pch)(头文件是不参加编译的但是他参与生成*.pch)3.2<afxwin.h>-几乎包含了各种常用的MFC有文件3.3 <afxext.h>-提供扩展窗口类的支持(创建工具栏,状态栏等………)MFC应用程序的类型1 支持MFC的控制台应用程序(控制台的第四个选项)1.1 多了一个CWinApp(应用程序类,封装类应用程序启动过沉重所涉及到得相关信息)的全局对象(必须有,而且只能有一个)1.2主函数中多了一个AfxWinInit函数,初始化MFC库中的相关信息2 MFC库程序2.1 MFC支持的静态库2.2 MFC支持的动态库2.2.1 MFC规则库(shared MFC DLL)-可以被各种应用程序调用(非MFC程序,没有MFC类也可以调用)★还是有一个CWinApp派生的CMFC_DLLApp类对象2.2.2 MFC扩展库(using shared MFC DLL)-只能被MFC库所编写的应用程序所调用(对原有的MFC类扩展)★DllMain主函数只能被MFC程序调用3 MFC应用程序-----(注意看父类,子类名字可能不一样)3.1单文档视图应用程序★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CMainFrame(父类是:CFrameWnd)(应用程序主框架窗口类-生成应用程序的主框架-负责各个对象的协调工作)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CSingleDocApp(父类是CWinApp)-(使用前面的3个类来创建对象)3.2多文档视图架构★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CMDIChildWnd(子框架窗口类,父类)★CMDIFrameWnd(主框架窗口类,父类)我们看到的子窗体其实是★CView和★CMDIChildWnd叠加的3.3基于对话框的应用程序★CWinApp 应用程序类★CDialog(对话框窗口类)★★m_pMainWnd保存主窗口地址DoModal 显示对话框MFC相关类的说明1继承自CObject1.1 CObject类:绝大多数MFC类的父类,提供了MFC库的一些机制1 new/delete操作符,定义了与构造函数相关的内存分配函数2 assert和dump调试,堆调试的支持★3 运行时类信息-属于哪个类,还有类的层次结构★4 动态创建★5 序列化1.2 CWinThread: 线程类。
mfc类库大全

1.MFC概述1.MFC是一个编程框架MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
1.封装构成MFC框架的是MFC类库。
MFC类库是C++类库。
这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。
(1)对Win32应用程序编程接口的封装用一个C++ Object来包装一个Windows Object。
例如:classCWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ windowobject的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。
(2)对应用程序概念的封装使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。
MFC把许多类似的处理封装起来,替程序员完成这些工作。
另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。
文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。
(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。
软件构架、架构、框架区别

软件框架(Software Framework)介绍面向某领域(包括业务领域,如ERP,和计算领域,如GUI)的、可复用的“半成品”软件,它实现了该领域的共性部分,并提供一系列定义良好的可变点以保证灵活性和可扩展性。
可以说,软件框架是领域分析结果的软件化,是领域内最终应用系统的模板。
随着软件规模的扩大、应用的广泛和软件复用技术的发展,以子程序或类(Class)为单位的软件复用有许多不足:(1)子程序库日趋其庞大以致于使用人员难以掌握,(2)大多数类粒度很小,且其自身往往不能完成有用的功能。
这一问题迫使人们在复用中将一组类(或模块)及其交互作为一个整体来考虑,由此出现了软件框架。
软件框架至少包含以下组成部分:(1)一系列完成计算的模块,在此称为构件。
(2)构件之间的关系与交互机制。
(3)一系列可变点(也称热点,Hot-spots,或调整点)。
(4)可变点的行为调整机制。
开发人员通过软件框架的行为调整机制,将领域中具体应用所特有的软件模块绑定到该软件框架的可变点,从而得到最终应用系统,这一过程称为软件框架的例化(instantiation)。
通过软件框架的使用,开发人员可将主要精力放在应用所特有的模块的开发上,从而大大提高了软件生产率和质量。
软件框架的行为调整机制是指如何针对具体的应用调整该框架的可变部分、如何在可变点加入特定应用模块所采用的方法和规则。
行为调整机制可分为四种:(1)模板参数化。
软件框架提供代码自动生成工具,该工具根据用户设置的参数自动生成所需的代码。
(2)继承和多态。
通过面向对象中的子类继承和重载,在子类中加入新的功能或改变父类的行为。
(3)动态绑定。
在运行时刻动态绑定所需的对象服务,可通过软件模式技术实现。
(4)构件替换。
通过替换框架中可插拔的构件来加入业务特定的功能,不同于一般的可复用软件制品,软件框架的一个显著特点是逆向控制(Inversion of Control),在复用过程中,前者需被显式调用,控制是在应用特定的模块中,软件框架则不然,应用开发人员只要将应用特定的模块绑定到框架内,框架则根据自己的交互机制自动调用该模块,控制由框架负责。
计算机编程常用术语英语词汇汇总

计算机编程及常用术语英语词汇大全cover覆盖、涵盖create/creation创立、生成crosstab query穿插表查询(for database)CRTP (curiously recurring template pattern)CTS (common type system)通用类型系统cube多维数据集(for database)cursor光标cursor游标(for database)custom定制、自定义data数据data connection数据连接(for database)Data Control Language (DCL)数据控制语言(DCL) (for database)Data Definition Language (DDL)数据定义语言(DDL) (for database)data dictionary数据字典(for database)data dictionary view数据字典视图(for database)data file数据文件(for database)data integrity数据完整性(for database)data manipulation language (DML)数据操作语言(DML) (for database)data mart数据集市(for database)data pump数据抽取(for database)data scrubbing数据清理(for database)data source数据源(for database)Data source name (DSN)数据源名称(DSN) (for database)data warehouse数据仓库(for database)dataset数据集(for database)database 数据库(for database)database catalog数据库目录(for database)database diagram数据关系图(for database)database file数据库文件(for database)database object数据库对象(for database)database owner数据库所有者(for database)database project数据库工程(for database)database role数据库角色(for database)database schema数据库模式、数据库架构(for database)database scrīpt数据库脚本(for database)data-bound数据绑定(for database)data-aware control数据感知控件(for database)data member数据成员、成员变量dataset数据集(for database)data source数据源(for database)data structure数据构造data table数据表(for database)datagram数据报文DBMS (database management system)数据库管理系统(for database) DCOM (distributed COM)分布式COMdead lock死锁(for database)deallocate归还debug调试debugger调试器decay退化decision support决策支持declaration声明declarative referential integrity (DRI)声明引用完整性(DRI) (for database) deduction推导DEFAULT constraint默认约束(for database)default database默认数据库(for database)default instance默认实例(for database)default result set默认结果集(for database)default缺省、默认值defer推迟definition定义delegate委托delegation委托dependent namedeploy部署dereference解引用dereference operator (提领)运算子derived class派生类design by contract契约式设计design pattern 设计模式destroy销毁destructor(dtor)析构函数、析构器device设备DHTML (dynamic HyperText Markup Language)动态超文本标记语言dialog对话框digest摘要digital数字的DIME (Direct Internet Message Encapsulation)直接Internet消息封装directive (编译)指示符directory目录dirty pages脏页(for database)dirty read脏读(for database)disassembler反汇编器DISCO (Discovery of Web Services)Web Services的查找disk盘dispatch调度、分派、派发〔我喜欢“调度〞〕DISPID (Dispatch Identifier)分派标识符distributed computing分布式计算distributed query分布式查询(for database)DNA (Distributed interNet Application)分布式网间应用程序document文档DOM (Document Object Model)文档对象模型dot operator (圆)点操作符driver驱动(程序)DTD (document type definition)文档类型定义double-byte character set (DBCS)双字节字符集(DBCS)dump转储dump file转储文件dynamic cursor动态游标(for database)dynamic filter动态筛选(for database)dynamic locking动态锁定(for database)dynamic recovery动态恢复(for database)dynamic snapshot动态快照(for database)dynamic SQL statements动态SQL语句(for database) dynamic assembly动态装配件、动态配件dynamic binding动态绑定EAI (enterprise application integration)企业应用程序集成(整合) EBCO (empty base class optimization)空基类优化〔机制〕e-business电子商务EDI (Dlectronic Data Interchange)电子数据交换efficiency效率efficient高效end-to-end authentication端对端身份验证end user最终用户engine引擎entity实体encapsulation封装enclosing class外围类别(与巢状类别nested class有关) enum (enumeration)枚举enumerators枚举成员、枚举器equal相等equality相等性equality operator等号操作符error log错误日志(for database)escape code转义码escape character转义符、转义字符exclusive lock排它锁(for database)explicit transaction显式事务(for database)evaluate评估event事件event driven事件驱动的event handler事件处理器evidence证据exception异常exception declaration异常声明exception handling异常处理、异常处理机制exception-safe异常平安的exception specification异常标准exit退出explicit显式explicit specialization显式特化export导出expression表达式facility设施、设备fat client胖客户端feature特性、特征fetch提取field字段(java)field字段(for database)field length字段长度(for database)file文件filter筛选(for database)finalization终结firewall防火墙finalizer终结器firmware固件flag标记flash memory闪存flush刷新font字体foreign key (FK)外键(FK) (for database)form窗体formal parameter形参forward declaration前置声明forward-only只向前的forward-only cursor只向前游标(for database) fragmentation碎片(for database)framework框架full specialization完全特化function函数function call operator (即operator ())函数调用操作符function object函数对象function overloaded resolution函数重载决议functionality功能function template函数模板functor仿函数GAC (global assembly cache)全局装配件缓存、全局配件缓存GC (Garbage collection)垃圾回收(机制)、垃圾收集(机制) game游戏generate生成generic泛化的、一般化的、通用的generic algorithm通用算法genericity泛型getter (相对于setter)取值函数global全局的global object全局对象global scope resolution operator全局范围解析操作符grant授权(for database)granularity粒度group组、群group box分组框GUI图形界面GUID (Globally Unique Identifier)全球唯一标识符hand shaking握手handle句柄handler处理器hard-coded硬编码的hard-copy截屏图hard disk硬盘hardware硬件hash table散列表、哈希表header file头文件heap堆help file帮助文件hierarchy层次构造、继承体系hierarchical data阶层式数据、层次式数据hook钩子Host (application)宿主(应用程序)hot key热键hyperlink超链接HTML (HyperText Markup Language)超文本标记语言HTTP pipeline HTTP管道HTTP (HyperText Transfer Protocol)超文本传输协议icon图标IDE (Integrated Development Environment)集成开发环境IDL (Interface Definition Language)接口定义语言identifier标识符idle time空闲时间if and only if当且仅当IL (Intermediate Language)中间语言、中介语言image图象IME输入法immediate base直接基类immediate derived直接派生类immediate updating即时更新(for database) implicit transaction隐式事务(for database) incremental update增量更新(for database)index索引(for database)implement实现implementation实现、实现品implicit隐式import导入increment operator增加操作符infinite loop无限循环infinite recursive无限递归information信息infrastructure根底设施inheritance继承、继承机制inline内联inline expansion内联展开initialization初始化initialization list初始化列表、初始值列表initialize初始化inner join内联接(for database)in-place active现场激活instance实例instantiated具现化、实体化(常应用于template) instantiation具现体、具现化实体(常应用于template) integrate集成、整合integrity完整性、一致性aggregation聚合、聚集algorithm算法alias别名align排列、对齐allocate分配、配置allocator分配器、配置器angle bracket尖括号annotation注解、评注API (Application Programming Interface)应用(程序)编程接口app domain (application domain)应用域application应用、应用程序application framework应用程序框架appearance外观append附加architecture架构、体系构造archive file归档文件、存档文件argument引数(传给函式的值)。
计算机软件的组成

计算机软件的组成计算机软件是指用于完成某种任务的计算机程序和相关的文档,一般没有物理性质构成。
由于计算机系统中硬件规格不同,因此软件也有所差异。
综上所述,计算机软件一般包括下列几部分:一、操作系统:操作系统是计算机最基本的软件,它提供了资源调度、运算控制、数据管理等功能。
操作系统的组成部分一般包括下面的部分:内核、设备驱动、硬件监控系统、设备管理程序、内存管理程序、文件管理程序、进程和线程管理程序等。
二、中间件:中间件是一种支撑性的软件,主要用于解决客户端与数据库、应用程序等间的软件兼容性和可移植性,以及促进上层应用软件的可移植性和协作。
中间件一般由com/dcom/COM+、CORBA、组播、消息队列、EJB等组成。
三、应用软件:应用软件是指应用来完成科学、商业、文学、艺术等方面特定任务的软件,它是计算机处理数据的最主要软件,它包括人机界面、数据库管理、文字处理、相片处理、网络应用等等。
根据用户的重要性,应用软件又可以分为系统软件和用户软件两大类。
四、游戏软件:游戏软件是指针对不同的平台、设备运行的数字游戏软件,它主要用于游戏开发和制作。
游戏软件常见的组成部分包括游戏脚本和编辑器、游戏引擎和框架、游戏美术资源、游戏媒体和音频、游戏表现、游戏AI算法、网络游戏客户端和服务端脚本等。
五、工具软件:工具软件是一类方便用户完成特定任务的软件,它提供了很多便捷的操作,大大提高了用户的效率。
工具软件一般包括网络设置工具、文件协调工具、文件夹处理工具、多媒体编辑工具、文档创建工具、系统度量工具、测试工具等等。
六、调试软件:调试软件是用来检查计算机程序运行正确与否,是软件测试工程师必备的工具。
它一般包括错误报告工具、检查工具、汇编调试器、单步调试器、动态追踪工具、性能测试工具、代码位置编辑器等。
七、病毒查杀软件:病毒查杀软件主要是针对恶意软件、木马、恶意广告软件、网络盘可疑文件、病毒和流氓软件进行抗击。
它一般由恶意软件检测、病毒查杀、防止木马攻击和自动更新等功能组成。
.NETFramework各版本(.NET2.03.03.54.0)区别

.NETFramework各版本(.NET2.03.03.54.0)区别什么是.NET Framework? .NET Framework⼜称 .Net框架。
是由微软开发,⼀个致⼒于敏捷软件开发(Agile software development)、快速应⽤开发(Rapid application development)、平台⽆关性和⽹络透明化的软件开发平台。
.NET是微软为下⼀个⼗年对服务器和桌⾯型软件⼯程迈出的第⼀步。
.NET包含许多有助于互联⽹和内部⽹应⽤迅捷开发的技术。
.NET框架是微软公司继Windows DNA之后的新开发平台。
.NET框架是以⼀种采⽤系统虚拟机运⾏的编程平台,以通⽤语⾔运⾏库(Common Language Runtime)为基础,⽀持多种语⾔(C#、VB、C++、Python等)的开发。
.NET也为应⽤程序接⼝(API)提供了新功能和开发⼯具。
这些⾰新使得程序设计员可以同时进⾏Windows应⽤软件和⽹络应⽤软件以及组件和服务(web服务)的开发。
.NET提供了⼀个新的反射性的且⾯向对象程序设计编程接⼝。
.NET设计得⾜够通⽤化从⽽使许多不同⾼级语⾔都得以被汇集。
.NET Framework有哪些版本?.NET框架 1.0、.NET框架 1.1、.NET框架 2.0、.NET框架 3.0、.NET框架 3.5、.NET框架 4.0。
.NET Framework各版本概述和选择建议NET Framework 1.0(CLR 1.0)和1.1(CLR 1.1)已经过时,强烈建议不要使⽤。
NET Framework 2.0(CLR 2.0)是⽬前⼴泛使⽤的版本,提供了⼤部分的基础功能。
NET Framework 3.0(CLR 2.0)增加了WPF、WCF、WF和Card Space等功能。
NET Framework 3.5(CLR 2.0)增加了LINQ、 Entity Framework等功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[ 原创文档本文适合高级读者已阅读19956次]文档COM应用程序框架 1.2设计方案试验A版作者:许松森下载COM应用程序框架本文只介绍《COM应用程序框架》的主要设计部分,更多、更详细的文档信息请参见下载文件包中的文档和源代码。
一、设计说明《COM应用程序框架》是把标准的Microsoft Windows多文档处理应用程序使用COM技术来设计.所以针对多文档处理应用程序的需求,不再多写。
如果您不了解请参见MSDN或者是其它编程基础方面的书籍。
《COM应用程序框架》分为两种,一种是COM多文档应用程序框架,第二种是单文档应用程序框架。
在这里我们只介绍多文档应用程序,不介绍单文档应用程序。
《COM应用程序框架》建立在一个单独的AIFrame.DLL文件中,所有的功能都通过COM接口进行操作.《COM应用程序框架》将使用如下两种库的组合进行设计,1.使用MFC+ATL组合, 2.使用WTL+ATL组合,下面分别对这两种组合的优点和缺点说明一下,最后选择一种最优组合。
1. 使用MFC+ATL组合图:2. 使用WTL+ATL组合图:从上面两附图中很容易看出,使用MFC+ATL组合开发COM应用程序框架,MFC 存在一层函数调用,代码执行速度会慢一些。
小程序可能看不出来,大程序也就明显了。
如果使用WTL+ATL组合开发COM应用程序框架,就不会多一层调用,代码执行速度非常快,就像是用Win32 SDK编写代码一样没有什么区别,因为WTL是模板代码,在编译后不会存在一层函数调用。
所以《COM应用程序框架》将采用WTL+ATL组合进行设计,这可能是最佳方案。
二、通用设计1. 数据视图所谓数据视图,就是添加到《COM应用程序框架》中每一个窗口,无论这个窗口是用做什么,还是什么形状的,统称为数据视图。
所有客户端程序向《COM应用程序框架》添加的数据视图必须从IDataView 纯虚接口继承下来,必须是.这样《COM应用程序框架》才能工作正常。
数据视图纯虚接口:IDataView。
父类是IDispatch。
2. 命令的响应函数函数名称:NotifyCommand(UINT codeNotify, UINT cmdID,VARIANT_BOOL *bHandle);参数:codeNotify - 通报代码,现在没有使用。
cmdID –某个命令ID,可以是菜单也可以是工具格中的按钮。
bHandle –如果命令还继续向下路径设置为VARIANT_TRUE,不向下路径设置为VARIANT_FALSE.三、《COM多文档应用程序框架》设计1. 框架《COM多文档(MDI)应用程序框架》只有一个MDI主窗口,但是可以拥有N多MDI子窗口,每个MDI子窗口可以拥有多个数据视图,每一个数据视图必须从IDataView接口继承下来。
MDI主窗口框架类名:CMDIFrame,接口是IMDIFrame,是所有MDI子窗口、停靠数据视图、工具条、菜单的容器,并负责把命令分发给当前活动的MDI 子窗口或者是数据视图。
MDI子窗口框架类名:CMDIChildFrame,接口是IMDIChildFrame。
可以拥有N多数据视图,并把命令分发给当前活动的数据视图。
MDI子窗口框架集合类名:CMDIChildFrames,接口是IMDIChildFrames,用来管理所有的MDI子窗口和创建DMI子窗口。
《COM多文档应用程序框架》接口图:2. 事件MDIFrame事件目前仅提供两个事件。
OnQuit(VARIANT_BOOL *vbQuit)NotifyCommand(UINT codeNotify, UINT cmdID, VARIANT_BOOL *bHandle)IMDIChildFrame事件目前仅提供一个事件。
NotifyCommand(UINT codeNotify, UINT cmdID, VARIANT_BOOL *bHandle) 3. 命令路由MDI主窗口框架、MDI子窗口框架事件类和数据视图都拥有一个命令处理方法NotifyCommand。
《COM多文档应用程序框架》就是通过NotifyCommand 向客户端发送命令处理。
MDI主窗口事件首先接收到菜单或者是工具条命令,处理完必后返回或者是发送给MDI子窗口框架事件处理,在MDI子窗口框架处理完必后返回或者是发送给让当前活动的数据视图处理.完成后命令返回。
命令是否向下路由是有NotifyCommand方法的bHandle变量决定,设置为VARIANT_TRUE命令向下路由,设置为VARIANT_FALSE命令不向下路由。
4. UML类图用COM设计的类比较长抓图不太方便,UML图、类的信息和函数成员请参见源代码。
四、客户端设计客户端应用程序必须实现两个功能块,第一个是数据视图,第二个是命令处理。
五、项目文件夹说明六、讲解使用MFC调用《COM应用程序框架》的实例这个实例使用MFC库调用《COM应用程序框架》建立起的一个简单的文本程序。
以方便了解如何使用《COM应用程序框架》的流程和主要部分,和《COM 应用程序框架》方便之处。
使用MFC项目向导,建立一个对话框项目应用(项目名称自己定义)假如是MFC_Test_AiFrame项目。
在stdafx.h文件加入。
#include "..\inc\aiframeimpl.h"在某个.cpp中加入#include "..\inc\AiFrame_i.c"向项目中添加一个文本编辑视图类,如下图.新建立的类名是CTextView, 基类(Base class)是CeditView类。
单击完成按钮。
打开TextView.h文件加入如下代码:CDataViewImp是IDataView数据视图接口实现模板类。
class CTextView : public CEditView,public CDataViewImpl{....NC_BEGIN_MAP()//在这里加入您的视图命令处理.NC_END_MAP()virtual HRESULT STDMETHODCALLTYPE CreateWnd(HWND hWndParent);...}打开TextView.cpp文件加入如下代码://必须有CreateWnd方法,有《COM 应用程序框架》调用。
HRESULT STDMETHODCALLTYPE CTextView::CreateWnd(HWND hWndParent){CWnd *pWnd = (CWnd*)this;CWnd *wndParent = CWnd::FromHandle(hWndParent);CRect _Rect(0,0, 100, 100);if (pWnd->Create(NULL,("MFC CEditView "),WS_HSCROLL|WS_VSCROLL|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL,_Rect, wndParent, 0)) {m_pEdit = &GetEditCtrl();return S_OK;}return S_FALSE;}CxxxxxApp类中主要完成一个功能.继承CNotifyObjectImpl对象,用来处理《COM应用程序框架》发送来的命令.CNotifyObjectImpl类是InotifyObject 接口的实现模板类。
建立主窗口和一个新建文件的子菜单响应该命令.class CFrameApp : public CWinApp,public CComObjectRootEx,public IDispEventImpl{public:CFrameApp();IMDIFrame *m_lpMdiFrame;void WinMain();BEGIN_SINK_MAP(CFrameApp)//不使用 _ATL_FUNC_INFO结构iFrmae 在调用事件的时候返回"没有注册的库"。
这是为什么?//SINK_ENTRY_EX(EventType,DIID__IMDIFrameEvents, 0x1, OnQuit)//SINK_ENTRY_EX(EventType,DIID__IMDIFrameEvents, 0x2, NotifyCommand)SINK_ENTRY_INFO(EventType,DIID__IMDIFrameEvents, DISPID_SHOW, OnQuit, &OnShowInfo1)SINK_ENTRY_INFO(EventType,DIID__IMDIFrameEvents, DISPID_SHOW2, NotifyCommand,&OnShowInfo3)END_SINK_MAP()NC_BEGIN_MAP()NC_COMMAND_ID_HANDLER(ID_FILE_NEW,FileNew)NC_COMMAND_ID_HANDLER(ID_FILE_EXIT,OnFileExit)NC_COMMAND_ID_HANDLER(ID_HELP_ABOUT,OnAbout)NC_COMMAND_ID_HANDLER(ID_HELP_WINDOWS, OnWindowWindows)NC_END_MAP()HRESULT CreateMain();void FileNew(UINT codeNotify, UINT cmdID, VARIANT_BOOL *bHandle);void OnFileExit(UINT codeNotify, UINT cmdID, VARIANT_BOOL *bHandle);void OnAbout(UINT codeNotify, UINT cmdID, VARIANT_BOOL *bHandle);void OnWindowWindows(UINT codeNotify, UINT cmdID, VARIANT_BOOL *bHandle);STDMETHODIMP OnQuit(VARIANT_BOOL *vbQuit){//MessageBox(0, _T("Events. Quit"), _T(""), 0);return S_OK;}// 重写public:virtual BOOL InitInstance();// 实现DECLARE_MESSAGE_MAP()};HRESULT CFrameApp::CreateMain(){CreateMDIStruct lpMDI={0};HRESULT hr = 0;hr = CoCreateInstance(CLSID_MDIFrame, NULL, CLSCTX_ALL, IID_IMDIFrame, (VOID**)&m_lpMdiFrame);if (FAILED(hr)){ATLASSERT(0);return hr;}lpMDI.cbSize = sizeof(CreateMDIStruct);lpMDI.lParam = NULL;lpMDI.lpszWindowName = L"Test COM MDIFrame";lpMDI.hMenu = LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));hr = m_lpMdiFrame->CreateWnd(&lpMDI);m_lpMdiFrame->ShowMe(VARIANT_TRUE);hr = this->DispEventAdvise((IUnknown*)m_lpMdiFrame);if (FAILED(hr)){ATLASSERT(0);}return hr;}。