描述
开 本: 32开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302416258
本书图文并茂,语言精练,例题典型,实用性、趣味性强,可作为大学本科、高职高专相关课程的教材,也可供广大Visual C 爱好者自学。另外,本书有配套的例题源代码和电子课件,供广大读者免费下载。
目录
Visual C 程序设计
部分C 与面向对象
第1章C 基础
1.1从C到C
1.1.1面向过程的C语言
1.1.2面向对象的C 语言
1.1.3C 对C语言的改进
1.1.4Visual C 和Visual
Studio
1.2一个简单的Win32控制台应用程序
1.2.1创建简单的Win32控制台应用程序
1.2.2Win32控制台应用程序的入口函数
1.2.3预处理命令
1.2.4Win32控制台应用程序的命名空间
1.3C 对C语言的扩充
1.3.1注释语句
1.3.2C 的输入输出
1.3.3变量的存储类型
1.3.4函数的默认参数
1.3.5函数重载
1.3.6内联函数
1.3.7引用和引用传递
1.3.8用const定义常变量
1.3.9字符串变量
1.3.10内存动态分配与撤销运算符new和delete
1.3.11命名空间
第2章面向对象的C
2.1面向对象概述
2.1.1面向对象的概念
2.1.2类的特性
2.2类与对象
2.2.1类的声明和对象的定义
2.2.2类的成员函数
2.2.3对象的使用以及对成员的访问
2.2.4构造函数与析构函数
2.2.5const对象和const成员函数
2.2.6对象的动态建立和释放
2.2.7this指针
2.2.8友元函数和友元类
2.2.9类的静态成员和静态成员函数
2.3继承与派生
2.3.1继承的概念及意义
2.3.2派生类的定义
2.3.3派生类成员的访问权限
2.3.4派生类的构造函数和析构函数
2.3.5多继承
2.4多态性
2.4.1多态性的概念
2.4.2运算符重载
2.4.3虚函数与纯虚函数
第二部分MFC应用程序
第3章MFC编程基础
3.1应用程序向导生成MFC应用程序
3.1.1Visual C 2010集成开发环境
3.1.2应用程序向导生成MFC应用程序
3.1.3项目的文件组织
3.1.4应用程序向导生成基于对话框的应用程序案例
3.2MFC类
3.2.1MFC类结构
3.2.2添加成员变量与成员函数
3.2.3MFC类向导
3.2.4类的添加与删除
3.2.5MFC类案例
3.2.6对话框的数据交换机制
3.3消息和消息映射
3.3.1消息及消息的分类
3.3.2MFC常用消息及其消息映射函数
3.3.3消息映射
3.3.4消息映射案例
第4章资源与对话框
4.1资源
4.1.1资源的分类
4.1.2创建资源
4.2创建对话框
4.2.1创建新的对话框模板
4.2.2设置对话框属性
4.2.3创建对话框类
4.2.4调用显示对话框
4.2.5对话框案例
4.3消息对话框
4.3.1MessageBox()函数
4.3.2AfxMessageBox()函数
4.3.3消息对话框案例
第5章控件
5.1控件的添加与布局设计
5.1.1工具箱
5.1.2添加和删除控件
5.1.3属性
5.1.4事件
5.1.5控件布局
5.2静态控件
5.2.1静态文本控件
5.2.2组框控件
5.2.3图片控件
5.3编辑框
5.3.1编辑框的常用属性和消息
5.3.2常用的成员函数
5.3.3编辑框和静态文本案例
5.4按钮控件
5.4.1常用属性和消息
5.4.2按钮类的主要成员函数
5.4.3按钮和组框控件案例
5.5列表框控件
5.5.1常用属性和消息
5.5.2列表框类的主要成员函数
5.6组合框控件
5.6.1常用属性和消息
5.6.2组合框类的主要成员函数
5.6.3列表框和组合框控件案例
5.7滚动条控件
5.7.1滚动条控件的种类
5.7.2滚动条类的主要成员函数
5.8进度条
5.8.1进度条的属性
5.8.2进度条类的主要成员函数
5.9滑动条
5.9.1滑动条控件的属性
5.9.2滑动条类的主要成员函数
5.9.3滑动条和进度条控件案例
第6章菜单、工具栏和状态栏
6.1菜单
6.1.1菜单设计
6.1.2给菜单项添加消息处理
6.1.3动态添加菜单
6.1.4菜单案例
6.1.5弹出式菜单
6.1.6弹出式菜单案例
6.2工具栏
6.2.1工具栏编辑器
6.2.2工具栏案例
6.3状态栏
6.3.1状态栏的定义
6.3.2状态栏的常用操作
6.3.3状态栏案例
第7章文档与视图
7.1文档应用程序中的字符串资源
7.2文档序列化
7.2.1序列化概述
7.2.2CArchive类和序列化操作
7.2.3文档序列化案例
7.3一般视图框架
7.3.1CEditView
7.3.2CFormView
7.3.3CScrollView
7.4列表视图框架
7.4.1列表视图的样式
7.4.2列表项的基本操作
7.4.3列表控件的消息
7.4.4列表视图控件案例
7.5文档视图结构
7.5.1文档与视图的相互作用
7.5.2应用程序对象指针的互调
7.5.3一档多视
7.5.4一档多视案例1——静态切分窗口
7.5.5一档多视案例2——动态切分窗口
第8章文本与图形
8.1图形绘制基础
8.1.1一个简单的图形绘制案例
8.1.2坐标与映射模式
8.1.3简单数据类CPoint、CSize和CRect
8.1.4MFC中的颜色
8.1.5MFC中颜色应用案例
8.1.6OnDraw函数
8.2设备环境类
8.2.1CDC类
8.2.2用CDC类的成员函数绘图
8.3图形设备接口
8.3.1GDI及其使用方法
8.3.2画笔
8.3.3画笔应用案例
8.3.4画刷
8.3.5画刷应用案例
8.4绘制文本
8.4.1CDC类的文本输出函数
8.4.2字体的基本类型、字体类与字体对话框
8.4.3字符的几何尺寸
8.4.4文本显示案例
第9章数据库编程
9.1MFC中的ODBC类
9.1.1CDatabase类
9.1.2CRecordset类
9.1.3CRecordView类
9.2创建ODBC数据库应用程序
9.2.1创建MFC ODBC应用程序一般过程
9.2.2构造数据库
9.2.3创建ODBC数据源
9.2.4数据库应用案例
9.2.5设计操作界面
9.2.6数据的查询、添加和删除
9.2.7排序与筛选
第三部分Windows Form应用程序
第10章Windows Form编程基础
10.1一个简单的Windows Form应用程序
10.1.1Hello应用程序
10.1.2新建Windows 窗体应用程序
10.1.3向窗体添加控件
10.1.4属性设置与界面布局
10.1.5编写代码
10.1.6次生成并执行窗体应用程序
10.1.7重新修改标签控件的属性
10.1.8终的Hello应用程序
10.2Windows Form 基础
10.2.1.NET与Windows Form概述
10.2.2托管
10.2.3.NET类库中的常用命名空间与常用类
10.2.4C /CLI的基本数据类型
10.2.5引用类型、跟踪句柄及托管对象的使用
10.2.6字符串
10.2.7数组
10.2.8自定义引用类型类
10.2.9事件及事件处理程序
10.2.10几个常用类和常用结构
10.3Windows Form编程常用操作
10.3.1Windows Form编程环境简介
10.3.2成员函数和成员变量的添加与删除
10.3.3事件处理程序的创建与删除
10.3.4如何获得帮助
第11章Windows Form控件与对话框
11.1控件
11.1.1标签与图片
11.1.2按钮
11.1.3文本框和富文本框
11.1.4标签、按钮及文本框控件应用案例
11.1.5单选按钮与复选框
11.1.6单选按钮、复选框及分组框应用案例
11.1.7进度条、滚动条、滑块
11.1.8滚动条、文本框、按钮及颜色应用案例
11.1.9与时间有关的控件
11.1.10进度条与计时器应用案例
11.1.11下拉列表框与列表框
11.1.12列表框、下拉列表框及日期时间选择控件应用案例
11.1.13常用控件综合应用案例
11.2常用对话框
11.2.1消息对话框
11.2.2文件的打开与关闭对话框
11.2.3文件打开与保存应用案例
11.2.4字体与颜色对话框
第12章Windows Form图形绘制初步
12.1图形设备接口GDI
12.1.1System::Drawing命名空间中的常用类和数据结构
12.1.2坐标与颜色
12.1.3图形绘制常用数据类型
12.2用Graphics和Pen绘制图形
12.2.1图形绘制步骤及创建方式
12.2.2用Pen类设置线条属性
12.2.3利用Graphics类绘制图形和文字
12.2.4简单图形绘制案例
12.3用Brush类填充颜色
12.3.1Brush类的派生类
12.3.2填充单一颜色
12.3.3用样式填充
12.3.4渐变式填充
12.4绘图应用程序综合案例
12.4.1时钟应用程序Clock
12.4.2绘制静态的时钟表盘
12.4.3绘制动态的时钟指针
12.4.4实现时钟所在窗体的透明、缩放及拖动功能
第四部分习题
第1章C 基础习题
第2章面向对象的C 习题
第3章MFC编程基础习题
第4章资源与对话框习题
第5章控件习题
第6章菜单、工具栏和状态栏习题
第7章文档与视图习题
第8章文本与图形习题
第9章数据库编程习题
第10章Windows Form编程基础习题
第11章Windows Form控件与对话框习题
第12章Windows Form图形绘制初步习题
第五部分实验
实验一基本输入输出、变量声明及函数的默认参数
实验二函数重载、引用传递与内存动态分配
实验三类与对象
实验四继承与派生
实验五虚函数与运算符重载
实验六MFC应用程序与对话框
实验七控件(一)
实验八控件(二)
实验九菜单与工具栏
实验十文档与视图
实验十一文本与图形
实验十二数据库编程
实验十三Windows Form编程基础
实验十四Windows Form控件与对话框(一)
实验十五Windows Form控件与对话框(二)
实验十六Windows Form 图形绘制
参考文献
前言
随着.NET技术的迅猛发展,图形用户界面应用程序被注入了新鲜血液——Windows Form应用程序,“Visual C 程序设计”作为讲述“用C 语言对图形用户界面应用程序进行设计”的课程,其内容对此也应有所体现。本教材顺应时代发展的需求,在精简传统“Visual C 程序设计”课程内容的基础上,加入了Windows Form应用程序设计的内容。本书理论知识分为C 与面向对象、MFC应用程序、Windows Form应用程序三大部分。部分分为两章,分别讲述C 语言基本语法和面向对象的C 语言。第1章C 基本语法部分主要讲述数据的输入输出、函数参数、函数重载、引用、内存动态分配等内容。第2章面向对象的C 部分,对类、对象、成员函数、类的继承与派生、重载与虚函数等面向对象概念的理解和使用进行了详细介绍。第二部分是MFC应用程序设计部分。微软基础类库(Microsoft Foundation Classes,MFC)是微软公司实现的一个C 类库,主要封装了大部分的Windows API函数。用这些C 类设计的应用程序就称为MFC应用程序。这部分内容分为7章来讲述。第3章MFC编程基础,主要介绍MFC编程所要用到的基础知识,包括编程环境的使用、编程的一般步骤、类库中常用类及其相互关系、这些类的使用方法、Windows消息映射机制、MFC应用程序文件的类型等内容。第4章资源与对话框,给出资源的概念并从资源的角度阐释对话框的本质及设计、使用方法。第5章控件和第6章菜单、工具栏和状态栏,分别讲述了窗体上各种界面元素的设计和使用方法。第7章文档与视图,讲述文档类和视图类的使用,并通过它们的交互,实现抽象数据到可视信息的转化,进而实现一档多视的能力。第8章文本与图形,从绘图的角度讲述文本与图形绘制应用程序的设计方法。第9章数据库编程,讲述了几个与数据库相关的类,并通过这些类实现了与数据库管理系统的数据交互。第三部分是Windows Form应用程序设计部分。Windows Form应用程序是在.NET Framework上建立的Windows窗体应用程序。.NET引入了许多新理念,如跨语言、跨平台,提出并实现了许多新技术,如托管等。为此,.NET设计了两个关键组件——CLR (Common Language Runtime,公共语言运行时)和BCL (Basic Class Library,基础类库),BCL中包括了大量用于应用程序开发的类。本书第10章 Windows Form 编程基础,简要介绍了设计Windows Form应用程序所要用到的基础知识,并用一个实例,详细演示了Windows Form应用程序的开发过程以及开发环境的使用方法。第11章 Windows Form控件与对话框,主要讲述各种常用控件,包括可视的按钮、标签、文本框控件和不可视的计时器控件等。相比较于MFC应用程序,Windows Form应用程序中控件的能力要强大很多。 第12章 Windows Form图形绘制初步,简要介绍在Windows Form应用程序中进行图形和文本绘制的方法,并以时钟应用程序为例,详细演示了Windows Form图形绘制应用程序设计制作的全过程。本书从实例出发,合理安排知识结构,由浅入深,循序渐进。在讲解每个知识点时都配有精心设计的案例,这些案例多具有一定的趣味性和实用性,图文并茂,条理清晰,通俗易懂。编程时,新添加的代码采用灰色背景,与原有代码区别明显,方便读者理解和上机检验。此外,本书还配有电子课件,以满足广大教师教学的需要。为加深对理论知识的理解和掌握,本书还安排了“第四部分 习题”和“第五部分 实验”。实验部分的实验内容经过精选,实验步骤详尽,思考题发人深省; 书中习题的答案、例题和实验源代码均可以到出版社指定的网站下载。本书由黄永才任主编,金韬、刘伟杰、李牧、刘立君任副主编。参加编写的人员有夏红刚、王晖、刘天惠、李华等,其中刘天惠还负责了全书的审阅工作。另外在编写过程中,徐刚、衣春林二人对本书中例题和实验内容的设计均提供了大量宝贵建议,在此一并表示感谢。由于时间仓促及作者水平有限,书中疏漏之处在所难免,欢迎广大读者批评指正。
编者2016年11月
Visual Studio是一套完整的开发工具,用于生成ASP.NET Web应用程序、XML Web Services、桌面应用程序和移动应用程序等。Visual Basic、Visual C#和Visual C 都使用相同的集成开发环境(Integrated Development Environment,IDE)。3.1应用程序向导生成MFC应用程序3.1.1Visual C 2010集成开发环境
Visual C 集成开发环境为项目管理与配置、源代码编辑、源代码浏览和调试工具提供强力支持。这样就能够进行工具共享,并能够轻松地创建混合语言解决方案。1. 集成开发环境简介Visual C 集成开发环境界面由菜单栏、工具栏、解决方案资源管理器、类视图、资源视图、输出窗口、属性面板、工具箱和编辑窗口等部分组成,如图3.1所示。
图3.1Visual C 集成开发环境
窗口上部是菜单栏和工具栏,菜单栏中包含多个菜单项,每一个菜单项都对应着不同的功能。工具栏以一组按钮的形式提供了操作菜单的快捷方式。
左侧面板可以放多个视图,常用的是解决方案资源管理器、类视图和资源视图。解决方案资源管理器提供整个解决方案的图形视图,开发应用程序时,该视图可帮助管理解决方案中的项目和文件。创建新项目时,Visual Studio会自动生成一个解决方案。然后,可以根据需要将其他项目添加到该解决方案中。Visual Studio还提供解决方案文件夹,用于将相关的项目组织成项目组,然后对这些项目组执行操作。解决方案资源管理器中可以看到所有头文件和源文件构成的树,头文件就是.h后缀的文件,源文件就是.cpp后缀的文件,类视图中显示了项目中的各个类,也是树状结构,在解决方案资源管理器或类视图中双击某一项,中间区域都会打开相应的文件。资源视图中显示了使用的资源。在左侧面板上双击某项时,中间区域会出现相应的窗口。中间面板是编辑窗口,编辑窗口是输入和修改应用程序的源代码及其他组件的地方。
右侧面板是工具箱和属性面板,工具箱里面包含各种控件,直接拖到窗口上就可以添加控件了。属性面板可以查看和更改编辑对象的属性、事件及文件、项目和解决方案的属性。
底侧面板是输出窗口,用来输出程序运行信息和程序中的一些调试信息,例如,编译程序的进展说明、警告及出错信息等。
窗口中显示哪些视图是可以设置的,可以通过【视图】菜单下的菜单项控制各种视图的打开或关闭。例如,【视图】→【解决方案资源管理器】可以打开或关闭解决方案资源管理器视图,【视图】→【类视图】用来控制类视图的显示,【视图】→【资源视图】用来控制资源视图的显示。
在工具栏中可以添加按钮。方法是在工具栏中单击鼠标右键或单击【视图】→【工具栏】菜单项,在弹出的菜单中选中要添加的按钮,例如【布局】。2. 集成开发环境中的窗口管理集成开发环境中包含两种基本的窗口类型: 工具窗口和文档窗口。工具窗口和文档窗口的行为方式稍有不同: 工具窗口在【视图】菜单上列出。例如,若要显示输出窗口,可单击【视图】→【输出】菜单。当打开或创建文件或其他项时,将动态创建文档窗口,打开的文档窗口的列表出现在【窗口】菜单中。当在IDE中处理多个打开的文档时,可以将多文档窗口组织为垂直或水平的选项卡组并可简单地在各选项卡组之间移动文档,选项卡式文档可在IDE中实现拖放。可以在IDE中将工具窗口配置成: 隐藏、自动隐藏、以选项卡式文档停靠、停靠或浮动。1) 停靠窗口单击要停靠的窗口,将窗口拖向IDE的中部,出现一个菱形引导标记,如图3.2所示。菱形的4个箭头指向编辑窗口的4个边。如果窗口是工具窗口,
图3.2菱形引导标记
则另外有4个箭头指向IDE的4个边。当拖动的窗口到达要停靠的位置时,将指针移动到菱形引导标记的相应部分上。指定的区域将显示为阴影,释放鼠标。例如,如果希望将解决方案资源管理器停靠在左侧,应将解决方案资源管理器拖向IDE的中部,将指针移动到菱形引导标记的左侧箭头上,然后松开鼠标。
使工具窗口或文档窗口返回到其近的停靠位置的方法是按住Ctrl键并双击窗口的标题栏。2) 使窗口浮动将窗口拖到所需的位置。3) 自动隐藏工具窗口自动隐藏功能能够小化当前未在使用的工具窗口。窗口自动隐藏时,它的名称和图标会显示在IDE边缘的选项卡上。打开自动隐藏功能的方法是单击要隐藏的窗口中的按钮,在弹出的菜单中单击【自动隐藏】命令。或者单击窗口标题栏上的图钉图标。当自动隐藏的窗口失去焦点时,它将自动滑回到IDE边缘的标签上。若要显示自动隐藏的窗口,将指针移动到该选项卡上。该窗口将滑回视图中以供使用。关闭自动隐藏功能的方法是单击窗口标题栏上的图钉图标。4) 隐藏窗口就是关闭窗口,使其不在IDE中显示。3.1.2应用程序向导生成MFC应用程序MFC的英文全称是Microsoft Foundation Class Library,即微软的基本类库,MFC实际上是一个庞大的文件库,它由执行文件和源代码文件组成。Visual C 为MFC提供了大量的工具支持。在MFC应用程序中还允许混合使用传统的Windows API函数,并且MFC编程方法充分利用了面向对象技术的优点,使得程序员所需要编写的代码大为减少,提高了编程的效率。创建MFC应用程序的容易方法是使用MFC应用程序向导,根据在向导中选择的选项,MFC应用程序向导为应用程序生成适当的类和文件。创建项目时,Visual Studio会创建一个用以包含该项目的解决方案。Visual Studio使用项目模板生成新的项目,每个模板表示一种不同的项目类型,用户添加到项目的文件都是从项目模板生成的。应用程序向导生成MFC多文档应用程序步骤如下。1. 启动【应用程序向导】新建项目步骤: 单击【文件】→【新建】→【项目】菜单项,如图3.3所示。
图3.3新建项目
2. 【新建项目】对话框步骤: (1) 单击【已安装模板】下方的Visual C 。(2) 从中间窗口中选择【MFC应用程序】项目模板,选定模板的说明会出现在右侧窗口中。(3) 在【名称】框中输入新项目的名称“Firstmfc”。(4) 在【位置】框中,选择保存位置“D: \myvc”。(5) 在【解决方案名称】框中,输入解决方案的名称(默认情况下,解决方案名称等同于项目的名称,一般常用默认值)。(6) 选中【为解决方案创建目录】复选框。(7) 单击【确定】按钮,如图3.4所示。
图3.4【新建项目】对话框
可以在【新建项目】对话框中查找已安装的项目模板,方法是浏览【已安装模板】下方左侧窗口中的展开列表。还可以在【近的模板】下浏览近创建的项目类型,也可以在【联机模板】下浏览Visual Studio Gallery网站上提供的模板。还可以使用对话框右上角的搜索框来搜索项目模板。根据选择的类别,搜索会在中间窗口中显示从近的模板、已安装的模板或联机模板列表中搜索的结果。3. 【欢迎使用MFC应用程序向导】对话框步骤: 单击【下一步】按钮,如图3.5所示。【欢迎使用MFC应用程序向导】对话框中概述一些当前项目设置情况,对话框的左侧是一些导航菜单,单击会转到对应的对话框。
图3.5【欢迎使用MFC应用程序向导】对话框
4. 【应用程序类型】对话框步骤: 选择【应用程序类型】为【多个文档】,【项目类型】为【MFC标准】,单击【下一步】按钮,如图3.6所示。
图3.6【应用程序类型】对话框
1) 【应用程序类型】选择的应用程序类型决定了应用程序中可用的用户界面选项,如表3.1所示。
表3.1应用程序类型
选项描述单文档为应用程序创建一个单文档界面(SDI)结构。在此类应用程序中,文档的框架窗口只能容纳一个文档多文档为应用程序创建一个多文档界面(MDI)结构。在此类应用程序中,文档的框架窗口可以容纳多个子文档选项卡式文档将每个文档放置到单独的选项卡上基于对话框为应用程序创建一个基于对话框的结构使用HTML对话框只适用于对话框应用程序。从CDHtmlDialogClass(而不是CDialogClass)派生对话框类多个文档为应用程序创建一个多结构。在此类应用程序中,当用户单击【文件】菜单上的【新建】命令时,应用程序会创建一个其父窗口隐式为桌面的窗口。新的文档框架会显示在任务栏中,并且不局限于应用程序窗口的工作区
2) 【文档/视图结构支持】指定应用程序中是否包含文档/视图结构。如果要移植非MFC应用程序或者希望减小编译生成的可执行文件的大小,则清除此复选框。3) 【资源语言】设置资源的语言。列表显示系统上由Visual Studio安装的可用语言。如果要选择系统语言以外的语言,则必须已经安装了该语言的适当模板文件夹。4) 【使用Unicode库】指定是使用Unicode版MFC库还是使用非Unicode版MFC库。5) 【项目类型】指示应用程序的结构和显示样式是标准MFC、Windows资源管理器、Visual Studio还是Office样式。6) 【视觉样式和颜色】确定应用程序的视觉样式。7) 【启用视觉样式切换】指定在运行时,用户通常是否可以通过从菜单或工作区中选择适当的视觉样式来更改应用程序的视觉样式。8) 【MFC的使用】指定如何链接到MFC库。默认情况下,MFC作为共享DLL链接,如表3.2所示。
表3.2MFC的使用
选项说明
使用共享DLL中的MFC将MFC库作为共享DLL链接到应用程序。应用程序在运行时调用MFC库使用静态库中的MFC生成时将应用程序链接到静态MFC库
5. 【复合文档支持】对话框步骤: 选择默认选项,单击【下一步】按钮,如图3.7所示。
图3.7【复合文档支持】对话框
在此MFC应用程序向导页中,指示应用程序提供的复合文档和活动文档支持级别。应用程序必须支持文档/视图结构才能支持复合文档和文档模板。默认情况下,应用程序不包含复合文档支持。6. 【文档模板属性】对话框步骤: 保持默认选项,单击【下一步】按钮,如图3.8所示。
图3.8【文档模板属性】对话框
在此MFC应用程序向导页中,提供了帮助文档管理和本地化的选项。文档模板字符串对于在应用程序类型中包含【文档/视图结构支持】的应用程序可用。它们对于对话框不可用。7. 【数据库支持】对话框步骤: 保持默认选项,单击【下一步】按钮,如图3.9所示。
图3.9【数据库支持】对话框
指定是否提供数据库支持,及提供的数据库支持级别的选项。8. 【用户界面功能】对话框步骤: 保持默认选项,单击【下一步】按钮,如图3.10所示。
图3.10【用户界面功能】对话框
【用户界面功能】对话框用来指定应用程序外观的选项,如系统菜单、状态栏、化和小化框、关于框、菜单栏和工具栏以及子框架等。1) 【主框架样式】设置应用程序的主窗口框架样式,如表3.3所示。
表3.3主窗口框架样式
选项说明粗框架创建可调整边框的窗口。默认值小化框在主框架窗口中包含小化框。默认值化框在主框架窗口中包含化框。默认值小化将主框架窗口作为图标打开化打开主框架窗口至满屏显示系统菜单在主框架窗口中包含系统菜单。默认值“关于”框使应用程序包含关于框初始状态栏向应用程序添加状态栏。默认情况下,应用程序有状态栏。对基于对话框的应用程序类型不可用拆分窗口提供拆分条。拆分条拆分应用程序的主视图。对基于对话框的应用程序类型不可用
2) 【子框架样式】指定应用程序中子框架的外观和初始状态。子框架样式仅对MDI应用程序可用。3) 【命令栏(菜单/工具栏/功能区)】指示应用程序是否包含菜单、工具栏或功能区。对基于对话框的应用程序不可用。4) 【对话框标题】此标题显示在对话框的标题栏中。只适用于基于对话框的项目。9. 【高级功能】对话框步骤: 保持默认选项,单击【下一步】按钮,如图3.11所示。
图3.11【高级功能】对话框
本主题列出了应用程序的附加功能选项,如帮助、打印支持等。10. 【生成的类】对话框步骤: 保持默认选项,单击【完成】按钮,如图3.12所示。
图3.12【生成的类】对话框
列出了项目生成的基类和文件的名称。默认情况下,名称基于在【新建项目】对话框中指定的项目名称,也可以更改名称。1) 【生成的类】为项目创建的所有类的名称。默认情况下,名称基于项目名称。默认MFC项目会创建一个C项目名View类、一个C项目名App类、一个C项目名Doc类、一个CMainFrame类和一个CChildFrame类。2) 【类名】类的名称,类名的任何更改都将显示在【生成的类】列表中。3) 【.h文件】类的头文件名称。4) 【基类】类的基类名称,可以从列表中为基类选择另一个类。5) 【.cpp文件】与类相关联的源代码文件的名称。11. 生成解决方案步骤: 单击【生成】→【生成解决方案】菜单项,如图3.13所示。
图3.13生成解决方案
12. 开始执行步骤: 单击【调试】→【开始执行(不调试)】菜单项,如图3.14所示。运行结果如图3.15所示。
图3.14执行菜单
图3.15运行结果
如果生成单文档应用程序,只需在上面的【应用程序类型】对话框中,在【应用程序类型】中选择【单个文档】。如果生成基于对话框的应用程序,只需在【应用程序类型】中选择【基于对话框】即可。
3.1.3项目的文件组织用应用程序向导生成框架程序后,可以看到以解决方案名命名的文件夹,此文件夹中包含几个文件和一个以项目名命名的子文件夹,这个子文件夹中又包含若干个文件和一个res文件夹,创建项目时的选项不同,项目文件夹下的文件可能也会有所不同。如果已经以Debug方式编译链接过程序,则会在解决方案文件夹下和项目子文件夹下各有一个名为Debug的文件夹。而如果是Release方式编译则会有名为Release的文件夹。这两种编译方式将产生两种不同版本的可执行程序: Debug版本和Release版本。Debug版本的可执行文件中包含用于调试的信息和代码,而Release版本则没有调试信息,不能进行调试,但可执行文件比较小。1. 解决方案和项目文件解决方案相关文件包括解决方案文件夹下的.sdf文件、.sln文件、.suo文件和ipch文件夹。.sdf文件和ipch文件夹与智能提示、错误提示、代码恢复和团队本地仓库等相关。 .sln文件和.suo文件为MFC自动生成的解决方案文件,它们包含当前解决方案中的项目信息,存储解决方案的设置。 项目相关文件包括项目文件夹下的.vcxproj文件和.vcxproj.filters文件。 .vcxproj文件是MFC生成的项目文件,包含当前项目的设置和项目所包含的文件等信息。.vcxproj.filters文件存放项目的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息,如表3.4所示。
表3.4项目和解决方案文件
文件名说明*.sln解决方案文件。它将一个或多个项目的所有元素组织到一个解决方案中*.suo解决方案选项文件。它存储解决方案的自定义项,以便每次在解决方案中打开项目或文件时具有所需的外观和行为*.vcxproj项目文件。存储项目的专用信息*.sdf浏览数据库文件*.vcxproj.filters筛选器文件。指定要添加到解决方案中的文件的位置*.vcxproj.user迁移用户文件Readme.txt自述文件。它由应用程序向导生成,并描述在项目中的文件
2. 应用程序源文件和头文件应用程序向导会根据应用程序的类型(单文档、多文档或基于对话框的程序)自动生成一些头文件和源文件,如表3.5所示。这些文件是项目的主体部分,用于实现主框架、文档、视图等,具体视所创建项目选择的选项而不同。
表3.5源文件和头文件
文件名说明
*.h程序或DLL的主包含文件。它包含其他头文件的所有全局符号和#include指令*.cpp主程序源文件。它注册文档模板,以用作文档和视窗之间的连接; 创建主框架窗口及创建空文档*Dlg.cpp
*Dlg.h基于对话框的应用程序时创建。包含初始化对话框和执行对话框数据交换(DDX)的主干成员函数*Doc.cpp
*Doc.h包含初始化文档、序列化文档和实现调试诊断的主干成员函数*Set.h
*Set.cpp创建支持数据库且包含记录集类的程序时创建*View.cpp
*View.h用于显示和打印文档数据
MainFrm.cpp、MainFrm.hCMainFrame类处理工具栏按钮和状态栏的创建ChildFrm.cpp、ChildFrm.h用于MDI文档框架窗口
3. 资源文件一般使用MFC生成程序都会有对话框、图标、菜单等资源,应用程序向导会生成资源相关文件: res目录、*.rc文件和Resource.h文件。res目录: 项目文件夹下的res文件夹中含有应用程序默认图标、工具栏使用的图标等图标文件。*.rc: 包含默认菜单定义、字符串表和加速键表,指定了默认的About对话框和应用程序默认图标文件等。Resource.h: 含有各种资源的ID定义。4. 编译、链接和可执行文件如果是Debug方式编译,则会在解决方案文件夹和项目文件夹下都生成Debug子文件夹,而如果是Release方式编译则生成Release子文件夹。项目文件夹下的Debug或Release子文件夹中包含编译链接时产生的中间文件,解决方案文件夹下的Debug或Release子文件夹中主要包含应用程序的可执行文件。3.1.4应用程序向导生成基于对话框的应用程序案例生成一个基于对话框的应用程序。程序运行结果如图3.16所示。
图3.16运行结果
步骤: 1. 启动【应用程序向导】新建项目打开Visual Studio 2010开发环境主窗口,单击【文件】→【新建】→【项目】菜单,如图3.17所示。
图3.17新建项目
2. 【新建项目】对话框 (1) 单击【已安装模板】下方的Visual C 。(2) 从中间窗口中选择【MFC应用程序】项目模板。(3) 在【名称】框中输入新项目的名称“Mydialog”。(4) 在【位置】框中,选择保存位置“D:\myvc”。(5) 在【解决方案名称】中,保持默认值。(6) 选中【为解决方案创建目录】复选框。(7) 单击【确定】按钮,如图3.18所示。
图3.18【新建项目】对话框
3. 【欢迎使用MFC应用程序向导】对话框单击【下一步】按钮,如图3.19所示。
图3.19【欢迎使用MFC应用程序向导】对话框
4. 【应用程序类型】对话框【应用程序类型】选择【基于对话框】,【项目类型】选择为【MFC标准】,将【使用Unicode库】选项去掉,单击【完成】按钮,如图3.20所示。
图3.20【应用程序类型】对话框
5. 生成解决方案并运行单击【生成】→【生成解决方案】菜单或按F7键,单击【调试】→【开始执行】菜单或按Ctrl F5键。3.2MFC类3.2.1MFC类结构
Visual C 是通过【类视图】来管理应用程序的各个类的。1. 类视图打开【类视图】的方法: 单击【视图】→【类视图】菜单。【类视图】用于显示正在开发的应用程序中定义、引用或调用的符号。可以使用【类视图】打开文件。【类视图】有两个窗口: 上部的【对象】窗口和下部的【成员】窗口。【对象】窗口包含一个可以展开的符号树,其节点表示项目。若要展开树中选定的节点,请单击其加号( )。图标用于标识项目中使用的分层结构,可以展开这些结构以列出其成员。【成员】窗口中列出了属性、方法、事件、变量、常量和包含的其他项。
图3.21【类视图】工具栏
1) 【类视图】工具栏【类视图】工具栏(如图3.21所示)可以添加虚拟文件夹并在【对象】和【成员】窗口中定位。【类视图新建文件夹】: 创建一个新文件夹或子文件夹。【后退】: 定位到以前选定的项。【前进】: 定位到下一个选定的项。【类视图设置】: 为选定的项目显示的可用对象和成员。下面列出了可用选项: 显示基类型、显示派生类型、显示项目引用、显示隐藏类型和成员、显示公共成员、显示保护的成员、显示私有成员、显示其他成员和显示继承成员。2) 【对象】窗口【对象】窗口包含一个可以展开的符号树,其节点表示项目。在【对象】窗口中选择一个对象后,【成员】窗口中会显示其成员。双击对象一般会打开对应的头文件(.h文件)。3) 【成员】窗口每个对象都可以包含诸如属性、方法、事件、常量、变量和枚举值之类的成员。在【对象】窗口中选择一个对象后,【成员】窗口中会显示其成员。双击对象一般会打开对应的实现文件(.cpp文件)。4) 在【类视图】中实现定位符号的定义及引用位置【类视图】提供了若干命令来定位到符号的定义及其在代码中的使用(引用)。双击符号可定位到在代码中定义的这些符号。(1) 定位到定义或声明双击符号或鼠标右击符号,然后选择【转到定义】或【转到声明】菜单项。(2) 查找所有引用鼠标右击符号并选择【查找所有引用】菜单项。【查找符号结果】窗口中列出了项目中找到的符号的实例。在【查找符号结果】窗口中,双击该项可以在代码中定位符号实例。2. MFC类结构打开3.1.2节MFC应用程序向导生成的应用程序Firstmfc,单击【视图】→【类视图】菜单来打开类视图,会看到包括如下的类。(1) 项目的视图类: CFirstmfcView类,派生自CView类。(2) 项目的应用程序类: CFirstmfcApp,派生自CWinAppEx类,CWinAppEx类派生自CWinApp类。(3) 项目的文档类: CFirstmfcDoc,派生自CDocument类。(4) 项目的主框架类: CMainFrame类,派生自CFrameWndEx,CFrameWndEx类派生自CFrameWnd类。(5) 项目的对话框类: CAboutDlg,派生自CDialogEx类,CDialogEx类派生自CDialog类。MFC类的基本层次结构如图3.22所示。
图3.22MFC类的基本层次结构
1) CObject类由于MFC中大部分类是从CObject类继承而来的,CObject类描述了几乎所有的MFC类的一些公共特性,CObject类为程序员提供了对象诊断、运行时类型识别和序列化等功能。2) CCmdTarget类CCmdTarget类由CObject类直接派生而来,它负责将消息发送到能够响应这些消息的对象,它是所有能进行消息映射的MFC类的基类。3) CWinApp类在任何MFC应用程序中有且仅有一个CWinApp派生类的对象,它代表了程序中运行的主线程,也代表了应用程序本身。CWinApp类派生出CWinAppEx类。4) CWnd类CWnd类由CCmdTarget类直接派生而来,该类及其派生类的实例是一个窗口。它是一个功能完善、成员函数多的MFC类。窗口的实例包括应用程序主窗口、对话框和控件等。CWnd类提供的功能包括注册新窗口类、创建窗口及子窗口、管理窗口及控件等。5) CFrameWnd类CFrameWnd类是CWnd类的派生类,主要用来掌管一个窗口。CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、化按钮、小化按钮和一个激活的视图。CFrameWnd支持SDI界面,对于MDI界面,使用其两个派生类CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd派生出CMDIFrameWndEx类,CMDIChildWnd派生出CMDIChildWndEx类。6) CDocument类CDocument类在应用程序中作为用户文档类的基类,它代表了用户存储或打开的一个文件。CDocument类的主要功能是把对数据的处理从对用户的界面处理中分离出来,同时提供了一个与视图类交互的接口。CDocument类支持标准的文件操作,如创建、打开和存储一个文档等。7) CView类CView类是MFC中一个很基本的类,它作为其他MFC视图类和用户视图派生类的基类。8) CDialog类CDialog类是对话框的基类,CDialog类派生出CDialogEx类。3.2.2添加成员变量与成员函数1. 添加成员变量
可以通过【添加成员变量向导】添加成员变量。1) 打开【添加成员变量向导】的两种方法(1) 在【类视图】中,单击要添加变量的类,单击【项目】→【添加变量】菜单,或鼠标右击要添加变量的类,在快捷菜单中,单击【添加】→【添加变量】菜单,显示【添加成员变量向导】,如图3.23所示。
图3.23【添加成员变量向导】对话框
(2) 在【资源视图】中,双击要添加成员的对话框,在对话框编辑器中显示的对话框中,鼠标右击要添加成员变量的控件,在快捷菜单中单击【添加变量】显示【添加成员变量向导】。2) 【添加成员变量向导】对话框该向导将成员变量声明添加到头文件,根据具体的选项,它还可以将代码添加到.cpp文件。(1) 【访问】设置对成员变量的访问。访问修饰符是指定其他类对成员变量的访问的关键字。可以为public(公有)、protected(保护的)、private(私有)。默认情况下,成员变量的访问级别设置为public。(2) 【变量类型】设置正在添加的成员变量的类型。如果【类别】选择Control,则【变量类型】指定在【控件ID】框中选择的控件的基类。如果控件【类别】选择Value时,【变量类型】指定该控件可以包含的值的适当类型。(3) 【变量名】设置正在添加的成员变量的名称。成员变量通常以标识字符串“m_”开头,默认情况下会提供此标识字符串。(4) 【控件变量】此选项仅对添加到从CDialog导出的类的成员变量可用。选择此框将激活【控件ID】和【控件类型】选项。(5) 【控件ID】设置正在添加的控件变量的ID,从列表中选择正在为其添加成员变量的控件类型的ID。列表仅在【控件变量】被选中时,并且仅包含已添加到对话框的控件的ID。例如,对于标准的【确定】按钮,控件ID为IDOK。(6) 【类别】指定变量是基于控件类型还是控件的值。(7) 【控件类型】设置正在添加的控件类型,此框不可更改。例如,按钮的控件类型为BUTTON,而组合框的控件类型为COMBOBOX。(8) 【字符数】仅在【变量类型】设置为CString时可用,指示控件多可以保留的字符数。(9) 【小值】仅当变量类型为BOOL、int、UINT、long、DWORD、float、double、BYTE、short、COleCurrency或CTime时可用,指示可接受的小值。(10) 【值】仅当变量类型为BOOL、int、UINT、long、DWORD、float、double、BYTE、short、COLECurrency或CTime时可用,指示可接受的值。(11) 【.h文件】设置添加类声明的头文件名。(12) 【.cpp文件】设置添加类定义的实现文件名。(13) 【注释】提供成员变量头文件中的注释。
2. 添加成员函数可以在【类视图】中通过【添加成员函数向导】将成员函数添加到任何类。【添加成员函数向导】将声明添加到头文件,将成员函数体添加到类实现文件。1) 打开【添加成员函数向导】的方法在【类视图】中,单击要添加成员函数的类,单击【项目】→【添加函数】菜单,或鼠标右击要添加成员函数的类,在快捷菜单中,单击【添加】→【添加函数】菜单。2) 【添加成员函数向导】对话框【添加成员函数向导】对话框(如图3.24所示)可以实现添加成员函数的功能。
图3.24【添加成员函数向导】对话框
(1) 【返回类型】设置要添加的成员函数的返回类型。可以提供自己的返回类型,或从可用类型列表中选择。(2) 【函数名】设置要添加的成员函数的名称。(3) 【参数类型】如果要添加的成员函数有参数,设置该函数的参数类型。可以提供自己的参数类型,或从可用类型列表中选择。(4) 【参数名】如果要添加的成员函数有参数,设置该函数的参数名。(5) 【参数列表】显示已经添加到成员函数的参数列表。若要向该列表添加参数,在【参数类型】和【参数名】框中提供类型和名称并单击【添加】按钮。若要从该列表中移除某个参数,选择该参数并单击【移除】按钮。(6) 【访问】设置对成员函数的访问的关键字。可以为public(公有)、protected(保护的)、private(私有)。默认情况下,成员函数的访问级别设置为public。(7) 【静态】、【虚函数】、【纯虚函数】和【内联】设置新成员函数是静态的还是虚函数、纯虚函数还是内联函数。(8) 【.cpp文件】设置成员函数实现写入的文件位置。默认情况下,写入成员函数添加到的类的.cpp文件。单击省略号按钮可以更改文件名,成员函数实现被添加到选定文件的内容中。(9) 【注释】提供成员函数头文件中的注释。(10) 【函数签名】显示单击【完成】按钮时成员函数出现在代码中的样子,无法编辑此框中的文本。3.2.3MFC类向导可以通过类向导向类中添加: 消息、消息处理程序、成员变量和方法(成员函数),还可以向项目中添加类。打开【MFC类向导】的方法: 单击【项目】→【类向导】菜单,或在【类视图】或【解决方案资源管理器】中单击鼠标右键,在弹出的菜单中单击【类向导】菜单,即可显示【MFC类向导】对话框,如图3.25所示。
图3.25【MFC类向导】对话框
1. 【项目】解决方案中项目的名称。2. 【类名】项目中类的名称。3. 【添加类】可以通过【MFC类】、【类型库中MFC类】、【ActiveX控件中的MFC类】或【MFCODBC使用者】来添加类。4. 【基类】显示在【类名】中的类的基类。5. 【类声明】类的声明文件的名称。6. 【类实现】类的实现文件的名称,可以通过单击箭头选择一个不同的实现文件。7. 【资源】【类名】中如果需要有资源ID,否则【资源】框为空。8. 【命令】选择【命令】选项卡,可以添加、删除、编辑或搜索命令和其消息处理程序。(1) 添加处理程序: 选择【对象ID】和【消息】列表中的选项,单击【添加处理程序】按钮。(2) 删除处理程序: 在【成员函数】列表中选择一个选项,然后单击【删除处理程序】按钮。(3) 编辑代码: 双击【成员函数】列表中相应的选项,或在【成员函数】列表中选择一个选项,然后单击【编辑代码】按钮。9. 【消息】选择【消息】选项卡,可以添加、删除、编辑或搜索消息和其消息处理程序。1) 添加处理程序选择【消息】列表中的选项,单击【添加处理程序】按钮,或双击【消息】列表中的选项。2) 删除处理程序在【现有处理程序】列表中选择一个选项,然后单击【删除处理程序】按钮。3) 编辑代码双击【现有处理程序】列表中相应的选项,或在【现有处理程序】列表中选择一个选项,然后单击【编辑代码】按钮。4) 添加自定义消息单击【添加自定义消息】按钮,然后在【添加自定义消息】对话框中指定值。10. 【虚函数】选择【虚函数】选项卡,可以允许添加、删除、编辑或搜索一个虚拟的函数或重写的虚函数。11. 【成员变量】选择【成员变量】选项卡可以添加、删除、编辑或搜索成员变量。1) 为控件添加关联变量选择【成员变量】页面,在【成员变量】列表中选中控件,单击【添加变量】按钮,弹出【添加成员变量】对话框,在【成员变量名称】文本框中输入变量名,在【类别】下拉列表中选中类别,在【变量类型】下拉列表中选中变量的类型,如图3.26所示。2) 自定义成员变量选择【成员变量】页面,单击【添加自定义】按钮,在弹出的【添加成员变量】对话框中,在【变量类型】下拉列表中选择变量的类型,在【变量名】编辑框中输入变量名,在访问权限组中,选择访问类型,如图3.27所示。
图3.26【添加成员变量】对话框
图3.27自定义成员变量
3) 删除成员变量选择【成员变量】页面,在【成员变量】列表框中选中变量,单击【删除变量】按钮。4) 修改成员变量选择【成员变量】页面,在【成员变量】列表框中选中变量,单击【编辑代码】按钮。12. 【方法】选择【方法】选项卡可以允许添加、删除或搜索一个方法以及转到方法的定义或方法的声明。1) 添加方法选择【方法】页面,单击【添加方法】按钮,然后在【添加方法】对话框中指定值,如图3.28所示。
图3.28【添加方法】对话框
(1) 【返回类型】设置要添加的成员函数的返回类型。可以提供自己的返回类型,或从可用类型列表中选择。(2) 【函数名称】设置要添加的成员函数的名称。(3) 【参数类型】如果要添加的成员函数有参数,设置该函数的参数类型。可以提供自己的参数类型,或从可用类型列表中选择。(4) 【参数名称】如果要添加的成员函数有参数,设置该函数的参数名。(5) 【参数列表】显示已经添加到成员函数的参数列表。若要向该列表添加参数,在【参数类型】和【参数名称】框中提供类型和名称并单击【添加】按钮。若要从该列表中移除某个参数,选择该参数并单击【移除】按钮。(6) 【访问】设置对成员函数的访问的关键字。可以为public(公有的)、protected(保护的)、private(私有的)。默认情况下,成员函数的访问级别设置为public。(7) 【静态】、【虚拟】、【常量】和【内联】设置新成员函数是静态的还是虚拟、常量或内联函数。(8) 【注释】提供成员函数的注释。(9) 【函数签名】显示单击【完成】按钮时成员函数出现在代码中的样子,无法编辑此框中的文本。2) 删除方法在【方法】列表中选择一个选项,然后单击【删除方法】按钮。3) 显示方法的定义代码在【方法】列表中选择一个选项,然后单击【转到定义】按钮,或双击【方法】列表中的选项。4) 显示方法的声明代码在【方法】列表中选择一个选项,然后单击【转到声明】按钮。3.2.4类的添加与删除1. 类的添加
单击【项目】→【添加类】菜单,或在【解决方案资源管理器】或【类视图】中右击该项目,单击【添加】→【类】菜单,此时会打开【添加类】对话框,如图3.29所示。
图3.29【添加类】对话框
在【添加类】对话框中,当在左侧窗口中展开Visual C 节点时,将会显示多组已安装的模板。这些组包括CLR、ATL、MFC和C 。如果选择某个组,则将在中间窗口中显示该组中可用模板的列表。每个模板都包含某个类所需的文件和源代码。若要生成新的MFC类,在中间窗口内选择【MFC类】,然后单击【添加】按钮。此时会打开【MFC添加类向导】,这样就可为该类指定选项。2. 【MFC添加类向导】对话框将类添加到现有的MFC项目,或将类添加到支持MFC的ATL项目,也可以将MFC类添加到具有MFC支持的Win32项目中。创建项目时指定的功能决定此对话框中的可用选项,如图3.30所示。一般情况下只需要输入类名,选择一个基类即可,其他选项可以用默认值。
图3.30MFC添加类向导
1) 【类名】指定新类的名称,C 类通常以“C”开头。2) 【基类】指定新类的基类名称,默认情况下,基类为CWnd。
3) 【对话框ID】如果选择了CDialog、CFormView、CPropertyPage或CDHtmlDialog作为“基类”,指定对话框的ID。4) 【.h文件】为类设置头文件的名称。默认情况下,此名称基于在【类名】中提供的名称。单击省略号按钮将该文件名保存到所选位置,或将类声明追加到现有文件。5) 【.cpp文件】为类设置实现文件的名称,默认情况下,此名称基于在【类名】中提供的名称。单击省略号按钮将文件名保存到所选位置。6) 【ActiveAccessibility】通过调用构造函数中的EnableActiveAccessibility来启用MFC对ActiveAccessibility的支持。此选项对从CWnd导出的类可用。7) 【DHTML资源ID】仅应用于从CDHtmlDialog导出的类,指定DHTML对话框的资源ID。8) 【.HTM文件】仅应用于从CDHtmlDialog导出的类,设置DHTML对话框的HTML文件名。9) 【自动化】设置自动化支持的类级别。10) 【类型ID】将项目名和新的类名用“.”连接在一起。11) 【生成DocTemplate资源】指示应用程序创建的文档具有文档模板资源。为激活此复选框,项目必须支持MFC文档/视图结构,并且该类的基类必须是CFormView。3. 类的删除在【解决方案资源管理器】中分别选择要删除的类的.h和.cpp文件,然后右击选择【移除】菜单,会弹出【移除】、【删除】和【取消】三个选项,如图3.31所示。选择【移除】,只是将类的文件从项目中删除,但文件还在项目的目录下保存着,选择【删除】,就将文件从磁盘上彻底删掉了。
图3.31类的删除
3.2.5MFC类案例编写一个基于对话框的密码程序,要求添加相关控件并实现如下的功能: 根据输入的密码信息,弹出相应的消息框,如果密码和用户名正确输出“欢迎您”消息框,如果密码或用户名不正确输出“用户名或密码错误,重新输入!”的消息框,要求密码信息显示为“*”。运行效果如图3.32所示。
图3.32运行效果
步骤: 1. 新建一个基于对话框的应用程序1) 启动【应用程序向导】新建项目打开Visual Studio 2010开发环境主窗口,单击【文件】→【新建】→【项目】菜单,如图3.33所示。
图3.33新建项目
2) 【新建项目】对话框 (1) 单击【已安装模板】下方的Visual C 。(2) 从中间窗口中选择【MFC应用程序】项目模板。(3) 在【名称】框中输入新项目的名称“Password”。(4) 在【位置】框中,选择保存位置“D: \myvc”。(5) 在【解决方案名称】中,保持默认值。(6) 选中【为解决方案创建目录】复选框。(7) 单击【确定】按钮,如图3.34所示。
图3.34【新建项目】对话框
3) 【欢迎使用MFC应用程序向导】对话框单击【下一步】按钮,如图3.35所示。
图3.35【欢迎使用MFC应用程序向导】对话框
4) 【应用程序类型】对话框【应用程序类型】选择【基于对话框】,【项目类型】选择【MFC标准】,将【使用Unicode库】选项去掉,单击【完成】按钮,如图3.36所示。
图3.36【应用程序类型】对话框
2. 在对话框中添加控件删除对话框上原有的【TODO:在此放置对话框控件】静态文本控件、【确定】和【取消】按钮控件。分别添加两个静态文本,两个编辑框和一个命令按钮。3. 修改控件的属性在中间的编辑窗口中的IDD_PASSWORD_DIALOG对话框上单击鼠标右键,然后在右键菜单中选择【属性】命令,在打开的【属性】窗口中修改其Caption属性为“输入密码”,如图3.37所示。鼠标右键单击IDC_STATIC2控件,在弹出的菜单中选择【属性】命令,在【属性】窗口中,设置Caption属性为“用户名: ”。用类似的方法设置其他控件的属性,如表3.6所示。设置后的效果如图3.38所示。
图3.37设置对话框属性
表3.6控件属性
控件名字(NAME)控 件 属 性属性值
对话框IDD_PASSWORD_DIALOGCaption输入密码静态文本IDC_STATIC2Caption用户名: 静态文本IDC_STATIC3Caption密码: 命令按钮IDC_BUTTON1Caption确定编辑框IDC_EDIT2PasswordTrue
图3.38设置后的效果
4. 添加控件的成员变量分别用【成员变量向导】和【类向导】方法为控件添加如表3.7所示的成员变量。
表3.7成员变量表
控件ID类别变 量 类 型变量名
IDC_EDIT1ValueCStringm_userIDC_EDIT2ValueCStringm_pass
1) 用【成员变量向导】方法为IDC_EDIT1定义关联变量名为“m_user”鼠标右击IDC_EDIT1控件,在弹出的菜单中单击【添加变量】菜单,打开【添加成员变量向导】对话框,在【变量名】编辑框中输入“m_user”,其他选项保持默认值不变,如图3.39所示。
图3.39添加成员变量向导
2) 用【类向导】方法为IDC_EDIT2定义关联变量名为“m_pass”(1) 单击【项目】→【类向导】菜单。在MFC类向导对话框中,类名选择CPasswordDlg,选择【成员变量】选项卡页面,在【成员变量】列表中,选择IDC_EDIT2,单击【添加变量】按钮,如图3.40所示。(2) 在【添加成员变量】对话框中,【成员变量名称】项输入“m_pass”,【类别】项选择Value,【变量类型】选择CString,【字符数】输入“6”,单击【确定】按钮,如图3.41所示。
图3.40【MFC类向导】对话框
图3.41【添加成员变量】对话框
5. 添加成员函数在【类视图】中鼠标右击CPasswordDlg,在弹出的菜单中单击【添加】→【添加函数】菜单,如图3.42所示。在【添加成员函数向导】对话框中,【返回类型】选择bool,【参数类型】选择int,【访问】选择public,【函数名】输入“emp”。单击【完成】按钮,如图3.43所示。
图3.42添加成员函数
图3.43添加成员函数向导
在生成的emp函数中添加如下代码。
BoolCPasswordDlg::emp(void)
{
UpdateData(TRUE);
if(m_user.IsEmpty())//判断是否为空
{
MessageBox(“用户名不能为空,重新输入!”);
return true;
}
return false;
}
MessageBox函数显示一个消息框,消息框中显示的文字是函数后括号中的文字。当程序进行交换数据时,需要调用UpdateData函数。UpdateData函数原形如下:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE);
该函数只有一个布尔型参数bSaveAndValidate,它决定了数据传送的方向。若参数值为TRUE,即调用UpdateData(TRUE),表示将数据从控件中传送到对应的数据成员中; 若参数值为FALSE,即调用UpdateData(FALSE),则表示将数据从数据成员中传送给对应的控件。6. 编写程序代码双击IDC_BUTTON1命令按钮,在voidCPasswordDlg::OnBnClickedButton1()函数中的“//TODO: 在此添加控件通知处理程序代码”后填写如下代码。
voidCPasswordDlg::OnBnClickedButton1()
{
//TODO: 在此添加控件通知处理程序代码
if(emp()==true)return;
UpdateData(TRUE);
if(m_user==”莉莉” && m_pass==”123456″) MessageBox(“欢迎您!”);
else
{
MessageBox(“用户名或密码错误,重新输入!”);
m_user=””;m_pass=””;
}
UpdateData(false);
}
7. 生成解决方案并运行单击【生成】→【生成解决方案】菜单或按F7键,单击【调试】→【开始执行】菜单或按Ctrl F5键。说明: VC 2010编写MFC程序的时候经常要用MessageBox函数,如果有提示“error C2664: “CWnd::MessageBoxW”:不能将参数1从”const char []”转换为”LPCTSTR””,错误提示的原因是VS2010默认使用的是UNICODE字符集,在参数转换时会出错。解决方法如下:方法1: 在新建项目时,把使用UNICODE字符集取消,如图3.44所示。
图3.44MFC应用程序向导
方法2: 单击【项目】→【属性】→【配置属性】→【常规】选项,把【字符集】改为【使用多字节字符集】,然后单击【确定】按钮,如图3.45所示。
图3.45配置常规选项
3.2.6对话框的数据交换机制成员变量存储了与控件相对应的数据。成员变量需要和控件交换数据,以完成输入或输出功能。例如,一个编辑框既可以用来输入,也可以用来输出。当用作输入时,用户在其中输入了数值之后,对应的数据成员应该更新与编辑框中的数值相同。当用作输出时,应及时刷新编辑框的内容以反映相应数据成员的变化。那么,对话框就需要一种机制来实现这种数据交换功能。MFC提供了类CDataExchange来实现对话框类与控件之间的数据交换(DDX),该类还提供了数据有效机制(DDV)。数据交换的工作由CDialog::DoDataExchange来完成。总结基于对话框的密码程序的数据交换过程,分别在头文件和实现文件中生成的代码如下。
PasswordDlg.h : 头文件
class CPasswordDlg : public CDialogEx
{
…
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持
public:
CString m_user;
CString m_pass;
…
};
PasswordDlg.cpp : 实现文件
CPasswordDlg::CPasswordDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CPasswordDlg::IDD, pParent)
,
m_user(_T(“”))
{
…
m_pass = _T(“”);
}
void CPasswordDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_user);
DDX_Text(pDX, IDC_EDIT2, m_pass);
DDV_MaxChars(pDX, m_pass, 6);
}
DoDataExchange函数只有一个参数,即一个CDataExchange对象的指针pDX。在该函数中调用了DDX函数来完成数据交换,调用DDV函数来进行数据有效检查。3.3消息和消息映射3.3.1消息及消息的分类
Windows是基于消息驱动的,消息的传递与发送是Windows应用程序的核心所在,任何事件的触发与响应均要通过消息的作用才能得以完成。在SDK编程中,对消息的获取与分发主要是通过消息循环来完成的,而在MFC编程中则是通过采取消息映射的方式对其进行处理的。相比而言,这样的处理方式要简单许多,这也是符合面向对象编程中尽可能隐含实现细节的原则。Windows应用程序中的消息主要有以下三种类型。(1) Windows消息: 这类消息主要是指由WM_开头的消息(WM_COMMAND除外)。Windows消息往往带有参数,以标志处理消息的方法。(2) 控件的通知消息: 当控件的状态发生改变(例如用户在控件中进行输入)时,控件就会向其父窗口发送WM_COMMAND通知消息。(3) 命令消息: 命令消息主要包括由用户交互对象(菜单、工具条的按钮、快捷键等)发送的WM_COMMAND通知消息。消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。CWnd的派生类都可以接收到Windows消息、通知消息和命令消息。命令消息还可以由文档类等接收。3.3.2MFC常用消息及其消息映射函数1. 键盘消息
当用户在键盘上按下某个键的时候,会产生WM_KEYDOWN消息,释放按键的时候又会产生WM_KEYUP消息,所以WM_KEYDOWN与WM_KEYUP消息一般总是成对出现的,WM_CHAR消息,是在用户的键盘输入能产生有效的ASCII码时才会发生。要注意前两个消息与WM_CHAR消息在使用上是有区别的。在前两个消息中,伴随消息传递的是按键的虚拟键码,所谓虚拟键代码,是指与设备无关的键盘编码,所以这两个消息可以处理非打印字符,如方向键、功能键等。而伴随WM_CHAR消息的参数是所按的键的ASCII码,ASCII码是可以区分字母的大小写的,而虚拟键码是不能区分大小写的。三种消息原型分别如下。MFC类向导能自动添加当前类的WM_KEYDOWN、WM_KEYUP和WM_CHAR消息处理函数,函数原型如下。
afx_msg void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);
afx_msg void OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags);
afx_msg是MFC用于定义消息函数的标志,参数nChar表示虚拟键代码,nRepCnt表示当用户按住一个键时的重复计数,nFlags表示击键消息标志。
afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
参数nChar表示键的ASCII码,nRepCnt表示当用户按住一个键时的重复计数,nFlags表示字符消息标志。2. 鼠标消息当用户对鼠标进行操作时,只要鼠标移过窗口的客户区时,就会向该窗口发送WM_MOUSEMOVE(移动鼠标)消息。客户区是指窗口中用于输出文档的区域。用户按下左键时发送WM_LBUTTONDOWN,当用户释放左键时发送WM_LBUTTONUP,用户双击左键时发送WM_LBUTTONDBCLICK,用户按下右键时发送WM_RBUTTONDOWN,用户释放右键时发送WM_RBUTTONUP,用户双击右键时发送WM_RBUTTONDBCLICK。函数原型如下。
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags,CPoint point);
afx_msg void OnRButtonDown(UINT nFlags,CPoint point);
afx_msg void OnRButtonUp(UINT nFlags,CPoint point);
afx_msg void OnRButtonDblClk(UINT nFlags,CPoint point);
其中,point表示鼠标光标在屏幕上的(x,y)坐标,nFlags表示鼠标按键和键盘组合情况,它可以是下列值的组合(MK前缀表示“鼠标键”)。MK_CONTROL——键盘上的Ctrl键被按下; MK_LBUTTON——鼠标左键被按下; MK_MBUTTON——鼠标中键被按下; MK_RBUTTON——鼠标右键被按下; MK_SHIFT——键盘上的Shift键被按下。3. 计时器消息应用程序是通过CWnd的SetTimer函数来设置并启动计时器的,这个函数的原型如下:
UINT_PTR SetTimer( UINT_PTR nIDEvent, UINT nElapse, void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD));
参数nIDEvent用来指定该计时器的标识值(不能为0),当应用程序需要多个计时器时可多次调用该函数,但每一个计时器的标识值应是的。nElapse表示计时器的时间间隔(单位为ms)。lpfnTimer是一个回调函数的指针,该函数由应用程序来定义,用来处理计时器WM_TIMER消息。一般情况下该参数为NULL,此时WM_TIMER消息被放入到应用程序消息队列中供CWnd对象处理。SetTimer函数成功调用后返回新计时器的标识值。当应用程序不再使用计时器时,可调用CWnd的KillTimer函数来停止WM_TIMER消息的传送,函数原型如下:
BOOL KillTimer(int nIDEvent);
其中,nIDEvent和用户调用SetTimer函数设置的计时器标识值是一致的。对于WM_TIMER消息,类向导会将其映射成具有下列原型的消息处理函数:
afx_msg voidOnTimer(UINT nIDEvent);
通过nIDEvent可判断出WM_TIMER是哪个计时器传送的。4. 窗口消息创建一个窗口对象的时候,这个窗口对象在创建过程中收到的就是WM_CREATE消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作,如设置窗口的大小、背景颜色等。WM_DESTROY消息指示窗口即将要被撤销,在这个消息处理过程中,可以做窗口撤销前的一些工作。WM_CLOSE消息发生在窗口将要被关闭之前,在收到这个消息后,一般性的操作是回收所有分配给这个窗口的各种资源。而当窗口工作区中的内容需要重画的时候就会产生WM_PAINT消息。函数原型如下:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
lpCreateStruct: 包括被创建窗口的信息。
afx_msg void OnDestroy();
afx_msg void OnClose();
afx_msg void OnPaint();
5. 焦点消息当一个窗口从非活动状态变为具有输入焦点的活动状态的时候,它就会收到WM_SETFOCUS消息,而当一个窗口失去输入焦点变为非活动状态的时候它就会收到WM_KILLFOCUS消息。函数原型如下:
afx_msg void OnSetFocus(CWnd*pOldWnd);
afx_msg void OnKillFocus(CWnd*pNewWnd);
pOldWnd: 指向失去输入焦点的窗口。pNewWnd: 指向接收输入焦点的窗口。3.3.3消息映射MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。MFC在类中加入静态消息映射表的方式是通过DECLARE_MESSAGE_MAP()和BEGIN_MESSAGE_MAP()及END_MESSAGE_MAP()宏来实现的。1. 宏的说明1) DECLARE_MESSAGE_MAP在类的头文件(.h)中使用,在类声明的尾部,用于声明在源文件中存在的消息映射。2) BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()在类的实现文件(.cpp)中使用,分别标识消息映射的开始和消息映射的结束。一个完整的MFC消息映射包括对消息处理函数的原型声明、实现以及存在于消息映射中的消息入口,这几部分分别存在于类的头文件和实现文件中。一般情况下除了对自定义消息的响应外,对于标准Windows消息的映射处理可以借助类向导来完成。2. 一个完整的MFC消息映射过程(1) 在类的定义文件(.h)中DECLARE_MESSAGE_MAP()后添加消息处理函数的函数声明,注意要以afx_msg打头。(2) 在类的实现文件(.cpp)中的消息映射表中添加该消息的消息映射入口项。
BEGIN_MESSAG_MAP
…
消息映射入口项
…
END_MESSAGE_MAP
(3) 在类实现文件(.cpp)中添加消息处理函数的函数实现。3.3.4消息映射案例生成一个基于对话框的应用程序,完成在对话框中单击鼠标左键,弹出一个消息框显示“您好!”。运行结果如图3.46所示。
图3.46运行结果
步骤: 1. 新建一个基于对话框的应用程序1) 启动【应用程序向导】新建项目打开Visual Studio 2010开发环境主窗口,单击【文件】→【新建】→【项目】菜单。2) 【新建项目】对话框(1) 单击【已安装模板】下方的Visual C 。(2) 从中间窗口中选择【MFC应用程序】项目模板。(3) 在【名称】框中输入新项目的名称“Hellodialog”。(4) 在【位置】框中,选择保存位置“D: \myvc”。(5) 在【解决方案名称】中,保持默认值。(6) 选中【为解决方案创建目录】复选框。(7) 单击【确定】按钮。3) 【欢迎使用MFC应用程序向导】对话框单击【下一步】按钮。4) 【应用程序类型】对话框【应用程序类型】选择【基于对话框】,【项目类型】选择为【MFC标准】,将【使用Unicode库】选项去掉,单击【完成】按钮。2. 删除对话框的所有控件删除对话框上原有的【TODO:在此放置对话框控件】静态文本控件、【确定】和【取消】按钮控件。3. 添加消息映射单击【项目】→【类向导】菜单。在【MFC类向导】对话框中,选择【消息】选项卡,在【消息】列表框中选择WM_LBUTTONDOWN消息,单击【添加处理程序】按钮,如图3.47所示。
图3.47MFC类向导
4. 编写程序代码在【MFC类向导】对话框中,单击【编辑代码】按钮。在voidCHellodialogDlg::OnLButtonDown(UINT nFlags,CPoint point)函数中的“//TODO: 在此添加消息处理程序代码和/或调用默认值”语句后面添加以下程序代码。
void CHellodialogDlg::OnLButtonDown(UINT nFlags,CPointpoint)
{
//TODO: 在此添加消息处理程序代码和/或调用默认值
MessageBox(“您好!”);
CDialogEx::OnLButtonDown(nFlags,point);
}
5. 生成解决方案并运行单击【生成】→【生成解决方案】菜单或按F7键,单击【调试】→【开始执行】菜单或按Ctrl F5键。
这样就完成了一个消息映射过程。程序运行后,在窗口区单击鼠标左键,就会弹出一个消息对话框。查看CHellodialogDlg.cpp程序代码,可以发现: 类向导为WM_LBUTTOMDOWN的消息映射做了以下三个方面内容的改变。(1) 在头文件CHellodialogDlg.h中声明消息处理的函数OnLButtonDown。
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnLButtonDown(UINT nFlags,CPoint point);
DECLARE_MESSAGE_MAP用于声明在源文件中存在的消息映射。(2) 在CHellodialogDlg.cpp源文件添加了相应的映射宏。
BEGIN_MESSAGE_MAP(CHellodialogDlg,CDialogEx)
…
ON_WM_LBUTTONDOWN()
…
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()分别标识消息映射的开始和消息映射的结束。(3) 在CHellodialogDlg.cpp文件中添加一个空的消息处理函数,用户可以填入具体代码。
void CHellodialogDlg::OnLButtonDown(UINT nFlags,CPoint point)
{
//TODO: 在此添加消息处理程序代码和/或调用默认值
CDialogEx::OnLButtonDown(nFlags,point);
}
评论
还没有评论。