二 MFC 程序结构分析 14

  1. WINDOWS 程序工作原理 14

  2. 建立应用程序 14

  3. 程序结构剖析 15

    1. 类CMYAPP 16

    2. 类CMAINFRAME 16

    3. 类CMyView 与CMyDoc 16

三 深入MFC 类库 20

  1. 处理用户输入 20

    1. 定义对话框资源 21

    2. 定义对话框类 22

  2. 有关屏幕输出 27

    1. 设备上下文工作原理 27

    2. 实例绘图原理剖析 28

    3. 绘图操作实现 28

    4. 有关屏幕映射方式 29

  3. 文件处理 31

    1. 对象持续化简述 31

    2. 实例分析 33

    3. 与文件处理关系密切的类CFile 37

  4. DAO 技术 39

    1. DAO 与ODBC 39

    2. 使用MFC 实现DAO 技术 39

5 打印 42

  1. 打印和显示 42

  2. 打印分页 42

  3. 打印工作的开始和结束 43

  4. 打印程序实例 43

四、VC 程序调试 47

  1. 调试环境的建立 47

  2. 调试的一般过程 48

  3. 如何设置断点 48

  4. 控制程序的运行 54

  5. 查看工具的使用 56

  1. 高级调试技术 62

    1. TRACE 宏的利用 62

    2. ASSERT 宏的利用 62

    3. [ASSERT_VALID 宏的利用以及类的AssertValid()成员函的重载

      63](#assert_valid-宏的利用以及类的-assertvalid成员函的重载)

    4. 对象的DUMP 函数的利用 63

  2. 内存漏洞的检查 63

五VISUAL C++与多媒体 65

  1. 对声音的处理 65

    1. 媒体控制接口 65

    2. 波形混音器 73

  2. 多媒体文件I/O 75

  3. 多媒体图形图像技术 80

  4. 图像合成 89

  5. FLC 动画 91

6 热点 111

  • 走进Visual C++

Visual C++作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。Microsoft 的基本类库 MFC 使得开发Windows 应用程序比以往任何时候都要容易。本光盘教学软件的目的就是为了让你学会在 Visual C++环境下,利用微软的基本类库 MFC 开发出功能强大的 Windows 应用程序。在本章节的内容当中,我们将向您介绍使用 VC 开发软件需要用到的一些基本概念,使用 MFC 进行编程的基本特点,以及 VISUAL C++集成开发环境提供的一系列编程辅助工具—— WIZARD 的使用方法。

理解VC 工程

Visual C++作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用 Visual C++开发应用程序的过程中,系统为我们生成了大量的各种类型的文件,在本节中将要详细介绍 Visual C++中这些不同类型的文件分别起到什么样的作用,在此基础上对 Visual C++如何管理应用程序所用到的各种文件有一个全面的认识。

首先要介绍的是扩展名为 dsw 的文件类型,这种类型的文件在 VC 中是级别最高的,称为 Workspace 文件。在 VC 中,应用程序是以 Project 的形式存在的,Project 文件以.dsp 扩展名,在 Workspace 文件中可以包含多个 Project,由Workspace 文件对它们进行统一的协调和管理。

与 dsw 类型的 Workspace 文件相配合的一个重要的文件类型是以 opt 为扩展名的文 件,这个文件中包含的是在 Workspace 文件中要用到的本地计算机的有关配置信息,所以这个文件不能在不同的计算机上共享,当我们打开一个 Workspace 文件时,如果系统找不到需要的 opt 类型文件,就会自动地创建一个与之配合的包含本地计算机信息的 opt 文 件。

上面提到 Project 文件的扩展名是 dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息,每个工程都对应有一个 dsp 类型的文件。

以 clw 为扩展名的文件是用来存放应用程序中用到的类和资源的信息的,这些信息是VC 中的 ClassWizard 工具管理和使用类的信息来源。

对应每个应用程序有一个 readme.txt 文件,这个文件中列出了应用程序中用到的所有的文件的信息,打开并查看其中的内容就可以对应用程序的文件结构有一个基本的认识。

在应用程序中大量应用的是以 h 和 cpp 为扩展名的文件,以 h 为扩展名的文件称为头文件。以 cpp 为扩展名的文件称为实现文件,一般说来 h 为扩展名的文件与 cpp 为扩展名的文件是一一对应配合使用的,在 h 为扩展名的文件中包含的主要是类的定义,而在 cpp 为扩展名的文件中包含的主要是类成员函数的实现代码。

在应用程序中经常要使用一些位图、菜单之类的资源,VC 中以 rc 为扩展名的文件称为资源文件,其中包含了应用程序中用到的所有的 windows 资源,要指出的一点是 rc 文件可以直接在 VC 集成环境中以可视化的方法进行编辑和修改。

最后要介绍的是以 rc2 为扩展名的文件,它也是资源文件,但这个文件中的资源不能在 VC 的集成环境下直接进行编辑和修改,而是由我们自己根据需要手工地编辑这个文件。

对于以 ico,bmp 等为扩展名的文件是具体的资源,产生这种资源的途径很多。使用 rc 资源文件的目的就是为了对程序中用到的大量的资源进行统一的管理。

MFC 编程特点

如果你曾经使用过传统的 windows 编程方法开发应用程序,你会深刻地体会到,即使是开发一个简单的 windows 应用程序也需要对 windows 的编程原理有很深刻的认识,同时也要手工编写很多的代码。因为程序的出错率几乎是随着代码长度的增加呈几何级数增长的,这就使得调试程序变得非常困难。所以传统的 windows 编程是需要极大的耐心和丰富的编程经验的。

近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序中的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能 飞,自行车能滚动等。一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。

MFC 的英文全称是 Microsoft Fundation Classes,即微软的基本类库,MFC 的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化归为用户界面的设计,对文件的操 作,多媒体的使用,数据库的访问等等一些最主要的方面。这一点正是微软提供 MFC 类库最重要的原因,在这个类库中包含了一百多个程序开发过程中最常用到的对象。在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。当然,你也可以在程序中创建全新的对象,并根据需要不断完善对象的功能。

正是由于 MFC 编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。

最后要指出的是 MFC 类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用 MFC 类库不会影响程序的可靠性和正确性。

使用Wizard

Visual C++是一种功能强大的通用程序设计语言,它提供了各种向导和工具帮助我们来实现所需的功能,在一定程度上实现了软件的自动生成和可视化编程。下面就为你介绍VC 集成环境中几个最主要的开发工具的使用方法。

首先要介绍的是 Appwizard 工具,这个工具的作用是帮助我们一步步地生成一个新的应用程序,并且自动生成应用程序所需的基本代码。下面我们就介绍使用 Appwizard 生成一个应用程序的具体步骤。

  • 单击 File 菜单 New 菜单项,系统弹出的对话让我们选择所要创建的文件类型,这里的文件分成了 Files,Project,Workspaces,Other documents 四种大类型,每一个类型下面又包含许多具体的文件类型,选中 Projects 标签,标签下的工作区中列出的是各种不同的应用程序类型,比如 dll 类型的动态链接库,exe 类型的可执行程序等,这里选中MFC Appwizard(exe)选项,表示要创建的是一个使用 MFC 基本类

库进行编程的可执行程序。如下图 1.1 所示:

走进Visual C++ - 图1

图 1.1

  • 选好后在 project name 一栏中为程序起一个名字为 test,在location 一栏中为程序定义文件存放的目录,对话框右下角的 platforms 一栏中的 Win32 项表示要创建的程序是建立在 32 位的 windows 平台基础上。单击OK按钮,就启动了使用MFC方式开发应用程序的 Appwizard 功能。

走进Visual C++ - 图2

图 1.2

  • Wizard 让我们选择程序的类型和程序中的资源所用的语种,这里不妨选择程序类型为单文档界面,语种为英语,然后单击NEXT按钮。

走进Visual C++ - 图3

图 1.3

  • Wizard 让我们选择是否需要提供数据库方面的支持,这里选择 NONE,然后单击 NEXT 按钮。

走进Visual C++ - 图4

图 1.4

  • 下面选择程序中对复合文档的支持,这里选择 NONE。

走进Visual C++ - 图5

图 1.5

  • 接着选择程序的其它一些特性,如提供对 WINSOCK 的支持等。这里对系统的缺省值不作改变,如下图 1.6 所示。单击 NEXT 按钮。

走进Visual C++ - 图6图 1.6

  • 在第五步中,对话框上部选择是否为程序自动生成注释,对话框的下部用来选择使用MFC 类库的方式是动态链接库方式还是静态链接方式,使用动态链接库方式时在以后生成的可执行应用程序中并不真正包含 MFC 类库中的对象,而使用静态链接方式时, 则把 MFC 库中的代码生成为应用程序的一部分,这时生成的应用程序也就相对大一些。选好后单击 NEXT 按钮。

图 1.7

  • 进入 APPWIZARD 的最后一个步骤,对话框中的提示信息指明了系统将要自动创建的对象和相关文件,以及派生出这些对象的 MFC 的基类等内容。在这一步当中,我们还可以对视图类的基类进行选择,单击 FINISH 按钮。

走进Visual C++ - 图7

图 1.8

  • 游览一下对话框中对将要生成的程序的有关信息的描述后单击 OK 按钮。系统就自动为我们生成一个使用 MFC 基本类库的应用程序的基本框架,在以后将会对这个框架的内容作详细的介绍。

走进Visual C++ - 图8

图 1.9

接下来介绍 VC 集成环境中提供的一个很重要的工具 CLASSWIZARD,它主要是用来管理程序中的对象和消息的,这个工具对于 MFC 编程显得尤为重要。 单击 VIEW 菜单的CLASSWIZARD 项,就可以运行 MFC CLASSWIZARD,在这个对话框中就可以对程序中的对象和消息进行管理了。

走进Visual C++ - 图9

####### 图 1.10

在对话框中的 MESSAGE MAPS 标签下,PROJECT 栏中的内容代表当前程序的名字。CLASSWNAME 下拉列表框列出的就是程序当前用到的所有类的名字,在 MESSAGE 一栏中列出的就是一个选中的类所能接收到的所有的消息,在 WINDOWS 程序设计中,消息是个极为重要的概念,用户通过窗口界面的各种操作最后都转化为发送到程序中的对象的各种消息, 下面就向您介绍在 WINDOWS 程序设计中最常用的一些消息:

######## 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE

我们创建一个窗口对象的时候,这个窗口对象在创建过程中收到的就是 WM_CREATE 消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作,如设置窗口的大

小,背景颜色等,WM_DESTROY 消息指示窗口即将要被撤消,在这个消息处理过程中,我们就可以做窗口撤消前的一些工作。WM_CLOSE wm_close 消息发生在窗口将要被关闭之前, 在收到这个消息后,一般性的操作是回收所有分配给这个窗口的各种资源。在 windows 系统中资源是很有限的,所以回收资源的工作还是非常重要的。

######## 键盘消息:WM_CHAR,WM_KEYDOWN,WM_KEYUP

这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生WM_KEYDOWN 消息,释放按键的时候又回产生 WM_KEYUP 消息,所以WM_KEYDOWN 与WM_KEYUP 消息一般总是成对出现的,至于 WM_CHAR 消息是在用户的键盘输入能产生有效的 ASCII 码时才会发生。这里特别提醒要注意前两个消息与 WM_CHAR 消息在使用上是有区别的。在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符, 如方向键,功能键等。而伴随 WM_CHAR 消息的参数是所按的键的 ASCII 码,ASCII 码是可以区分字母的大小写的。而虚拟键码是不能区分大小写的。

######## 鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBCLICK, WM_RBUTTONDOWN, WM_RBUTTONUP,WM_RBUTTONDBCLICK

这组消息是与鼠标输入相关的,WM_MOUSEMOVE 消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左右键的按下、释放、双击事件,要指出的是 WINDOWS 系统并不是在鼠标每移动一个像素时都产生 MOUSEMOVE 消息,这一点要特别注意。

######## 另一组窗口消息:WM_MOVE , WM_SIZE , WM_PAINT

当窗口移动的时候产生 WM_MOVE 消息,窗口的大小改变的时候产生 WM_SIZE 消息, 而当窗口工作区中的内容需要重画的时候就会产生 WM_PAINT 消息。

######## 焦点消息 WM_SETFOCUS,WM_KILLFOCUS

当一个窗口从非活动状态变为具有输入焦点的活动状态的时候,它就会收到WM_SETFOCUS 消息,而当窗口失去输入焦点的时候它就会收到 WM_KILLFOCUS 消息。

######## 定时器消息:WM_TIMER

当我们为一个窗口设置了定时器资源之后,系统就会按规定的时间间隔向窗口发送WM_TIMER 消息,在这个消息中就可以处理一些需要定期处理的事情。

最后要指出的一点是,在 WINDOWS 环境下,消息的来源是多方面的,最常见的是用户的操作产生消息,系统在必要的时候也会向程序发送系统消息,其他在运行中的程序也可以向程序发送消息。此外,在程序的内部,也可以根据需要在适当的时候主动产生消息, 比如主动产生 WM_PAINT 消息以实现需要的重画功能。

上面介绍了 MESSAGE 栏中主要的消息,在 MEMBER FUNCTION 一栏中列出的是目前被选中的类已经有的成员函数。这些成员函数一般说来是与这个类可以接收的消息一一对应的。也就是说,一个成员函数一般总是用来处理某个特定的消息。如果在 MESSAGE 栏中的某个消息在程序中需要处理,但目前还没有相应的类成员函数,比如这里选中 WM_TIMER 这个消息,它目前还没有相应的对应的类的成员函数,

单击 ADD FUNCTION 按钮,

走进Visual C++ - 图10

图 1.11

系统就自动为 WM_TIMER 消息在类中添加了对应的成员函数 ONTIMER,单击EDITCODE 按钮,可以发现系统已经自动生成了完成 ONTIMER 函数所需的基本代码,我们只要在这些基本代码的基础上再添加所需要的代码就可以了。

注意对话框中的 ADD CLASS 按钮,它用来往当前应用程序中添加一个新的类 。单击后选中 NEW 菜单,

走进Visual C++ - 图11

图 1.12

走进Visual C++ - 图12系统弹出了 NEW CLASS 对话框用于生成一个新的类。在这个对话框中需要为类起个名字,设置类文件的名字,另外还要在 BASE CLASS 一栏 的下拉列表框中选择某个已有的类作为基类,设好需要的信息后单击 OK 就生成了一个新的类。

图 1.13

CLASS WIZARD 还有一些很强大的功能,这里就不再详细介绍,你会在不断的学习中慢慢地了解和掌握。

最后介绍一下集成环境提供的一个重要工具 RESOUCR EDITOR,也就是资源编辑器。在VC 开发的应用程序中要用到大量的位图,菜单,工具条,对话框等各种资源。这些资源对于程序而言是相对独立的,所以可以对它们进行单独的编辑,然后使用在程序中。而RESOUCE EDITOR 正是为编辑资源提供了一种可视化的开发方法。极大地减轻了程序员的负担。

单击 FILE 菜单的 OPEN 菜单项,然后在对话框中选择打开 TEST.RC 文件,就可以开始使用资源编辑器了。在左边的工作区中按类型列出了程序中用到的所有的资源,双击其中的某个类型,比如双击 MENU 资源,MENU 目录的下面列出的就是系统已经有的MENU 类型的资源,选中其中一个并双击,在右边的工作区中列出了这个资源当前的样子,我们就可以在工作区中对资源进行可视化的编辑和修改了。

图 1.14

如何添加一个资源呢?单击 INSERT 菜单,选中 RESOURCE 菜单项,系统弹出 INSERT RESOURCE 对话框。如图 1.15。

走进Visual C++ - 图13

图 1.15

在图 1.15 这个对话框,在这个对话框中选中一种资源类型,比如选择 CURSOR 类型, 然后单击 NEW 按钮。在左边的工作区中就出现了我们新生成的资源的标识符,双击这个标识符,在右边的工作区中就可以对这个新的指针形状资源进行可视化编辑了。如图 1.16。

走进Visual C++ - 图14通过这部分内容的介绍,相信您已经对使用 VISUAL C++开发 MFC 应用程序的

图 1.16

基本步骤有了认识。在下一章的内容当中,我们将结合 WINDOWS 的工作原理,详细地向您解释 MFC 类库的基本结构,以及 MFC 应用程序的基本框架—— 文档/视图结构。