C++_MFC基础教程.ppt_第1页
C++_MFC基础教程.ppt_第2页
C++_MFC基础教程.ppt_第3页
C++_MFC基础教程.ppt_第4页
C++_MFC基础教程.ppt_第5页
已阅读5页,还剩437页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ppt简介 共14章 442页 涵盖了vc的基础介绍 以及mfc程序的创建 控件的使用 多线程 多媒体编程 网络编程 动态链接库的使用等等 是那些喜欢MFC但是不知道从何学起的MFC爱好者的最佳的基础教材 第1章VisualC 集成开发环境第2章MFC与应用程序框架第3章C 语言基础第4章C 的面向对象65 第5章菜单栏 工具栏和状态栏第六章对话框108页始第七章控件134页始第八章MFC常用类171页始第九章多媒体类第10章DLL的开发与调用237第11章文档和视图271第12章数据库编程296第13章多线程编程340第14章WinSock网络通信开发395 第1章VisualC 集成开发环境 VisualC 是一个功能强大的可视化应用程序开发工具 其凭借强大功能 受大了广大程序员的欢迎 当今流行的VisualC 的开发工具是6 0版本 下面来介绍VisualC 6 0的一些基本情况 1 1VisualC 6 0概述 VisualC 是一种C C 语言的集成开发环境 IDE 当最初还处于DOS时代的Borland公司推出了TurboPascal和TurboC 让程序员感受到了把编译器和编辑器集成在一起使用时的方便 Microsoft公司也看到了这一点 于是 两个公司开始合作 推出了QuickC和MicrosoftC C 等多个DOS版本的C C 集成开发环境 随着Windows的不断成熟 于是Microsoft开始开发Windows下的VisualC 经过多次版本的修订与更新 现在大多数程序员使用的是VisualC 6 0版本 VisualC 是一个可视化的C 的集成开发环境 在使用VisualC 时 开发人员可以通过鼠标拖动方便地设计程序的界面 相应的代码系统会自动生成 MFC MicrosoftFundermentalClasses 是微软提供的VisualC 可以调用的类库 其中封装了开发人员常用的类 使用MFC可以大大提高编程人员的工作效率 1 2VisualC 6 0界面介绍 安装好VisualC 开发环境后 桌面上并没有其快捷图标 需读者自己修改 选择 开始 菜单 从所有程序中 找到MicrosoftVisualStudio6 0级联菜单下的MicrosoftVisualC 菜单项 选择该菜单项 并将其拖动到桌面上 则在桌面上创建了MicrosoftVisualStudio的快捷图标 双击快捷图标 即可启动VisualC 6 0集成开发环境 每次运行VisualC 6 0时 会弹出一个 Tipoftheday 对话框 如下图所示 1 2VisualC 6 0界面介绍 技巧 Tipoftheday 对话框中介绍了很多关于开发环境的使用方法以及编程方面的小技巧 如果想在下次启动VisualC 6 0时不再显示该提示对话框 可以选择下一次启动时不再显示它 1 2VisualC 6 0界面介绍 为了便于说明 首先创建一个IDE的MFC项目 具体创建步骤 后面会详细介绍 如下图所示 1 2VisualC 6 0界面介绍 从上图中可以看出 VisualC 的界面被分成了7部分 上面依次标题栏 菜单栏和工具栏 中间左侧部分是工作区窗口 右侧部分是编辑区 最下方是输出窗口和状态栏 1 2 1工作区窗口和输出窗口 工作区窗口和输出窗口是在一个程序编译时使用最多的停靠式窗口 工作区窗口中显示了当前程序中的所有类 资源和文件信息 工作区窗口分为3个部分 ClassView 类视图 ResourceView 资源视图 和FileView 文件视图 ClassView 显示当前工作区中所有工程定义的C 类 双击某个类名 VisualC 会自动打开这个类的文件 并将编辑区定位到该类的定义处 双击类中的成员函数和变量 编辑区则定位到该成员函数或变量的定义处 1 2 1工作区窗口和输出窗口 ResourceView 显示当前工作区中所有的资源 这些资源包括快捷键 对话框 图标 菜单 字符条编辑器 工具栏和版本信息 双击其中的ID号 会显示相应的资源信息 FileView 显示属于当前工程的所有文件 包括C C 源文件 头文件 资源文件等 输出窗口与工作区一样 分为多个选择卡 其中最常用的选项卡被放在了最外面 分别为Build Debug FindinFiles1和FindinFiles2 1 2 1工作区窗口和输出窗口 Build Build显示工程在创建中 经过的每一个步骤及相应信息 如果出现编译链接错误 那么出现错误的文件 原因 行号等内容会显示在Build中 双击该错误信息行 编辑区则定位在该错误出现的行 Debug 工程通过编译后 运行调试版本时 Debug选项卡中会显示具体的调试信息 1 2 1工作区窗口和输出窗口 FindinFiles1和FindinFiles2 两个选项卡的作用相同 用于显示从多个文件中查找字符串的结果 当用户想要查看某个函数或变量出现在哪些文件中 单击 Edit FindinFiles 命令 弹出 FindinFiles 对话框 如下图所示 在 FindinFiles 对话框中的 Findwhat 后的编辑框中 输入想要查找的内容 单击 Find 按钮即可 查找到的内容会输出到FindinFiles选项卡中 1 2 2菜单栏和工具栏 菜单栏位于集成开发环境的顶部 菜单栏由9个菜单项组成 File 文件 Edit 编辑 View 视图 Insert 插入 Project 工程 Build 编译 Tools 工具 Windows 窗口 Help 帮助 每一个菜单项都有一个下拉式菜单 其中的菜单项用于完成特定的功能 工具栏位于菜单栏的下面 工具栏可以称作是美化的菜单栏 其由许多按钮构成 其中的按钮用于完成特定的功能 工具栏可以任意拖动 也可以成为一个浮动窗口 1 2 3编辑区 在VisualC 中 编写应用程序代码的位置就是编辑区 该编辑区的功能十分强大 智能化程度也非常高 在编辑区内 除了能编写C C 语言外 还能编写SQL HTML和VBScript等其他编程语言 如下图所示 1 2 4联机帮助 VisualC 6 0不像其他集成开发环境一样把帮助系统集成在开发环境内部 而是提供了一个专门为VisualC 设计的MSDN类库 MSDN虽然是一个独立的帮助系统 但却能很好地和VisualC 6 0集成在一起 MSDN的使用方式有以下几种 单击 Help Contents 命令 单击 Help Search 命令 单击 Help Index 命令 按下 F2 键 通过上述几种命令方式 即可运行MSDN 1 2 4VisualC 中的文件扩展名 打开程序HelloWorld所在的文件夹 看到该文件夹自动生成了许多扩展名不同的文件 如下图所示 1 2 6VisualC 中的文件扩展名 了解这些不同的扩展名文件 对于理解VisualC 6 0如何组织和管理项目文件是很有必要的 有关这些文件扩展名及其说明 如下表所示 第2章MFC与应用程序框架 在VisualC 集成开发环境下 使用微软基础类库MFC 可以开发出功能强大的Windows应用程序 另外 通过MFCAppWizard自动生成的MFC应用程序框架 还可以很方便地开发自己想要实现的功能 本章将先介绍有关MFC的基础知识 然后对MFC应用程序框架作具体介绍 2 1微软基础类库MFC MFC是一种重要的编程方法 它是微软公司的特定的应用程序包装接口 本节将讲解MFC概述及其类库结构 2 1 1MFC概述 MFC的英文全称是MicrosoftFoundationClasses 即微软的基础类库 MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库 虽然开发人员要编写的程序在功能上各有不同 但是从结构上讲 都可以化分为对用户界面的设计 对文件的操作 对数据库的访问及对多媒体的使用等一些最主要的方面 这一点正是微软提出MFC类库最重要的原因 在MFC类库中 大约有200个类 在进行程序设计时 只需简单地调用已有的类及类中的方法即可 另外 还可以利用 继承 方法从已有类中派生出自己想要的类 这时 派生出来的类不但拥有父类中的方法和属性 还可以根据自己的需求 自定义一些特殊的属性和方法 使得派生类功能更加强大 MFC有较好的移植性 可应用于众多平台 2 1 2MFC类库结构 MFC中类可划分为基类 应用程序结构类 窗口类 OLE类 数据库类等10大类 而且在其中的一些大类的基础上又派生出许多子类 MFC的类库结构的层次图如下图所示 2 1 2MFC类库结构 从上图中可以看出 CObject是一个原始基类 绝大多数MFC类的最终基类都是CObject 原始基类下面 主要包括以下几种类 MFC应用程序结构类 窗口 对话框和控件类 输出 设备文本 和绘图类 简单数据类型类 数组 列表和映射类 文件和数据库类 Internet和网络类 OLE类以及高度和异常类 MFC的应用程序结构类分为CWinApp和CWinThread 使用MFC创建的每一个应用程序都包含一个由类CWinApp派生而来的应用程序对象 该对象是一个全局对象 应用程序对象主要用于处理应用程序的初始化 同时也处理应用程序事件的消息循环 CCmdTarget和CCmdUI为MFC中常用的有关发送命令的类 CDocument为MFC中常用的应用程序文档的基类 CDocTemplate为文档模版类 通常是应用程序的单文档或多文档的基类 CView类是常用的视图类 2 2MFC应用程序框架分析 在前面介绍过如何创建一个基于单文档的应用程序 对于如何选择性地创建基于多文档或是基于对话框的应用程序 将会在后续章节详细介绍 本节主要对MFC应用程序框进行简单的概括 使读者了解MFC应用程序框架的结构与工作机制 2 2 1入口函数 入口函数就是指一个程序的入口点 WinMain函数是Windows程序的入口函数 为了便于讲解 首先要创建一个MFC应用程序 程序名命名为sample0201 具体创建步骤不再详细介绍 从创建好的sample0201程序中 并不能找到WinMain函数 这是因为典型Windows程序的大部分初始化工作都是标准化的 因此把WinMain函数隐藏在应用程序的框架中 当一个程序编译时 会自动将该函数链接到程序中 在计算机中找到VisualC 的安装目录 笔者安装在F盘 则按照下面这个路径依次打开文件夹 F ProgramFiles MicrosoftVisualStudio VC98 MFC SRC 打开后 会发现一个源文件 WinMain cpp 该文件中则定义了MFC应用程序的入口函数AfxWinMain 文件的源代码如下 2 2 1入口函数 2 2 1入口函数 当一个应用程序启动时 会自动调用应用程序框架内部的AfxWinMain函数 根据其前缀Afx就知道WinMain是一个全局的MFC函数 从上述代码中可以看出 WinMain函数会查找该应用程序的一个全局构造对象 该对象是由CWinApp的派生类创建 因此有程序启动时 它就被创建好了 然后WinMain对该应用程序进行初始化 在此过程调用的是该程序全局构造对象的InitApplication 和InitInstance 函数 完成初始化后 WinMain调用Run 函数 运行应用程序的消息循环 最后结束应用程序时 WinMain调用AfxWinTerm 函数 做一些清理工作 2 2 2InitInstance 函数 InitInstance 函数的作用是初始化程序 每次启动一个应用程序时 Winmain函数会自动调用InitInstance 函数 打开创建的程序sample0201 在该程序的CSample0201App类中 可以看到该程序对InitInstance 函数进行了重载 该重载代码如下 2 2 2InitInstance 函数 从上述代码中可以看出 在ShowWindow和UpdateWindos之前 程序要做两个动作 一个是注册窗口类 另一个是构建窗口类 InitInstance 函数规定了生成的应用程序是基于单文档的 基于多文档的或是基于对话框的 因此在CWinApp中必须重载InitInstance 函数 2 2 3应用类Run 函数 与查找WinMain函数类似 在VisualC 的安装目录下 按照下面这个路径依次打开文件夹 F ProgramFiles MicrosoftVisualStudio VC98 MFC SRC 打开后 会发现一个源文件 THRDCORE CPP 该文件中定义了应用类Run 函数 源代码如下 2 2 3应用类Run 函数 从上述代码中可以看出 如果消息队列没有消息 则调用OnIdle 函数 并递增iIdleCount计数标志 该计数标志表示在两次消息处理过程只共调用了多少次OnIdle 函数 bIdle是消息队列空闲的标志 当消息队列有消息时 则调用PumpMessage 函数 进行消息翻译和消息派发 其中PreTranslateMessage m msgCur 对消息进行翻译 DispatchMessage m msgCur 把消息m madCur发送到应用程序主框架窗口 注意 在应用程序sample0201的CSample0201App的Run函数继承了CWinApp的虚函数Run 而CWinApp的Run 函数调用了CWinThread的Run 函数 2 2 4消息映射表 当MFC应用程序类中的Run 函数把消息交给主窗口的窗口函数后 窗口函数将如何处理这些消息 在Win32程序中 处理窗口消息的窗口函数WinProc 函数通过switch case结构对消息进行判断并分别进行处理 但在MFC应用程序的主窗口类对消息的处理并没有沿袭Win32程序的做法 MFC应用程序中进行消息处理 是为每一个要处理的消息添加一个消息处理函数 这种定义消息和消息处理函数的对照表 称为消息映射表 MFC的消息映射表采用映射宏的方式 将消息和消息处理函数一一对应起来 以应用程序的主框架为例 在类的声明文件MainFrame h中添加声明消息映射的宏 2 2 4消息映射表 在类的实现文件MainFrame cpp中 添加消息映射宏的定义语句 其中 ID MY MESSAGE为自定义的菜单项命令ID号 OnMymessage 为响应菜单命令的成员函数 2 2 5MFC消息分类 MFC应用程序对消息的描述一般分为3类 窗口消息 命令消息和控件消息 1 窗口消息 窗口消息一般与创建窗口 绘制窗口 移动窗口和销毁窗口等操作有关 另外 当使用鼠标 键盘等与操作窗口有关的动作时 也会产生窗口消息 窗口消息的一般的表示形式是以 WM 开头的消息 常见的窗口消息如下所述 WM CHAR 使用键盘时产生的消息 其对应的消息处理函数为OnChar UINTnChar UINTnRepCnt UINTnFlags WM CREATE 创建窗口时产生的消息 用于窗口的初始化 其对应的消息处理函数为OnCreate LPCREATESTRUCTlpCreateStruct WM PAINT 通知窗口对自身进行绘制 一般在移动窗口 改变窗口大小 绘制图形时使用 其对应的消息处理函数为OnPaint 1 窗口消息 WM LBUTTONDOWM 使用鼠标左键时产生的消息 通知窗口单击了左键 其对应的消息处理函数为OnLButtonDown UINTnFlags CPointpoint WM MOUSEMOVE 移动鼠标时产生的消息 其对应的消息处理函数为OnMouseMove UINTnFlags CPointpoint WM CLOSE 关闭窗口时产生的消息 其对应的消息处理函数为OnClose WM DESTROY 销毁窗口时产生的消息 其对应的消息处理函数为OnDestroy 2 命令消息 命令消息一般与处理用户的某个请求或执行用户的某个命令有关 一般通过选择菜单项 单击工具栏按钮和按加速键产生命令消息 在MFC应用程序中 凡是从基类CCmdTarget派生出来的子类 都能处理命令消息 另外 文档类 视图类和应用程序类都能处理命令消息 创建命令消息时 可以使用MFCClassWizard建立消息映射和消息处理函数之间的关系 例如 应用程序类发出文件打开命令 假设打开文件对应的菜单资源ID为ID FILE IPEN 则其命令消息如下 3 控件消息 普通的控件都是子窗口 因为其都继承自CWnd 它们通过向其父窗口 一般为对话框 发关消息 响应用户的动作 如移动鼠标 单击等 控件消息一般是由按钮 BN 编辑框 EN 下拉列表框 LBN 和组合框 CBN 等控件产生的 其消息映射宏是在消息名前加上ON 例如 第3章C 语言基础 要使用VisualC 进行Windows应用程序的开发 就要掌握面向对象的思想和C 语言 本章先讲述一个简单的C 程序 然后根据这个程序 向读者介绍C 中语言基础 3 2C 的基本数据类型及数据 数据类型是对数据的一种抽象描述 在计算机程序中能操作的数据有很多种 不同的数据所需要的存储空间有所不同 将数据按照类型进行分类 有助于程序员对于存储空间的分配 本节将具体介绍有关C 中的数据及其所属的数据类型 3 2 2变量 变量是一种特殊的标识符 在变量中可以存储数据 变量中存储的数据可以根据程序的需要而改变 因此称为变量 1 定义变量在C 中 使用一个变量必须先定义该变量 C 中定义变量的语法代码如下 定义一个变量需要说明两点 一是变量的类型 二是变量的名称 其中 变量的类型是C 中的数据类型 变量名是用户为变量起的名称 3 2 2变量 C 的变量名由字符及数字等组成 变量名必须满足以下几个条件 变量名只能由字母 数字和下划线 组成 变量名必须以字母或下划线开头 变量名不能包含空白字符 换行符 空格和制表符称为空白字符 变量名不能与保留字名相同 变量名区分大小写 3 2 2变量 2 变量赋值如果想要使用一个变量 就要为其进行赋值 如果没有对定义的变量赋值 VisualC 会为该变量默认一个值 例如 如果是一个int类型的变量且没有赋值 VisualC 将默认其值为0 C 中为变量赋值的方法有两种 一种是在定义变量的同时赋值 另一种是在定义变量后赋值 在定义变量的同时赋值 代码如下 在定义变量后赋值 代码如下 3 2 3 常量 常量与变量相反 是一个不随时间和程序变化而变化的值 C 中 常量的命名规则和变量的大体相同 不同的是 常量名称中的字母都为大写 C 中定义符号常量的语法代码如下 例如 在计算圆形面积的时候 经常用到PI 为了避免重复地输入PI的实际取值 而用下面的形式声明PI的取值 这样 在程序中编译时 会将程序中出现的所有字符串PI全部置换成3 14 如果想要修改程序中PI的值 只需在头文件处修改 全部PI的取值都会发生变化 3 2 3 常量 C 中定义静态常量的语法代码如下 在C 中 同声符号常量一样 在声明静态常量时 也要对其进行初始化 代码如下 注意 在符号常量中 PI没有类型 不占有存储单元 且容易出错 而在Const常量中 PI有数据类型 并且占有存储单元 有地址 因此可以使用指针指向它 3 3C 的运算符及表达式 运算符和表达式是一种程序语言的基础 运算符的作用是操作变量或表达式 C 中的运算符包括赋值运算符 算术运算符 逻辑运算符 关系运算符 位运算符 逗号运算符 条件运算符等 本节将介绍这些运算符及其所组成的表达式 3 3 1表达式 表达式是C 程序中不可缺少的一部分 表达式是由运算符 操作数 变量 常量或函数等 和标点符号 按照一定规则组成的一个有意义的语句 例如 3 3 2运算符 C 中的运算符就是一种符号 该符号可以用于处理数据 平时有数学计算中所使用的 都属于运算符 只是这些运算符在C 中的表现形式可能与日常生活中有所不同 下面将对C 中的运算符作具体介绍 1 赋值运算符赋值运算符是用于为变量或常量指定数值的运算体符 其操作符号为 示例代码如下 上述表达式的意义是 把b的值赋值给a 其中 b可以是一个单纯的变量 也可以是一个表达式 3 3 2运算符 2 算术运算符算术运算符是用于进行数学运算的运算符 例如 加 减 乘 除等就是算术运算符 操作完成后 返回一个数字型的值 算术运算符包括加法运算符 减法运算符 乘法运算符 除法运算符 模运算符 上述算术运算符都是二元运算符 该运算符两端的数据必须是数字 3 3 2运算符 3 逻辑运算符逻辑运算符 即用于处理逻辑值的运算符 逻辑运算符通常用在条件判断语句或循环语句中 如if while语句等 C 中的逻辑运算符包括逻辑与运算符 逻辑或运算符 逻辑非运算符 由逻辑运算符构成的表达式 称为逻辑表达式 逻辑表达式的返回值为逻辑值 true或false 一般情况下 1代表true 0代表false 逻辑与运算符可以进行与操作 其操作方法为 如果逻辑与运算符前的数为false 或是可以得出false的逻辑表达式 则返回false 否则返回true 当逻辑与运算符前后两个数都为true时 才返回true 逻辑或运算符可以进行或操作 其操作方法为 只要逻辑或运算符前后的数据中有一个为true 或是可以得出true的逻辑表达式 则返回true 当逻辑或运算符前后两个数都为false时 才返回false 逻辑非运算符要求要操作的数据必须是逻辑值 或是能够转换成逻辑值的逻辑表达式 逻辑非运算符可以进行非操作 其操作方法为 如果要操作的数据为true 则返回false 如果要操作的数据为false 则返回true 3 3 2运算符 4 关系运算符关系运算符 即用于比较两个数据关系大小的运算符 并根据比较的结果返回一个逻辑值 关系运算符包括大于运算符 大于等于运算符 小于运算符 小于等于运算符 等于运算符 以及不等于运算符 5 条件运算符条件运算符 即用于条件判断的运算符 其构成的表达式格式为 其中 如果表达式1的值为非0 则执行表达式2 如果表达式1的值为0 则执行表达式3 3 3 2运算符 6 特殊运算符C 中还提供了一些特殊的运算符 如 等 3 4C 的语句控制 C 中的控制语句主要用于完成分支结构程序和循环结构程序的控制 其主要包括以下9个控制语句 if else语句 switch语句 for语句 while语句 do while语句 continue语句 break语句 goto语句和return语句 但在介绍这些控制语句之前 首先介绍一下输入输出语句 3 4 1C 的输入输出 C 中除了可以使用C语言中的scanf和printf函数进行输入输出外 还提供了标准的输入输出流 例如 从键盘输入时需要用到输入流 在显示器上面显示信息需要输出流 其中 cin代表输入流 cout代表输出流 它们是在头文件iostream中定义的 因此 在使用输入输出流的时候 需要引入iostream头文件 3 4 1C 的输入输出 1 输入语句C 的输入语句用cin表示 其中 cin必须和 一起使用 使用cin的语法代码如下 例如 想要从键盘输入一些数据 将使用下述代码 如果想要一次性输入多个数据 不是使用逗号作为分隔符 而应该用 分隔 应该写成 3 4 1C 的输入输出 2 输出语句C 的输出语句用cout表示 其中 cout必须和 一起使用 使用cout的语法代码如下 例如 想要从键盘输出一些数据 将使用下述代码 如果想要一次性的输出多个数据 同样不是使用逗号作为分隔符 而是每项数据之间用 分隔 如上述代码所示 注意 在C 中 可以不用 n 控件换行 可以使用 endl 进行换行 因为在头文件iostream中定义endl endofline 代表回车换行 其作用与 n 相同 3 4 2选择语句 选择语句也称分支语句 即根据不同的条件执行不同的语句 在C 中 主要的选择语句有if语句和switch语句 1 if语句if语句有三种基本结构 1 第一种基本结构的语法如下 执行该if语句时 首先判断表达式是否正确 如果正确 则执行语句1 如果不正确 则不执行任何操作 执行if语句后的其他语句 该语句流程如右图所示 3 4 2选择语句 2 第二种基本结构的语法如下 执行该if语句时 首先判断表达式结果是否为真 如果判断结果为真 则执行语句1 如果判断结果为假 则执行语句2 该语句流程如右图所示 3 4 2选择语句 3 第三种基本结构的语法如下 执行该if语句时 首先对表达式1进行判断 如果判断结果为真 则执行语句1 如果判断结果为假 则对表达式2进行判断 如果表达式2的判断结果为真 则执行语句2 否则 执行语句3 该语句的流程图如右图所示 3 4 2选择语句 2 switch语句C 中的另外一种选择语句是switch语句 其语法如下 该语句的流程图如右图所示 3 4 3循环语句 在编写程序的过程中 经常会遇到一些许多有规律性的重复操作 则在程序中需要重复执行这些语句 为此 C 中提供了循环语句 可使代码大大简化 循环语句包括循环条件和循环体两部 C 中的循环语句包括for语句 while语句和do while语句 1 for语句for语句是使用最频繁并且最灵活的循环语句 其语法代码如下 其中 表达式1通常用于为循环变量赋初值 表达式2为循环条件 表达式3用于循环变量的递增或是递减 使得循环趋于结束 3 4 3循环语句 for语句的执行过程如下 1 初始化表达式 2 执行循环表达式 如果不满足条件 则跳出循环语句 3 如果满足条件 则执行语句块 循环体 4 循环变量递增或递减 5 返回步骤 2 6 循环结束 执行for语句下的语句 for语句的流程图如右图所示 3 4 3循环语句 2 while语句while语句用于 当满足某一条件时进入循环 的情况 其语法代码如下 while语句的执行过程如下 1 判断循环条件 2 表达式如果为真 则进入循环体 否则 进入步骤 4 3 执行循环体表达式 4 循环结束 执行while语句下的语句 while语句的流程图如右图所示 3 4 3循环语句 3 do while语句do while语句和while语句类似 其语句代码如下 do while语句的执行过程如下 1 执行循环体语句块 2 判断循环条件 如果满足条件 返回步骤 1 否则 执行步骤 3 3 退出do while语句 do while语句的流程图如右图所示 3 4 3循环语句 从上述代码中可以看出 while语句和do while语句的区别 1 从结构上看 while语句的循环条件在前 循环体语句块在后 而do while语句的循环体语句块在前 循环条件在后 2 while语句的循环条件后没有分号 而do while语句的循环条件后有分号 且不能省略 3 从执行流程上看 while语句如是不满足循环条件 会直接跳过该循环 而do while语句是无条件地执行一次循环体语句块 3 4 4其他语句 在循环语句中 经常用到一些语句 如break continue和goto语句等 下面对这些语句做简单介绍 1 continue语句continue语句是跳过循环体中剩余的语句而强制执行下一次循环 其作用为结束本次循环 即跳过循环体中下面尚未执行的语句 接着进行下一次是否执行循环的判定 continue语句只能用于循环语句中 通常与if语句配合使用 2 break语句当程序运行到break语句时 立即结束break语句所在的整个循环 转向循环语句下面的语句继续执行 3 goto语句goto语句为无条件转向语句 通常与条件语句配合使用 但其易使程序流程混乱 一般不建议使用 所以在此不过多介绍 第4章C 的面向对象 面向对象技术是当今软件开发的主流 很多开发人员都转向使用面向对象的语言进行编程 而C 也是面向对象程序设计语言的一种 本章将依次讲解C 中的类与对象 内容包括类与对象 类的继承与派生 类的多态性等 通过本章学习 读者能够熟练掌握面向对象的思想 并能将这种思想融入到代码中 4 1类与对象 客观世界中 任何一个事物都可以看成是一个对象 Object 在C 中 对象的类型被称为类 class 本节将具体介绍类与对象的相关概念与使用 4 1 1面向对象思想 面向对象的思想和面向过程的思想是相对的 面向过程的程序 详细地描述了每一时刻的数据结构及对其的操作过程 而面向对象的程序 将一个个小的操作封装成对象 在以后的编写中 只需调用对象即可 面向对象的程序有三大特性 封装性 继承性与多态性 4 1 1面向对象思想 1 封装性所谓的封装性 有着两方面的含义 一是将基本数据和对此数据进行操作的过程和函数结合起来 形成一个对象 各个对象之间相互独立 互不干扰 二是对象将对外界公开的是一个界面 将具体的细节隐藏起来 保证了数据的安全性 2 继承性继承性是面向对象程序设计中最重要的机制 通过继承机制 可以方便地利用一个已有的类 父类 建立一个新的类 子类 新类不但可以继承已有类的属性和方法 还可以拥有自己特有的方法 3 多态性所谓多态性是当不同的对象收到相同的消息时产生不同的动作 多态性是面向对象程序设计的一个重要特征 其增加了程序的灵活性 4 1 2类的声明 类是具有相同属性和相同方法的对象的集合 类由类头 classhead 和类体 classbody 组成 类头由关键字class和类名组成 类体是指花括号 中的内容 类体由数据成员和成员函数组成 需要注意提 类的声明以分号结束 声明类的一般形式为 4 1 2类的声明 其中 关键字private public和protected称为成员访问限定符 用这些访问限定符来声明各成员的访问属性 private 只能在本类中访问 在类外不能访问 public 既能在本类中访问 又能在类外通过该类的对象进行访问 protected 与private类似 不能被类外访问 但能被派生类的成员函数访问 说明 如果在类的声明中没有使用关键字 则系统将数据成员和函数默认为是私有的 4 1 3成员函数的定义 在C 中 定义成员函数可以在类中定义 也可以在类外定义 如例4 1所示 display 是在类中进行声明并且定义 而GetName 和GetAge 只是在类中有声明 并没有进行定义 这种函数的定义代码如下 则在Student类中 函数GetName 和GetAge 的定义如下 4 1 4类与对象的关系 在现实生活中 每一个实体事物都可以作为一个对象 例如 一部手机 一支铅笔 一本书等 但是有些对象是有着相似性的 在C 中 将这些有着相似的对象归为一类 class 类是对象的抽象 而对象是类的实例 在编写程序时 应该先声明一个类 再去实例化若干个同类型的对象 在一个类中 类的属性指的是类的数据成员 类的行为指的是类的方法 4 1 5对象的声明和实例化 类是一个抽象的概念 因此在程序中不能直接引用 而是将其实例化成为对象后 通过这个对象来对类进行相关的操作 对象的声明有3种方法 1 先声明类类型 后定义对象 这种声明的语法代码如下 用这种方式为Student类声明对象 如果想要一次性为某个类声明多个对象 可以用逗号作为分隔符 2 在声明类的同时声明对象 这种声明的语法代码如下 用这种方式为Student类声明对象 如果想要一次性为某个类声明多个对象 可以用逗号作为分隔符 3 不出现类名 直接声明对象 这种声明的语法代码如下 如果想要一次性为某个类声明多个对象 可以用逗号作为分隔符 用这种方式为类声明对象 在声明对象之后 可以调用类中的方法 例如 stu1为Student类的一个对象 使用该对象对Student类中的数据成员和函数进行调用 代码如下 4 1 6构造函数和析构函数 下面介绍C 中两个特殊的函数 构造函数和析构函数 1 构造函数当声明一个类的属性时 可以不对其进行初始化 因为在C 中有专门的初始化函数对该属性进行初始化 这个专门用来处理对象的初始化的函数就是构造函数 构造函数是一种特殊的函数 其作用是在完成对象的初始化的同时 将对象的属性初始化 构造函数不需要用户自己来调用它 在创建对象时 由系统自动调用 定义构造函数的语法代码如下 4 1 6构造函数和析构函数 构造函数的特点如下所述 构造函数名与类名相同 构造函数不能指定返回值类型 构造函数可以有参数 也可以没有参数 构造函数不能被程序显示调用 只能由系统自动调用 每个类都必须有一个构造函数 如果在声明一个类时没有给出构造函数的定义 则系统会为该类自动添加一个默认的构造函数 该构造函数的参数列表为空 函数体也为空 类中各属性的值被指定为所属类型的默认值 构造函数可以重载 有关重载的概念 会在4 2节进行介绍 也就是说 一个类可以有多个参数不同的构造函数 注意 当用户为声明的类添加一个自定义的构造函数时 系统则不再为程序添加默认的构造函数 4 1 6构造函数和析构函数 2 析构函数当一个对象的生命周期结束时 应当去释放该对象所占用的内存空间 这时 系统会自动调用析构函数来进行一些清理工作 定义析构函数的语法代码如下 析构函数的特点如下所述 析构函数不允许有返回值 析构函数不允许有参数 一个类中有且只有一个析构函数 因此 析构函数不能重载 对于一个对象来说 析构函数是最后一个被调用的函数 4 2C 类的继承和派生 类的继承是指新的类从已有类中获得已有的特性 例如 数据成员 成员函数等 而从已有类产生新类的过程就称为派生 其中 已有类称为基类或父类 新的类称为派生类或子类 本节将具体绍有关继承与派生的有关知识 4 2 1派生类的声明 派生类可以将基类中的已有的特性继承下来 也可以添加一些自己特有的新特性 声明派生类的语法代码如下 从上述代码中可以看出 派生类Student不仅从基类Student中继承了Student类已有的数据成员和成员函数 还新添加了一些自己的数据成员和成员函数 另外 本例中采用的是公有继承 4 2 2派生类的继承方式 一个类中 其成员的访问权限有public private和protected之分 而类的继承方式也有三种 公有继承 私有继承和受保护继承 1 公有继承 在声明一个派生类时 将继承方式设为public 则该种继承方式称为公有继承 使用公有继承方式派生出来的类称为公有派生类 其基类称为公有基类 采用公有方式继承时 基类的公有成员和受保护的成员在派生类中是可以引用的 而其私有成员则不能在派生类中引用 有关公有继承中成员的访问权限如下表所示 2 私有继承 在声明一个派生类时 将继承方式设为private 则该种继承方式称为私有继承 使用私有继承方式派生出来的类称为私有派生类 其基类称为私有基类 采用私有方式继承时 基类的公有成员和受保护的成员在派生类中相当于是私有成员 而其私有成员不能在派生类中引用 有关私有继承中成员的访问权限如下表所示 3 受保护继承 在声明一个派生类时 将继承方式设为protected 则该种继承方式称为受保护继承 使用受保护继承方式派生出来的类称为受保护派生类 其基类称为受保护基类 采用受保护方式继承时 基类的公有成员和受保护成员在派生类中相当于是受保护成员 而其私有成员不能在派生类中引用 有关受保护继承中成员的访问权限如下表所示 4 2 2单一继承和多重继承 在C 中 继承分为两种 单一继承和多重继承 1 单一继承一个基类只能由一个派生类来继承 这种继承方式称为单一继承 单一继承关系所形成的是一种树形结构 如下图所示 4 2 2单一继承和多重继承 2 多重继承一个派生类不仅只能拥有一个基类 还可以拥有多个基类 这种继承方式称为多重继承 基于多重继承方式的派生类 同时拥有了多个基类的特性 多重继承的关系如下图所示 如果已经声明了类A 类B和类C 而类D想要同时成为A B C三个类的派生类 即类D是多重继承的派生类 代码如下 4 3C 的多态性 在面向对象的程序中 多态性是一个非常重要的概念 同一操作作用于不同的对象 可以有不同的解释 产生不同的执行结果 这就是多态性 4 3 1多态的分类 C 中的多态性是指同一个函数名称对应着功能类似的多个函数 这些函数执行不同但是功能类似的操作 从而实现了 一个接口 多种方法 C 中的多态性分为两种 静态多态性和动态多态性 静态多态性是指在编译程序时 系统就能确定所调用的是哪一个函数 因此 静态多态性又称编译时多态性 静态多态性是通过函数重载和运算符重载实现的 动态多态性是指在程序运行的过程中才能动态地确定调用哪一个函数 因此 动态多态性又称运行时多态性 动态多态性是通过继承和虚函数实现的 4 3 2运算符重载 所谓重载 就是对一个事物赋予新的含义 而运算符重载 就是对已有的运算符进行重新定义 赋予其另外一种功能 以适应不同的数据类型 运算符重载的语法代码如下 在C 中 有关重载运算符的规则如下 只能对C 中已有的运算符进行重载 并不是C 中的所有运算符都能进行重载 运算符 等不能重载 重载运算符不能改变操作数的个数 重载运算符不能改变运算符的优先级 重载运算符不能改变运算符的结合性 重载运算符不能使用默认参数 4 3 3虚函数 虚函数是指在派生类中定义与基类同名的函数 但基类中的该函数前有virtual修饰 声明虚函数的语法代码如下 在C 中 当一个成员函数被声明为虚函数后 其派生类中的同名函数将自动成为虚函数 因此 在派生类中重新声明该虚函数时 virtual可以不加 但为了使程序看起来清晰 一般在派生类中也加上virtual 4 3 4纯虚函数 在某些特殊情况下 需要使用纯虚函数 例如 有一个动物类 其中有一个名为睡觉的函数 而各种动物的睡觉方式是不同的 此时 可以将动物类中的睡觉函数声明为纯虚函数 而该动物类则成为了抽象类 声明纯虚函数的语法代码如下 纯虚函数没有函数体 语法代码后面的 0 不是代表该函数的返回值为0 此种表达方式仅仅是通知系统 这是一个纯虚函数 有些类不用来定义对象 而只是作为一个基类去派生新的类 这种类称为抽象类 在抽象类中 可以使用纯虚函数 第5章菜单栏 工具栏和状态栏 菜单栏 工具栏和状态栏是窗口界面的重要组成部分 三者是用户与应用程序交互的桥梁 合理地使用这三者 可以让用户更好地使用软件 提高用户体验度 本章将依次讲解在VisualC 中如何构建菜单栏 工具栏和状态栏 内容包括菜单的分类 使用下拉式菜单 使用弹出式菜单 编辑工具栏按钮 修改默认的工具栏等 通过本章的学习 读者会熟练地使用菜单栏 工具栏以及状态栏 并且可以根据自己的想法 设计出一个漂亮的窗口 5 1菜单的分类 菜单栏一般位于应用程序窗口的顶部 如下图所示 菜单是用于显示一组选项 即菜单项 的下拉窗口 用户可以从这些菜单项中进行选择 在Windows窗口中 菜单分为两种 下拉式菜单和弹出式菜单 又称为上下文菜单 5 1菜单的分类 1 下拉式菜单一般情况下 在应用程序窗口顶部的菜单栏中 选择菜单中的某个选项 就会显示一个下拉式菜单 在上图所示的窗口中 当用户选择菜单栏中的某一选项 如文件 时 就会显示一个下拉菜单 下图中的左图所示的菜单即为一个下拉式菜单 2 弹出式菜单一般情况下 右击应用程序窗口中的空白处 就会显示一个弹出式菜单 该菜单处于自由浮动状态 下图中的右图所示的菜单即为一个弹出式菜单 5 2使用下拉式菜单 在VisualC 中 当创建的基于单文档或多文档的程序时 提供了一个默认的菜单栏 它包括文件 编辑 查看 窗口和帮助等菜单项 但是当创建一个基于对话框的工程时 VisualC 将不会为其提供菜单栏 本节将使用菜单编辑器定义一个自己的菜单栏 并将其添加到基于对话框的工程中 5 2 3移动和删除菜单项 如果在添加了某个菜单项后 有时觉得某些位置可能不合适 如果想要移动的是菜单栏上的菜单项 则可以直接选择想要移动的菜单项 将其进行左右拖动 放到预期的位置即可 如下图中的左图所示 如果想要移动的是下拉式菜单里的菜单项 则可以直接选择要移动的菜单项 将其进行上下拖动 放到预期的位置即可 如下图中的右图所示 如果想要删除某个菜单项 只需选择要删除的菜单项 按下 Delete 键即可 5 2 4启用和禁用菜单项 如果一个新的菜单没有添加命令处理函数 应用程序会自动将其禁用 要启用这个菜单项 使用ClassWizard为其添加一个命令处理函数即可 但是如果想要根据应用程序 有选择的启用和禁用某个菜单项 可以用ClassWizard添加一个界面消息处理函数 5 2 5标记菜单项 如果想要给一个菜单项添加选中标记 同样可以使用ClassWizard添加的界面消息处理函数 在处理函数中添加如下代码 如果m nCheck为TRUE 则菜单项前有一个选中标记 如果m nCheck为FALSE 则菜单项前没有选中标记 5 2 6添加快捷键 在使用菜单命令时 不仅可以使用鼠标进行选择 也可以使用快捷键 例如 经常使用的复制操作可以使用 Ctrl C 组合键 剪切操作可以使用 Ctrl X 组合键 粘贴操作可以使用 Ctrl V 组合键等 5 3使用弹出式菜单 一般在右击窗口时 会出现弹出式菜单 下拉式菜单可以在图形化的界面下进行加载 而弹出式菜单需要用户手工编写代码动态地加载 如果想在程序中动态地创建弹出式菜单 就必须用到MFC中的菜单类CMenu CreatePopupMenu 创建一个空白的弹出式菜单 AppendMenu 将新的菜单项添加到指定菜单项的末尾 TrackPopupMenu UINTnFlags intx inty CWnd pWnd LPCRECTlpRect 0 在指定的位置弹出一个菜单 其中 参数nFlags用于指定一个屏幕位置和一个鼠标按钮标志 参数x y用于指定弹出式菜单坐标的水平位置和菜单顶部在屏幕坐标中的垂直位置 参数pWnd用于标识拥有此弹出式菜单的窗口 参数LpRectet用于指向一个RECT结构或CRect对象 如果其值为NULL 则代表当用户在此弹出式菜单外单击时 该弹出式菜单将会消失 5 4工具栏的使用 工具栏是一个显示位图式按钮行的控制条 按工具栏上的按钮 相当于选择菜单栏上的菜单项 可以执行相应的命令操作 工具栏一般位于窗口客户区菜单栏的下面 其也可以作为一个浮动的小窗口 任由鼠标拖动 5 4 2移动和删除工具栏按钮 如果想要移动某个工具栏按钮 可以将其选中 然后进行左右拖动 将其放到预期的位置上即可 如果想要删除某个工具栏按钮 不能直接按下 Delete 键 这样做只能删除该按钮上的位图 要想真正地删除工具栏上的按钮 将其选中并拖到工具栏之外 释放鼠标即可 5 4 3添加按钮消息响应函数 在为按钮添加完位图之后 运行程序时 工具栏上新添加的按钮处于灰色状态 即不可用状态 要想使用该按钮 就要为其添加消息响应函数 5 5状态栏的使用 状态栏位于应用程序窗口的底部 可以随时为用户提供当前应用程序的状态信息 其既不接收输入消息 也不产生命令消息 5 5 1状态栏概述 当使用MFCAppWizard创建一个基于单文档的程序时 在应用向导的 MFCAppWizard step4 选对话框中 默认选择了 Initialstatusbar 选项 如图5 25所示 那么 在生成的应用程序中 就自动添加了一个工具栏 图示可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论