您的位置:寻梦网首页编程乐园C/C++编程Visual C++教程
一、走进Visual C++ 二、MFC程序结构分析 三、深入MFC类库 四、VC程序调试 五、Visual C++与多媒体
Visual C++教程 一 走进Visual C++
  • 1 理解VC工程
  • 2 MFC编程特点
  • 3 使用Wizard
  • 一 走进Visual C++

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

    1 理解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资源文件的目的就是为了对程序中用到的大量的资源进行统一的管理。

    2 MFC编程特点

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

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

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

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

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

    3使用Wizard

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

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

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

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

    图 1.1

     

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

    图1.2

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

    图1.3

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

    图1.4

     

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

    图 1.5

     

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

     

    图1.6

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

    图1.7

     

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

    图1.8

     

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

     

    图1.9

     

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

    图1.10

     

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

    1 窗口消息:WM_CREATE, WM_DESTROY, WM_CLOSE

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

    2 键盘消息:WM_CHAR, WM_KEYDOWN, WM_KEYUP

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

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

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

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

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

    5 焦点消息WM_SETFOCUS, WM_KILLFOCUS

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

    6 定时器消息:WM_TIMER

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

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

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

    单击ADD FUNCTION按钮,

    图1.11

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

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

    单击后选中NEW菜单,

    图1.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。

     

     

     

     

    图1.15

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

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

    图1.16

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