《VC 第1章VC 编程基础.pdf》由会员分享,可在线阅读,更多相关《VC 第1章VC 编程基础.pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 本文由b b b y y y 22贡献 p p t 1。第1章 C+编程基础 Vi s u a l C+编程基础 教学目标 了解Wi n d o w s 编程基础 了解 Wi n d o w s 编程基础:消息和事 Wi n d o w s 编程基础:资源管理、设备独立性等概 件、资源管理、设备独立性 等概 念 了解MFC类的基础知识 了解MFC类的基础知识 MFC 熟练掌握用向导建立应用程序框 架 明确MFC应用程序结构 明确MFC应用程序结构 MFC C+程序设计 电子教案程序设计 王明福编 Vi s u a l C+程序设计电子教案王明福编 教学内容 Wi n d o w s 编程概念
2、 1.1 Wi n d o w s 编程概念 MFC基础 1.2 MFC基础 第一个MFC MFC应用程序 1.3 第一个MFC应用程序 1.4 应用程序分析 返 回 Wi n d o w s 编程概念 1.1 Wi n d o w s 编程概念 Wi n d o w s 程序设计是基于事件驱动,程序的运行是由事件的发生来控制 的。消息驱动机制是Wi n d o w s 程序设计的精髓。1.1.1 事件与消息 当用户按下一个键、移动鼠标或单击鼠标按钮时,计算机通知Wi n d o w s 系统已经发生了一个事件,以及事件的种类、发生的时间和发生的位置(如坐标值)。事件以如下三种方式产生:通过输
3、入设备,如键盘和鼠标,产生硬件事件。通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上 的控件。来自Wi n d o w s 内部,例如,当一个后面的窗口显示到前面来。Wi n d o w s 消息是在Wi n d o w s.h 文件中用宏定义的常数。消息常数名通常 为WM_XXX,例如,WM_WUIT、WM_CHAR。例如:当用户单击鼠标左键时,将发送WM_LBUTTONDOWN消息,而双击则发送WM_LBUTTONDBLCLK消息。1.1.2 消息驱动 DOS程序是由一系列预先定义好的操作序列的组合,具有一定的开头、中 间过程和结束,也就是程序直接控制程序事件和过程的顺序。它的基
4、本模型 如图1-1(a)所示。事件驱动的程序设计不是由事件的顺序来控制,而是由事件的发生来控 制,而这种事件的发生是随机的、不确定的,并没有预定的顺序。它在程序设计过程中除了完成所需功能之外,更多地考虑了用户的各种 输入,并根据需要设计相应的处理程序。程序开始运行时,处于等待用户输 入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事 件状态。如图1-1(b)所示。1.1.3 消息响应函数 返 回 消息响应函数是用于处理特定消息的一些代码。例如,当用户点击 某菜单项时,希望程序弹出一个口令对话框,那么,只要在相应的消息处 理函数中编写弹出一个口令对话框的代码。1.1.4 资源管理
5、 程序员设计任何应用程序均将涉及到诸如菜单、对话框、消息框以及 按钮等标准格式数据。Wi n d o w s 将这些数据保存在资源文件中,程序员可 通过编辑工具编辑、修改这些资源文件,使其提供所需的菜单或按钮,并 将其放入设计的程序之中。1.1.5 设备独立性 设备独立性或称设备无关性。在编程时,程序员不必关心诸如打印机、鼠标、键盘、显示器、声卡、显示卡、CDROM等多种设备的类型及其驱动 程序。Wi n d o w s 95/98/2000提供了图形设备接口之类的各种抽象接口,使 得在程序中可以通过调用标准函数与硬件交互,这些函数通过设备环境的 数据结构,由Wi n d o w s 操作系统
6、将其映射到相应的物理设备,而程序员则 无需了解其提供的操作设备的各种指令。返 回p a g e 1 MFC基础 1.2 MFC基础 VC+已集成了MFC库,VC+资源编辑器、Ap p Wz i a r d 和Cl a s s Wi z a r d 明显 降低了应用程序编码的时间。Ap p Wz i a r d 为整个应用程序生成框架代码,同 时Cl a s s Wi z a r d 为消息处理程序生成原型和函数体。1.2.1 MFC类库简介 MFC(Mi c r o s o f t Fo u n d a t i o n Cl a s s)类库是用来编写Wi n d o w s 应用程序的 C+
7、类集,封装了大部分Wi n d o w s API函数,所以使用MFC类库和VC+提 供的高度可视化的应用程序开发工具,使开发变得简单。MFC类库包括COb j e c t 类及其派生类以及其他类。有这样一些重要的类(都 是COb j e c t 的派生类):应用程序类 应用程序类CWi n Ap p。CWn d 类及派生类 CWn d 类及派生类 类及派生类。CDo c u m e n t 及其派生类 CDo c u m e n t 及其派生类 及其派生类。Fi l e Se r v i c e s Gr a p h i c a l Dr a w i n g Gra p h i c a l
8、Dr a w i n g Se r v i c e s。Dr a w i n g。Ob j e c t s。Me n u s。Ob j e c t s。Me n u s ODBC Da t a b a s e 和 DAO Da t a b a s e Su p p o r t。In t e r n e t Se r v i c e s。等等。Ser v i c e s MFC应用程序框架 1.2.2 MFC应用程序框架 在VC+6.0中,MFC Ap p Wi z a r d 能方便地生成应用程序框架,然后在此基 础上进行进一步的编辑工作。MFC Ap p Wi z a r d 生成的应用程序
9、包括这样一 些要素:Wi n Mai n 函数。Wi n d o w s 要求应用程序必须有一个Wi n Ma i n 函数,它隐 Wi n Ma i n 藏在应用程序框架中。应用程序类 应用程序类。也称CMy He l l o Ap p。该类的每一个对象代表一个应用程 序。程序中默认定义一个全局CMy He l l o Ap p 对象,即t h e Ap p。应用程序启动。启动应用程序时,Wi n d o w s 调用应用程序框架内置的 应用程序启动 Wi n Ma i n 函数,Wi n Ma i n 寻找CWi n Ap p 由派生出的全局构造的应用程序对 象。成员函数 CMy He l
10、 l o Ap p:In i t In s t a n c e 成员函数CMy He l l o Ap p:In i t In s t a n c e CMy He l l o Ap p:In i t In s t a n c e。当Wi n Ma i n 函数找到应用程 序对象时,它调用伪成员函数In i t In s t a nc e,这个成员函数调用所需的构造 并显示应用程序的主框架窗口。必须在派生的应用程序类中重载 In i t In s t a n c e,因为CWi n Ap p 基类不知道需要什么样的主框架窗口。成员函数CWi n Ap p:Ru n 成员函数CWi n Ap p
11、:Ru n CWi n Ap p:Ru n。函数Ru n 隐藏在基类中,但是它发送应用程序 的消息到窗口,以保持应用程序的正常运行。在Wi n Ma i n 调用In i t In s t a n c e 之 后,便调用Ru n。CMa i n Fr a m e 类。类CMa i n Fr a m e 的对象代表应用程序的主框架窗口。CMa i nFr a m e 类 当构造函数调用基类CFr a m e Wn d 的成员函数Cr e a t e 时,Wi n d o w s 创建实 际窗口结构,应用程序框架把它连接到C+对象,函数Sh o w Wi n d o w s 和Up d a t e
12、 Wi n d o w 也是基类的成员函数,必须调用它们类显示窗口。文档与视图类 文档与视图类。这一部分比较复杂,会在后面的章节中单独提出详 细讲解。关闭应用程序 关闭应用程序。如果用户通过关闭主框架窗口类关闭应用程序,这 个操作就将激发一系列事件的发生,包括CMa i n Fr a m e 对象的析构、从 Ru n 中退出、从Wi n Ma i n 中退出和CMy He l l o Ap p 对象的折构。返 回 MFC消息映射及处理 1.2.3 MFC消息映射及处理 在MFC中,管理消息的方式是:当发生某一个消息(比如用户移动了鼠标 和按下键盘等)该消息进入消息队列,操作系统根据消息提供的信
13、息决定 由那个应用程序来处理,该应用程序依照一定的方式查找应用程序中各个 类的消息映射(一组宏,这些宏用来确定某个消息及相应的处理程序的对 应关系)找到处理程序,然后由处理程序执行。MFC程序要处理消息的种类如下:Wi n d o w s 消息。以WM_开头,但WM_COMMAND例外。通常由窗口和 视图来处理。由控件和其他子窗口发送给父窗口的WM_COMMAND消息。这些消息 中包括EN_CHANGE通知码。如当用户在编辑框中键入文本或进行修改,就回向系统发送一个带EN_CHANGE通知码的WM_COMMAND消息。来自于用户界面对象的WM_COMMAND消息,如表1-1所示。这些用户 界面
14、对象包括菜单、工具栏按钮和快捷键。系统在处理这些用户界面对象 的消息和前面有所不同,我们来看看标准的处理方式。1.2.4 程序的运行过程p a g e 2 如图1-2所示,当运行用户应用程 序时,程序中的框架首先获得控制权,然后依次执行下述功能:(1)做部分初始化工作。(2)构造应用程序的唯一应用类的对象,构造应用类对象时要调用其构造函数。(3)调用Wi n Ma i n()函数(此函数也隐 藏在应用框架内部)。(4)从Wi n Ma i n()函数返回后,删除应 用程序的唯一应用类的对象,删除时要 调用其析构函数。(5)终止应用程序。(6)进行退出应用程序前的收尾工作,如删除注册的窗口类并释
15、放其内存等。(7)返回 返 回 返 回 第一个MFC MFC应用程序 1.3 第一个MFC应用程序 用VC+编写MFC应用程序,是一种“填空式”的编 程方法,一般有三个步骤:(1)创建工程:用V C+MFC Ap p Wi z a r d C+的MFC Ap p Wi z a r d 生成应用 程序的工程文件,即应用程序的基本框架。(2)可视化设计:用VC+自带的工具软件Wi n z a r d s,制作Wi n d o w s 风格的图形用户界面和各种控件。(3)编写代码:用MFC Cl a s s Wi z a r d 添加消息响应函数,然后VC+提供的文本编辑器和C+程序设计语言在函数
16、中编写代码。1.3.1 My He l l o 应用程序 应用程序 例程My He l l o.e x e 运行结果如下图所示。主窗口显示字符串:“He l l o,我们开始Vi s u a l C+编程了!”。My He l l o 程序由以下两步完成:(1)用VC+6.0的MFC App Wi z a r d,创建应用程序的基本窗口框架。(2)编写显示字符串:“He l l o,我们开始Vi s u a l C+编程了!”的代码。1.3.2 创建工程 (1)启动 启动VC+,从“Fi l e”菜单中选择“Ne w”;菜单中选择“,菜单中选择;(2)在Ne w 对话框中选择“Pr o j e
17、 c t”标签,选择“MFC Ap p Wi z a r d(e x e)”类 对话框中选择“对话框中选择 标签 选择“类 告诉VC+即将创建一个 即将创建一个EXE程序。程序。型,告诉 即将创建一个 程序(3)在“Pr o j e c t n a m e”文 本 编 辑 框 中 输 入“My He l l o ,单 击 位 于 My He l l o”,框右边的小按钮,“Lo c a t i o n”框右边的小按钮,再从下拉的对话框中选择“D:MYVC”框右边的小按钮 再从下拉的对话框中选择“目录,使新创建的工程文件放置在“目录之下。目录,使新创建的工程文件放置在“D:MYVC”目录之下。目
18、录之下 程序的工程类型、(分别指定了My He l l o.e x e 程序的工程类型、工程名字和工程位置)分别指定了 程序的工程类型 工程名字和工程位置)(4)单击“OK”按钮。此时Vi s u a l C+将显示MFC Ap p Wi z a r d-St e p 1对话框。(5)在MFC Ap p Wi z a r d-St e p 1对话框中:Si n g l e Do c u m e n t 选项表示单文档界面,简称SDI,这种类型应用程的主 窗口只能容纳一个文档,如Wi n d o w s 自带的记事本。Mu l t i p l e d o c u m e n t s 选项表示多文
19、档界面,简称MDI,这种类型应用程容 许同时打开多个文档,这些文档可以层叠于主窗口。Mi c r o s o f t Of f i c e 产品 就属于MDI应用程。Di a l o g b a s e d 选项表示生成基于对话框的应用程序。在本例中选择“Si n g l e Do c u m e n t”,创建一个基于单文档界面的应用程序。然后选择资源语言。(6)单击“Fi n i s h”按钮,结束MFC Ap p Wi z a r d 的设计工作,此时Vc+将 显示Ne w Pr o j e c t In f o r m a t i o n 窗口,显示前六步所做的选择的汇总信息。(7)单
20、击“OK”。VC+就创建了My He l l o 工程以及相关的所有文件。1.3.3 编写程序代码 用VC+编写MFC应用程序,是一种“填空式”的编程方法,因为在利 用MFC Ap pWi z a r d 生成框架程序,使得程序员免去了大量模式化工作,我们 只要根据目标程序的要求,看哪些地方需要修改,再往里填写代码。在 Wo r k s p a s e 窗 口 的 Fi l e Vi e w 标 签(工 程 资 源 管 理 器)中 选 择 My He l l o Vi e w.c p p 文件双击打开,然后找到函数On Dr a w(CDC*p DC),在其中 添加显示字符串:He l l o
21、,我们开始Vi s u a l C+编程了!代码。v o i d CMy He l l o Vi e w:On Dr a w(CDC*p DC)CMy He l l o Do c*p Do c =Ge t Do c u m e n t();ASSERT_VALID(p Do c);/TODO:a d d d r a w c o d e f o r n a t i v e d a t a h e r e p DC-Te x t Ou t(100,80,He l l o,我们开始Vi s u a l p DC-Te x t Ou t(100,80,He l lp a g e 3o,我们开始Vi s
22、 u a l 100 C+编程了!);C+编程了!);编程了 编译运行My He l l o My He l l o 应用程序 1.3.4 编译运行My He l l o 应用程序 编译、连接运行的操作步骤如下:(1)如下图所示,选择“Bu i l d”菜单中的“Bu i l d My He l l o.e x e”菜单项,VC+就会编译并连接成My He l l o.e x e 程序。(2)选择“Bu i l d”菜单中的“Ex e c u t e My He l l o.e x e”菜单项,VC+就会执 y He l l o.e x e y He ll o.e x e 行My He l l
23、 o.e x e 程序,My He l l o.e x e 程序主窗口也随之出现。返 回 1.4 应用程序分析 Ap p Wi z a r d 来帮助生成程序时 MFC类做了很多工作 来帮助生成程序时,类做了很多工作,用MFC Ap p Wi z a r d 来帮助生成程序时,MFC类做了很多工作,使 用户很容易地就能够编写一个程序。用户很容易地就能够编写一个程序。打开Wo r k s p a c e 窗口中的 Cl a s s Vi e w(类视图 标签,打开 Wo r k s p a c e 窗口中的 Cl a s s Vi e w(类视图)标签,我们看到 Wo r k s p a c e
24、 窗口中的Cl a s s Vi e w(类视图)MFC生成了 个类,如图1 13所示 生成了5 所示。MFC生成了5个类,如图1-13所示。CAb o u t Dl g CMai n Fr a m e CMy He l l o Ap p CMy He l l o Do c CMy He l l o Vi e w 对应每一个类MFC Wi z ar d 为我们生成了两个文件 分别以.为我们生成了两个文件,对应每一个类 MFC Wi za r d 为我们生成了两个文件,分别以.h c p p 结尾 结尾,.h 文件中MFC Wi z a r d 定义了类和它的各种变量 定义了类和它的各种变量、和
25、.c p p 结尾,在.h 文件中MFC Wi z a r d 定义了类和它的各种变量、函数,c p p 文件中来生成类对象 实现这个类。文件中来生成类对象,函数,在.c p p 文件中来生成类对象,实现这个类。返 回 应用类CMy He l l o Ap p 1.4.1 应用类CMy He l l o Ap p 应用类CMy He l l o Ap p 派生于MFC中的CWi n Ap p 类?其作用是初始化应用程序及运行该应用程序所需要 的成员函数,而CWi n Ap p 类派生于CWi n Th r e a d 类,代表 了程序中运行的主线程,它就是运行程序的本身,所 以每一个基于MFC
26、创建的应用程序只能包含该类唯一的 派生类对象。My He l l o.h 是 应 用 程 序 的 主 头 文 件,它 声 明 了 CMy He l l oAp p 类,其中:?虚函数In i t In s t a n c e()的作用是:设置注册数据 库,载入标准设置(最近打开文件列表等)、注册文 档模板并隐含地创建了主窗口、处理命令行参数和显 示窗口,然后返回、进入消息循环。CMy He l l o Ap p 类的完整代码如下:c l a s s CMy He l l o Ap p :p u b l i c CWi n Ap p p u b l i c:CMy He l l o Ap p()
27、;/Ov e r r id e s /Cl a s s Wi z a r d g e n e r a t e d v i r t u a l f u n c t i o n o v e r r i d e s /AFX_VIRTUAL(CMy He l l o Ap p)p u b l i c:v i r t u a l BOOL In i t In s t a n c e();/AFX_VIRTUAL/Im p l e m en t a t i o n /AFX_MSG(CMy He l l o Ap p)a f x _m s g v o i d On Ap p Ab o u t();/NO
28、TE-t h e Cl a s s Wi z a r d w i l l a d d a n d r e m o v e m e m b e r f u n c t i o n s h e r e./DO NOT EDIT w h a t y o u s e e i n t h e s e b l o c k s o f g e n e r a t e d c o d e !/AFX_MSG DECLARE_MESSAGE_MAP();返 回 主框架窗口类CMa i n Fr a m e 1.4.2 主框架窗口类CMa i n Fr a m e 窗口类CMa i n Fr a m e 派生于C
29、Fr a m e Wn d?主要用来管理应用程序的窗口,显示标题栏、工具栏、状态栏 等。同时还要处理针对窗口操作的消息。在窗口类CMa i n Fr a m e中有:?两个主要函数Pr e Cr e a t e Wi n d o w 和On Cr e a t e?两个对象m _w n d St a t u s Ba r(属于状态栏类CSt a t u s Ba r,用于创 建管理状态栏)和m _w n d To o l Ba r(属于工具栏类CToo l Ba r,用 于创建管理工具栏)。类CMa i n Fr a m e 在Ma i n Fr m.h 中定义,完整的代码如下:c l a s
30、s CMa i n Fr a m e :p u b l i c CFr a m e Wn d p r o t e c t e d:/c r e a t e f r o m s e r i al i z a t i o n o n l y CMa i n Fr a m e();DECLARE_DYNCREATE(CMa i n Fr a m e)/AFX_VIRTUAL(CMa i n Fr a m e)v i r t u a l BOOL Pr e Cr e a t e Wi n d o w(CREATESTRUCT&c s);/AFX_VIRTUAL p r o t e c t e d:/c
31、 o n t r o l b a r e m b e d d e d m e m b e r s CSt a t u s Ba r m _w n d St ap a g e 4t u s Ba r;CTo o l Ba r m _w n d To o l Ba r;p r o t e c t e d:/AFX_MSG(CMa i n Fr a m e)a f x _m s g i n t On Cr e a t e(LPCREATESTRUCT l p Cr e a t e St r u c t);/NOTE-t h e Cl a s s Wi z a r d w i l l a d d a
32、n d r e m o v e m e m b e r f u n c t i o n s h e r e./DO NOT EDIT w h a t y o u s e e i n t h e se b l o c k s o f g e n e r a t e d c o d e!/AFX_MSG DECLARE_MESSAGE_MAP();返 回 文档类CMy He l l o Do c 1.4.3 文档类CMy He l l o Do c 文档类CMy He l l o Do c 派生于CDo c u m e n t 类。?主要用来存放应用程序的数据,以及文件的保存加载功能,文 档类要通
33、过与视图类来实现与用户的交互。在文档类CMy He l l o Do c 中:?声明的On Ne w Do c u m e n t 函数用于初始化文档,Se r i a l i z e 函数串 行化(保存和装入)文档,Du m p 函数用于调试诊断。文档类类CMy He l l o Do c 的详细代码如下:c l a s s CMy He l l o Do c :p u b l i c CDo c u m e n t p r o t e c t e d:/c r e a t e f r o m s e r ia l i z a t i o n o n l y CMy He l l o Do
34、c();DECLARE_DYNCREATE(CMy He l l o Do c)/Cl a s sWi z a r d g e n e r a t e d v i r t u a l f u n c t i o n o v e r r i d e s /AFX_VIRTUAL(CMy He l l o Do c)pu b l i c:v i r t u a l BOOL On Ne w Do c u m e n t();v i r t u a l v o i d Se r i a l i z e(CAr c h i v e&a r);/AFX_VIRTUAL/Im p l e m e n t
35、a t i o n p u b l i c:v i r t u a l CMy He l l o Do c();#i f d e f _DEBUG v i r t u a l v o i d As s e r t Va l i d()c o n s t;v i r t u a l v o i d Du m p(CDu m p Co n t e x t&dc)c o n s t;#e n d i f DECLARE_MESSAGE_MAP();返 回 视图类CMy He l l o Vi e w 1.4.4 视图类CMy He l l o Vi e w 视图类CMy He l l o Vi e
36、w 派生于CVi e w 类?视图类用于管理视图窗口,它对应的对象在框架窗口中实现 用户数据的显示和打印。在视图类CMy He l l o Vi e w 中有:?与 文 档 数 据 相 关 的 三 个 函 数 On Pr e p a r e Pr i n t i n g、On Be g i n Pr i n t t i n g 和On En dPr i n t i n g,用以实现数据打印;声明了 返回CMYh e l l o Do c 指针的函数Ge t Do c u m e n t 用以获取文档的指针,以实现对用户文档的数据的操作;声明了函数On Dr a w,用以实 现视图数据的显示和刷
37、新。视图类CMy He l l o Vi e w 的详细代码如下:c l a s s CMy He l l o Vi e w :p u b l i c CVi e w p r o t e c t e d:/c r e a t e f r o m s e r i a l iz a t i o n o n l y CMy He l l o Vi e w();DECLARE_DYNCREATE(CMy He l l o Vi e w)p u b l i c:CMy He ll o Do c*Ge t Do c u m e n t();/Op e r a t i o n s p u b l i c:/
38、AFX_VIRTUAL(CMy He l l o Vi e w)p u b l i c:v i r t u a l v o i d On Dr a w(CDC*p DC);/o v e r r i d d e n t o d r a w t h i s v i e w v i rt u a l BOOL Pr e Cr e a t e Wi n d o w(CREATESTRUCT&c s);p r o t e c t e d:v i r t u a l BOOL On Pr ep a r e Pr i n t i n g(CPr i n t In f o*p In f o);v i r t
39、u a l v o i d On Be g i n Pr i n t i n g(CDC*p DC,CPr i n t In f o*p In f o);v i r t u a l v o i d On En d Pr i n t i n g(CDC*p DC,CPr i n t In f o*p In f o);/AFX_VIRTUAL DECLARE_MESSAGE_MAP();返 回 习 题 1Wi n d o w s 程序设计的特点是什么?Wi n d o w s 程序设计的特点是什么?程序设计的特点是什么 2Wi n d o w s 应用程序的优点是什么?Wi n d o w s 应用程序的优点是什么?应用程序的优点是什么 Ap p Wi z a r d(应用向导 应用向导)3.MFC Ap p Wi z a r d(应用向导)可以创建哪几类应用 程序?各有何特点?程序?各有何特点?请用MFC Ap p Wi z a r d 创建一个基于对话框的应用 4.请用 MFC Ap p Wi z a r d 创建一个基于对话框的应用 程序,列出所创建的类,并与My He l l o 工程比较,My He l l o 工程比较 程序,列出所创建的类,并与 My He l l o 工程比较,观 察他们的异同。察他们的异同。p a g e 5
限制150内