VC MFC 编程实例2.pdf
《VC MFC 编程实例2.pdf》由会员分享,可在线阅读,更多相关《VC MFC 编程实例2.pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 本文由s d h e x u 贡献 p d f 1。下载 下载 第2章 类 到目前为止,我们只讨论了 M F C的C W n d 类.在本章中,我们将讨论 M F C提供的其他重 要的类,这些类可以分成以下几种:访问用户界面的类,包括 CWn d.帮助绘图的类.提供运行一个应用程序所需功能的类.处理数组和数据列表的类.访问数据库的类.维护文件的类.允许应用程序在网上或 In t e r n e t 上通信的类.一些用来帮助同步和调试应用程序的混合类.本章的目标不是成为 M F C参考指南,而是综合论述 M F C所能提供的功能.对于任何在本 章中没有讨论的类,或有关某一特定的类的详细描述,请
2、参考有关 MFC文献.大部分OLE类没有在本章中论及,因为它们不在本书的讨论范围.2.1 基类 大多数 M F C 类是从三个基类(Ba s e Cl a s s )派生的:C O b j e c t,C C m d Ta r g e t 和C W n d.C C m d Ta r g e t 派生于 C O b j e c t 类,而 C W n d 于C C m d Ta r g e t 类.从C O b j e c t 派生的类,具有在运行 时获得对象大小和名字的能力;从 C C m d Ta r g e t 派生的类,能够处理命令消息;从 C W n d 派生 的类,能控制它们自己的窗
3、口.2.1.1 COb j e c t C O b j e c t 类本身提供的功能较少,主要工作由六个伴生宏(c o m p a n i o n m a c r o s )完成.C O b j e c t 和这些宏一起,允许 C O b j e c t 的派生类在运行时获取类名和对象大小,创建一个类对 象而不必知道类名,以及允许从文件设备中存取一个类的实例而不必知道类名.下面的宏允许类的一个实例在运行时知道它的类名和对象大小:DECLARE_DYNAMIC(CYo u r Cl a s s)/i n t h e .h f i l e IMPLEMENT_DYNAMIC(CYou r Cl a
4、 s s,CYo u r Ba s e Cl a s s)/i n t h e .c p p f i l e 可以用COb j e c t:Ge t Ru n t i m e Cl a s s ()获得运行时使用这些宏的类的详情.下面这些宏包括了前面两个宏的功能,但是允许在不知道类名的情况下创建一个类的实 例.DECLARE_DYNCREATE(CYo u r Cl a s s)/i n t h e .h f i l e IMPLEMENT_DYNCREATE(CYo u r Cl a s s,CYo u r Ba s e Cl a s s)/i n t h e .c p p f i l e
5、在不知道类名的情况下,可以用 CRu n t i m e Cl a s s:Cr e a t e Ob j e c t ()创建一个运用这些宏的类 的实例.下载 例存到磁盘上.第2章 类 19 下面这些宏包括了前面所有宏的功能,但还允许在不知道类名的情况下,把一个类的实 DECLARE_SERIAL(CYo u r Cl a s s)/i n t h e .h f i l e IMPLEMENT_SERIAL(CYo u rCl a s s,CYo u r Ba s e Cl a s s,s c h e m a)/i n t h e .c p p f i l e 有关使用最后两个宏的例子,参见
6、例 70.2.1.2 CCm d Ta r g e t 由C C m d Ta r g e t 派生的类,可以接收和处理来自应用程序菜单或工具栏的命令消息.有关 CCm d Ta r ge t 类的详细的讨论将在第 3章中进行.2.1.3 CWn d 这在第1章中已讨论过,C W n d 的成员函数封装了 Wi n d o w s API中负责维护和创建窗口的 函数.CWn d 是从CCm d Ta r g e t 派生的,因此,也能接收和处理命令消息.注意 在本章中,用下面的字母标明MFC类是从前述的基类中哪一个派生的.O表示该类是从COb j e c t 派生的.O/C表示该类是从COb
7、j e c t 和CCm d Ta r g e t 派生的.O/C/W表示该类是从COb j e c t,CCm d Ta r g e t 和CWn d 派生的.2.2 应用程序,框架,文档和视图类 使用De v e l o p e r St u d i o 的Ap p Wi z a r d(应用程序向导)创建 MFC应用程序时,应用程p a g e 1序从四个 基类派生:CWi n Ap p 是应用程序的应用程序类,负责初始化和运行应用程序.CFr a m e Wn d 是应用程序的框架类,负责显示和搜寻用户命令.CDo c u m e n t 是应用程序的文档类,负责装载和维护文档.文档可
8、以是从文档到网络 设备设置的任何内容.Cv i e w 是应用程序的视图类,负责为文档提供一个或多个视图.注意 在本书中,我们将用应用程序类,框架类等术语表示从这四个基类派生的类.根据所建的应用程序类型,应用程序中 Ap p Wi z a r d 包含相应的基类.对话框应用程序 用户界面只有一个对话框,没有框架类,文档类或视图类.对话框应用 程序只用应用程序类的派生类 CWi n Ap p.对话框用MFC的CDi a l o g 类创建,这将在随后部 分讨论.单文档界面应用程序 能在某个时间内装入和编辑一个文档,使用了前面提及的所有四个 基类.多文档界面应用程序 一次可以装载和编辑多个文档,并
9、且不但使用了所有四个基类,还使用了CFr a m e Wn d 的两个派生类,即 CMDIFr a m e Wn d 和CMDICh i l d Wn d.C D o c u m e n t 和CVi ew 类的派生类负责第1章中描述的文档/视图.使用A p p Wi z a r d 的一个例 子,参见例 2.20 第一部分 基 础 知 识 下载 2.2.1 CWi n Ap p(O/C/W)应用程序类 C Wi n A P P(O/C/W)是应用程序开始后创建的第一个对象,并且是在结束前最 后一个执行的对象.起动时,应用程序类负责创建应用程序的其余对象.对于一个对话框应用程序,应用程序类应用
10、 CDi a l o g 创建一个对话框.对于一个 S D I应用程序,应用程序类创建一个或多个文档模板(见下面的讨论),然后用 模板打开一个空文档.对于一个 M D I应用程序,在主框架类中,应用程序类创建一个或多个文档模板,然后 用模板打开一个空文档.在下一章中还将看到,应用程序类也同操作系统交互,作为中继,将鼠标信息和键盘输 入传给应用程序的其余部分.应用程序类是由 C Wi n A p p 派生的,并且,A p p Wi z a r d 以C X x x A p p 形式进行命名,这里的 Xx x 是应用程序的名字.1.文档模板 应用程序打开一个文档时,文档模板定义创建什么样的框架,文
11、档和视图.要创建一个 文档模板,要么为 S D I应用程序创建一个 C S i n g l e D o c Te m p l a t e 类,要么为 M D I应用程序创建 CMu l t i Do c Te m p l a t e 类,并且用三个类的指针对它进行初始化.p Do c Te m p l a t e=n e w CMu l t i Do c Te m p l a t e (IDR_APPTYPE,RUNTIME_CLASS(CAp p Do c),RUNTIME_CLASS(CCh i l d Fr a m e),RUNTIME_CLASS(CAp p Vi e w);/Yo u
12、 r Do c u m e n t Cl a s s /Yo u r Fr a m e Cl a s s /Yo u r Vi e w Cl a s s 这里的 R U N T I M E _ C L A S S宏返回一个指向类的 C R u n t i m e C l a s s 结构的指针,该结构用 D E C L A R E _ D Y N C R E AT E和I M P L E M E N T _ D Y N C R E AT E宏填加到类中.文档模板通过用 CRu n t i m e Cl a s s:Cr e a t e Obj e c t ()函数创建一个所有三个类的实例来打开
13、一个文档.2.线程 CWi n Ap p 类自身是从 CWi n Th r e a d 派生的.CWi n Th r e a d 类封装了系统中用来创建和维护应 用程序线程的 Wi n d o w s API函数.实际上,可以通过创建 C Wi n T h r e a d 类的另一个实例实现应 用程序多任务.在应用程序中,CWi n Ap p 类代表主要的执行线程.3.CFr a m e Wn d(O/C/W)此框架类 C F r a m e W n d (O/C/W)是应用程序运行时创建的第二个对象,负责显示和监督用 户对应用程序其余部分的命令.对于一个 S D I 应用程序,框架类是从 C
14、 F r a m e W n d 派生的,A p p Wi z a r d 自动命名为:CMa i n Fr a m e.对于一个 M D I 应用程序,框架类派生于 C M D I F r a m e W n d ,A p p Wi z a r d 自动命名为 C M a i n F r a m e.在 M D I应用程序中,每个打开的文档有一个子框架类,每个子框架类是从 CMDICh i l d Wn d 派生的.Ap p Wi z a r d 自动指定子框架类名为 CCh i l d Fr m.对于一个对话框应用程序来说,没有框架类.在前面已提过,一个对话框应用程序是由 一个应用程序类和
15、一个对话框类组成的.4.CDo c u m e n t (O/C)通常,文档类 C D o c u m e n t (O/C)是应用程序打开一个新文档或一个已存在的文档时创建的p a g e 2 下载 第2章 类 21 对象.文档类负责将一个文档赋给它的成员变量,并允许视图类编辑这些成员变量.一个文 档包括从图形文件到可编程控制的任何内容.文档类派生于 C D o c u m n t,A p p Wi z a r d 自动命名 为CXx x Do c,Xx x 是应用程序名.2.2.2 CVi e w (O/C/W)在创建文档类的一个实例之后将创建视图类 CWi e w(O/C/W)的一个实例
16、.视图类负责描述 文档类的内容,它也可以允许用户编辑文档.窗口分区类,即 CSp l i t t e r Wn d,允许文档有多视图;这些视图以由相同视图类的一些实例 创建,也可以由完全不同的视图类实例创建.A p p Wi z a r d 允许视图类从几个基类(包括 C Tr e e Vi e w,C E d i t Vi e w,C R i c h E d i t Vi e w,C L i s t Vi e w 等)之一派生,每一个基类赋予应用程序不同的功能集.有关这些类的更多例子参 见例 1.所有这些类都派生于 C Vi e w 类,不管选择哪个基类,A p p Wi z a r d 自
17、动命名派生类为 CXx x Vi e w,这里的Xx x 是应用程序名.前面已提及,可以从四个基类创建三种类型的应用程序:对话框,单文档,多文档.下 面我们将详细讨论这些应用程序类型.1.对话框应用程序 对话框应用程序是由一个派生于 C Wi n A p p 的应用程序类,和用派生于 CDi a l o g 类创建的对 话框构成的(见图2-1).应用程序类 对话框类 系统创建应用程序 应用程序类创建对 话框类的实例 类的实例 对话框类创建其他控件类,这些 没有创建框架,文档或视图类 类一起创建了屏幕上的窗口.图2-1 一个对话框应用程序由一个应用程序类和一个对话框类创建 2.单文档界面应用程序
18、 单文档界面应用程序包括以下类:从 C Wi n A p p 派生的应用程序类,从 C F r a m e W n d 派生的 框架类,从 C D o c u m e n t 派生的文档类,以及每个文档一个或多个视图类,这些视图类是从一 些派生于CVi e w 的视图类派生的(见图2-2).3.多文档界面应用程序 多文档界面(M D I)应用程序包括以下类:派生于 C Wi n A p p 的应用程序类,派生于 C M D I F r a m e W n d 的框架类,派生于 C M D I C h i l d W n d 的一个或多个子框架类,派生于 CDo c u m e n t 的每个子
19、框架一个文档类和派生于 CVi e w 的每个文档一个或多个视图类(见图2-3).4.应该选择哪一种应用程序类型 对话框应用程序一般在用户交互要求有限的情况下使用.然而就个人而言,宁愿使用一 个带窗体视图(C F o r m Vi e w )的S D I应用程序,而不愿意使用一个对话框应用程序,这样既利用 了创建对话框应用程序的简单性,又具备了单文档应用程序的文档特性.22 第一部分 基 础 知 识 下载 文档类 应用程序类 文档模板类 框架类 框架和视图类在屏 幕上显示窗口 系统创建应 用程序类的 实例 应用程序类创建一个 文档模板,并告知它 装入一个空的文档类 视图类 接着,文档模板类 创
20、建文档,框架和 视图类的一个实例 图2-2 一个SDI应用程序由应用程序,框架,文档和视图类创建 文档类 文档模板类 应用程序类 子框架类 框架类 系统创建应用 程序类的一个 实例 应用程序创建文档模 板和框架类的一个实 例,然后告知文档类 装入一个新的空文档 框架,子框架和视图 类在屏幕上创建窗口 视图类 文档模板创建文档,子框架和视图类的一 个实例 图2-3 一个MDI应用程序由应用程序,框架,子框架,文档和视图类创建 什么时候应该使用 M D I应用程序,而不是 S D I应用程序呢?如果在运行期间应用程序只与 一个文档有关连,那么就使用 SDI方法.但是,如果应用程序能产生多个文档,并
21、对多个文档 进行处理(即使这不是一次性完成的),这时应该采取 MDI的方法,p a g e 3即使在开始时并没有看到在 同一时间修改多个文档的可能.一个 MDI应用程序并不比一个 SDI应用程序复杂多少,却可以 带给用户在同一时间看阅多个文档的方便.2.3 其他用户界面类 除了框架和视图类外,MFC还提供了许多其他支持用户界面的类.控件窗口类 封装了通用控件.菜单类 处理菜单,就如 CWn d 类处理窗口一样.下载 对话框类 封装了对话框和通用对话(Co m m o n Di a l o g)框.控制条类 封装了控制条(工具栏,对话条和状态栏).属性类 封装了属性表(Pr o p e r t
22、y Sh e e t)和属性页(Pro p e r t y Pa g e).2.3.1 通用控件类 第2章 类 23 通用控件类(O/C/W)封装了通用控件(如按钮,列表框等)的功能.这些类派生于 C W n d,继承了诸如 S h o w Wi n d o w ()和M o v e Wi n d o w ()之类的窗口成员函数.当这些类创建窗口时,它们使用一个通用控件窗口类.例如,用 B U T TO N窗口类创建真实的窗口:Cr e a t e (_T(BUTTON),l p s z Ca p t i o n,d w St y l e,r e c t,p Pa r e n t Wn d,n
23、 ID);C B u t t o n 通用控件类创建一个按钮时,它就用 下面表中列出了通用控件类,它们创建的控件,以及它们使用的窗口类.通用控件MFC类和它们的窗口类 MFC类 CAn i m a t e Ct r l (O/C/W)CBu t t o n(O/C/W)CCo m b o Bo x(O/C/W)CEd i t(O/C/W)CHe a d e r Ct r l(O/C/W)CLi s t Bo x(O/C/W)CLi s t Ct r l(O/C/W)CPr o g r e s s Ct r l(O/C/W)CSc r o l l Ba r(O/C/W)CSl i d e r C
24、t r l(O/C/W)CSp i n Bu t t o n Ct r l(O/C/W)CSt a t i c(O/C/W)CTr e e Ct r l(O/C/W)CTa b Ct r l(O/C/W)CDa t e Ti m e Ct r l(O/C/W)CMo n t h Ca l Ct r l(O/C/W)CHo t Ke y Ct r l(O/C/W)CTo o l Ti p Ct r l(O/C/W)通用控件 动画控件 按钮控件 组合框控件 编辑控件 标题控件 列表框控件 列表控件 进度指示控件 滚动条控件 滑块控件 微调按钮控件 静态文本控件 树型控件 标签控件 日期/时间控件
25、月历控件 热键控件 工具提示控件 窗 口 类 Sy s An i m a t e 32 BUTTON COMBOBOX EDIT Sy s He a d e r 32 LISTBOX Sy s Li s t Vi e w 32 m s c t l s _p r o g r e s s 32 SCROLLBAR m s c t l s _t r a c k b a r 32 m s c t l s _u p d o w n 32 STATIC Sy s Tr e e Vi e w 32 Sy s Ta b Co n t r o l 32 Sy s Da t e Ti m e Pi c k 32
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC MFC 编程实例2 编程 实例
限制150内