基础教程初学者讲课课件_第1页
基础教程初学者讲课课件_第2页
基础教程初学者讲课课件_第3页
基础教程初学者讲课课件_第4页
基础教程初学者讲课课件_第5页
已阅读5页,还剩436页未读 继续免费阅读

下载本文档

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

文档简介

基础教程初学者第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部分。上面依次标题栏、菜单栏和工具栏。中间左侧部分是工作区窗口,右侧部分是编辑区。最下方是输出窗口和状态栏。工作区窗口和输出窗口工作区窗口和输出窗口是在一个程序编译时使用最多的停靠式窗口。工作区窗口中显示了当前程序中的所有类、资源和文件信息。工作区窗口分为3个部分:ClassView(类视图)、ResourceView(资源视图)和FileView(文件视图)。ClassView:显示当前工作区中所有工程定义的C++类。双击某个类名,VisualC++会自动打开这个类的文件,并将编辑区定位到该类的定义处。双击类中的成员函数和变量,编辑区则定位到该成员函数或变量的定义处。工作区窗口和输出窗口ResourceView:显示当前工作区中所有的资源。这些资源包括快捷键、对话框、图标、菜单、字符条编辑器、工具栏和版本信息。双击其中的ID号,会显示相应的资源信息。FileView:显示属于当前工程的所有文件,包括C/C++源文件、头文件、资源文件等。输出窗口与工作区一样,分为多个选择卡。其中最常用的选项卡被放在了最外面,分别为Build、Debug、FindinFiles1和FindinFiles2。工作区窗口和输出窗口Build:Build显示工程在创建中,经过的每一个步骤及相应信息。如果出现编译链接错误,那么出现错误的文件、原因、行号等内容会显示在Build中。双击该错误信息行,编辑区则定位在该错误出现的行。Debug:工程通过编译后,运行调试版本时,Debug选项卡中会显示具体的调试信息。工作区窗口和输出窗口FindinFiles1和FindinFiles2:两个选项卡的作用相同,用于显示从多个文件中查找字符串的结果。当用户想要查看某个函数或变量出现在哪些文件中,单击【Edit】|【FindinFiles】命令,弹出【FindinFiles】对话框,如下图所示。在【FindinFiles】对话框中的【Findwhat】后的编辑框中,输入想要查找的内容,单击【Find】按钮即可。查找到的内容会输出到FindinFiles选项卡中。菜单栏和工具栏菜单栏位于集成开发环境的顶部。菜单栏由9个菜单项组成:File(文件)、Edit(编辑)、View(视图)、Insert(插入)、Project(工程)、Build(编译)、Tools(工具)、Windows(窗口)、Help(帮助)。每一个菜单项都有一个下拉式菜单,其中的菜单项用于完成特定的功能。工具栏位于菜单栏的下面。工具栏可以称作是美化的菜单栏,其由许多按钮构成。其中的按钮用于完成特定的功能。工具栏可以任意拖动,也可以成为一个浮动窗口。编辑区在VisualC++中,编写应用程序代码的位置就是编辑区。该编辑区的功能十分强大,智能化程度也非常高。在编辑区内,除了能编写C/C++语言外,还能编写SQL、HTML和VBScript等其他编程语言。如下图所示。联机帮助VisualC++6.0不像其他集成开发环境一样把帮助系统集成在开发环境内部,而是提供了一个专门为VisualC++设计的MSDN类库。MSDN虽然是一个独立的帮助系统,但却能很好地和VisualC++6.0集成在一起。MSDN的使用方式有以下几种:单击【Help】|【Contents】命令;单击【Help】|【Search】命令;单击【Help】|【Index】命令;按下【F2】键。通过上述几种命令方式,即可运行MSDN。中的文件扩展名

打开程序HelloWorld所在的文件夹,看到该文件夹自动生成了许多扩展名不同的文件,如下图所示。中的文件扩展名

了解这些不同的扩展名文件,对于理解VisualC++6.0如何组织和管理项目文件是很有必要的。有关这些文件扩展名及其说明,如下表所示。第2章MFC与应用程序框架在VisualC++集成开发环境下,使用微软基础类库MFC,可以开发出功能强大的Windows应用程序。另外,通过MFCAppWizard自动生成的MFC应用程序框架,还可以很方便地开发自己想要实现的功能。本章将先介绍有关MFC的基础知识,然后对MFC应用程序框架作具体介绍。2.1微软基础类库MFCMFC是一种重要的编程方法,它是微软公司的特定的应用程序包装接口。本节将讲解MFC概述及其类库结构。概述MFC的英文全称是MicrosoftFoundationClasses,即微软的基础类库。MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库。虽然开发人员要编写的程序在功能上各有不同,但是从结构上讲,都可以化分为对用户界面的设计、对文件的操作、对数据库的访问及对多媒体的使用等一些最主要的方面。这一点正是微软提出MFC类库最重要的原因。在MFC类库中,大约有200个类。在进行程序设计时,只需简单地调用已有的类及类中的方法即可。另外,还可以利用“继承”方法从已有类中派生出自己想要的类。这时,派生出来的类不但拥有父类中的方法和属性,还可以根据自己的需求,自定义一些特殊的属性和方法,使得派生类功能更加强大。MFC有较好的移植性,可应用于众多平台。类库结构MFC中类可划分为基类、应用程序结构类、窗口类、OLE类、数据库类等10大类,而且在其中的一些大类的基础上又派生出许多子类。MFC的类库结构的层次图如下图所示。类库结构从上图中可以看出,CObject是一个原始基类。绝大多数MFC类的最终基类都是CObject。原始基类下面,主要包括以下几种类:MFC应用程序结构类,窗口、对话框和控件类,输出(设备文本)和绘图类,简单数据类型类,数组、列表和映射类,文件和数据库类,Internet和网络类,OLE类以及高度和异常类。MFC的应用程序结构类分为CWinApp和CWinThread。使用MFC创建的每一个应用程序都包含一个由类CWinApp派生而来的应用程序对象。该对象是一个全局对象。应用程序对象主要用于处理应用程序的初始化,同时也处理应用程序事件的消息循环。CCmdTarget和CCmdUI为MFC中常用的有关发送命令的类。CDocument为MFC中常用的应用程序文档的基类。CDocTemplate为文档模版类,通常是应用程序的单文档或多文档的基类。CView类是常用的视图类。2.2MFC应用程序框架分析在前面介绍过如何创建一个基于单文档的应用程序。对于如何选择性地创建基于多文档或是基于对话框的应用程序,将会在后续章节详细介绍。本节主要对MFC应用程序框进行简单的概括,使读者了解MFC应用程序框架的结构与工作机制。入口函数入口函数就是指一个程序的入口点。WinMain函数是Windows程序的入口函数。为了便于讲解,首先要创建一个MFC应用程序,程序名命名为sample0201。具体创建步骤不再详细介绍。从创建好的sample0201程序中,并不能找到WinMain函数。这是因为典型Windows程序的大部分初始化工作都是标准化的,因此把WinMain函数隐藏在应用程序的框架中。当一个程序编译时,会自动将该函数链接到程序中。在计算机中找到VisualC++的安装目录,笔者安装在F盘,则按照下面这个路径依次打开文件夹,“F:\ProgramFiles\MicrosoftVisualStudio\VC98\MFC\SRC”。打开后,会发现一个源文件“WinMain.cpp”。该文件中则定义了MFC应用程序的入口函数AfxWinMain。文件的源代码如下:入口函数…………入口函数当一个应用程序启动时,会自动调用应用程序框架内部的AfxWinMain函数。根据其前缀Afx就知道WinMain是一个全局的MFC函数。从上述代码中可以看出,WinMain函数会查找该应用程序的一个全局构造对象。该对象是由CWinApp的派生类创建,因此有程序启动时,它就被创建好了。然后WinMain对该应用程序进行初始化,在此过程调用的是该程序全局构造对象的InitApplication()和InitInstance()函数。完成初始化后,WinMain调用Run()函数,运行应用程序的消息循环。最后结束应用程序时,WinMain调用AfxWinTerm()函数,做一些清理工作。函数InitInstance()函数的作用是初始化程序。每次启动一个应用程序时,Winmain函数会自动调用InitInstance()函数。打开创建的程序sample0201,在该程序的CSample0201App类中,可以看到该程序对InitInstance()函数进行了重载。该重载代码如下:…………函数从上述代码中可以看出,在ShowWindow和UpdateWindos之前,程序要做两个动作,一个是注册窗口类,另一个是构建窗口类。InitInstance()函数规定了生成的应用程序是基于单文档的、基于多文档的或是基于对话框的。因此在CWinApp中必须重载InitInstance()函数。应用类Run()函数与查找WinMain函数类似,在VisualC++的安装目录下,按照下面这个路径依次打开文件夹,“F:\ProgramFiles\MicrosoftVisualStudio\VC98\MFC\SRC”。打开后,会发现一个源文件“THRDCORE.CPP”。该文件中定义了应用类Run()函数,源代码如下:…………应用类Run()函数从上述代码中可以看出,如果消息队列没有消息,则调用OnIdle()函数,并递增iIdleCount计数标志,该计数标志表示在两次消息处理过程只共调用了多少次OnIdle()函数。bIdle是消息队列空闲的标志,当消息队列有消息时,则调用PumpMessage()函数,进行消息翻译和消息派发。其中PreTranslateMessage(&m_msgCur)对消息进行翻译,DispatchMessage(&m_msgCur)把消息m_madCur发送到应用程序主框架窗口。注意:在应用程序sample0201的CSample0201App的Run函数继承了CWinApp的虚函数Run()。而CWinApp的Run()函数调用了CWinThread的Run()函数。消息映射表当MFC应用程序类中的Run()函数把消息交给主窗口的窗口函数后,窗口函数将如何处理这些消息。在Win32程序中,处理窗口消息的窗口函数WinProc()函数通过switch~case结构对消息进行判断并分别进行处理。但在MFC应用程序的主窗口类对消息的处理并没有沿袭Win32程序的做法。MFC应用程序中进行消息处理,是为每一个要处理的消息添加一个消息处理函数。这种定义消息和消息处理函数的对照表,称为消息映射表。MFC的消息映射表采用映射宏的方式,将消息和消息处理函数一一对应起来。以应用程序的主框架为例,在类的声明文件MainFrame.h中添加声明消息映射的宏。消息映射表在类的实现文件MainFrame.cpp中,添加消息映射宏的定义语句。其中,ID_MY_MESSAGE为自定义的菜单项命令ID号,OnMymessage()为响应菜单命令的成员函数。消息分类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++中的数据及其所属的数据类型。变量变量是一种特殊的标识符,在变量中可以存储数据。变量中存储的数据可以根据程序的需要而改变,因此称为变量。1.定义变量在C++中,使用一个变量必须先定义该变量。C++中定义变量的语法代码如下:定义一个变量需要说明两点,一是变量的类型,二是变量的名称。其中,变量的类型是C++中的数据类型。变量名是用户为变量起的名称。变量C++的变量名由字符及数字等组成。变量名必须满足以下几个条件。变量名只能由字母、数字和下划线(_)组成。变量名必须以字母或下划线开头。变量名不能包含空白字符(换行符、空格和制表符称为空白字符)。变量名不能与保留字名相同。变量名区分大小写。变量2.变量赋值如果想要使用一个变量,就要为其进行赋值。如果没有对定义的变量赋值,VisualC++会为该变量默认一个值。例如,如果是一个int类型的变量且没有赋值,VisualC++将默认其值为0。C++中为变量赋值的方法有两种:一种是在定义变量的同时赋值,另一种是在定义变量后赋值。在定义变量的同时赋值,代码如下:在定义变量后赋值,代码如下:.常量常量与变量相反,是一个不随时间和程序变化而变化的值。C++中,常量的命名规则和变量的大体相同。不同的是,常量名称中的字母都为大写。C++中定义符号常量的语法代码如下:例如,在计算圆形面积的时候,经常用到PI。为了避免重复地输入PI的实际取值,而用下面的形式声明PI的取值。这样,在程序中编译时,会将程序中出现的所有字符串PI全部置换成3.14。如果想要修改程序中PI的值,只需在头文件处修改,全部PI的取值都会发生变化。.常量C++中定义静态常量的语法代码如下:在C++中,同声符号常量一样,在声明静态常量时,也要对其进行初始化,代码如下:注意:在符号常量中,PI没有类型,不占有存储单元,且容易出错。而在Const常量中,PI有数据类型,并且占有存储单元,有地址,因此可以使用指针指向它。3.3C++的运算符及表达式运算符和表达式是一种程序语言的基础。运算符的作用是操作变量或表达式。C++中的运算符包括赋值运算符、算术运算符、逻辑运算符、关系运算符、位运算符、逗号运算符、条件运算符等。本节将介绍这些运算符及其所组成的表达式。表达式表达式是C++程序中不可缺少的一部分。表达式是由运算符、操作数(变量、常量或函数等)和标点符号,按照一定规则组成的一个有意义的语句。例如:运算符C++中的运算符就是一种符号,该符号可以用于处理数据。平时有数学计算中所使用的“+”、“-”、“×”、“÷”都属于运算符。只是这些运算符在C++中的表现形式可能与日常生活中有所不同。下面将对C++中的运算符作具体介绍。1.赋值运算符赋值运算符是用于为变量或常量指定数值的运算体符。其操作符号为“=”,示例代码如下:上述表达式的意义是,把b的值赋值给a。其中,b可以是一个单纯的变量,也可以是一个表达式。运算符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。运算符4.关系运算符关系运算符,即用于比较两个数据关系大小的运算符,并根据比较的结果返回一个逻辑值。关系运算符包括大于运算符(>)、大于等于运算符(>=)、小于运算符(<)、小于等于运算符(<=)、等于运算符(==)以及不等于运算符(!=)。5.条件运算符条件运算符,即用于条件判断的运算符。其构成的表达式格式为:其中,如果表达式1的值为非0,则执行表达式2;如果表达式1的值为0,则执行表达式3。运算符6.特殊运算符C++中还提供了一些特殊的运算符,如++、--、+=、-=等。3.4C++的语句控制C++中的控制语句主要用于完成分支结构程序和循环结构程序的控制。其主要包括以下9个控制语句:if~else语句、switch语句、for语句、while语句、do~while语句、continue语句、break语句、goto语句和return语句。但在介绍这些控制语句之前,首先介绍一下输入输出语句。的输入输出C++中除了可以使用C语言中的scanf和printf函数进行输入输出外,还提供了标准的输入输出流。例如,从键盘输入时需要用到输入流,在显示器上面显示信息需要输出流。其中,cin代表输入流,cout代表输出流。它们是在头文件iostream中定义的。因此,在使用输入输出流的时候,需要引入iostream头文件。的输入输出1.输入语句C++的输入语句用cin表示。其中,cin必须和“>>”一起使用。使用cin的语法代码如下:例如,想要从键盘输入一些数据,将使用下述代码:如果想要一次性输入多个数据,不是使用逗号作为分隔符,而应该用“>>”分隔,应该写成:的输入输出2.输出语句C++的输出语句用cout表示。其中,cout必须和“<<”一起使用,使用cout的语法代码如下:例如,想要从键盘输出一些数据,将使用下述代码:如果想要一次性的输出多个数据,同样不是使用逗号作为分隔符,而是每项数据之间用“<<”分隔,如上述代码所示。注意:在C++中,可以不用“\n”控件换行,可以使用“endl”进行换行。因为在头文件iostream中定义endl(endofline)代表回车换行,其作用与“\n”相同。选择语句选择语句也称分支语句,即根据不同的条件执行不同的语句。在C++中,主要的选择语句有if语句和switch语句。1.if语句if语句有三种基本结构。(1)第一种基本结构的语法如下:执行该if语句时,首先判断表达式是否正确。如果正确,则执行语句1。如果不正确,则不执行任何操作,执行if语句后的其他语句。该语句流程如右图所示。选择语句(2)第二种基本结构的语法如下:执行该if语句时,首先判断表达式结果是否为真。如果判断结果为真,则执行语句1。如果判断结果为假,则执行语句2。该语句流程如右图所示。选择语句(3)第三种基本结构的语法如下:执行该if语句时,首先对表达式1进行判断。如果判断结果为真,则执行语句1。如果判断结果为假,则对表达式2进行判断。如果表达式2的判断结果为真,则执行语句2。否则,执行语句3。该语句的流程图如右图所示。选择语句2.switch语句C++中的另外一种选择语句是switch语句,其语法如下:该语句的流程图如右图所示。循环语句在编写程序的过程中,经常会遇到一些许多有规律性的重复操作,则在程序中需要重复执行这些语句。为此,C++中提供了循环语句,可使代码大大简化。循环语句包括循环条件和循环体两部。C++中的循环语句包括for语句、while语句和do~while语句。1.for语句for语句是使用最频繁并且最灵活的循环语句。其语法代码如下:其中,表达式1通常用于为循环变量赋初值,表达式2为循环条件,表达式3用于循环变量的递增或是递减,使得循环趋于结束。循环语句for语句的执行过程如下:(1)初始化表达式。(2)执行循环表达式。如果不满足条件,则跳出循环语句。(3)如果满足条件,则执行语句块(循环体)。(4)循环变量递增或递减。(5)返回步骤(2)。(6)循环结束,执行for语句下的语句。for语句的流程图如右图所示。循环语句2.while语句while语句用于“当满足某一条件时进入循环”的情况,其语法代码如下:while语句的执行过程如下:(1)判断循环条件。(2)表达式如果为真,则进入循环体。否则,进入步骤(4)。(3)执行循环体表达式。(4)循环结束,执行while语句下的语句。while语句的流程图如右图所示。循环语句3.do~while语句do~while语句和while语句类似,其语句代码如下:do~while语句的执行过程如下:(1)执行循环体语句块。(2)判断循环条件。如果满足条件,返回步骤(1)。否则,执行步骤(3)。(3)退出do~while语句。do~while语句的流程图如右图所示。循环语句从上述代码中可以看出,while语句和do~while语句的区别:(1)从结构上看,while语句的循环条件在前,循环体语句块在后。而do~while语句的循环体语句块在前,循环条件在后。(2)while语句的循环条件后没有分号,而do~while语句的循环条件后有分号,且不能省略。(3)从执行流程上看,while语句如是不满足循环条件,会直接跳过该循环。而do~while语句是无条件地执行一次循环体语句块。其他语句在循环语句中,经常用到一些语句,如break、continue和goto语句等。下面对这些语句做简单介绍。1.continue语句continue语句是跳过循环体中剩余的语句而强制执行下一次循环。其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。continue语句只能用于循环语句中,通常与if语句配合使用。2.break语句当程序运行到break语句时,立即结束break语句所在的整个循环,转向循环语句下面的语句继续执行。3.goto语句goto语句为无条件转向语句,通常与条件语句配合使用。但其易使程序流程混乱,一般不建议使用。所以在此不过多介绍。第4章C++的面向对象面向对象技术是当今软件开发的主流,很多开发人员都转向使用面向对象的语言进行编程。而C++也是面向对象程序设计语言的一种。本章将依次讲解C++中的类与对象。内容包括类与对象、类的继承与派生、类的多态性等。通过本章学习,读者能够熟练掌握面向对象的思想,并能将这种思想融入到代码中。4.1类与对象客观世界中,任何一个事物都可以看成是一个对象(Object)。在C++中,对象的类型被称为类(class)。本节将具体介绍类与对象的相关概念与使用。面向对象思想面向对象的思想和面向过程的思想是相对的。面向过程的程序,详细地描述了每一时刻的数据结构及对其的操作过程。而面向对象的程序,将一个个小的操作封装成对象。在以后的编写中,只需调用对象即可。面向对象的程序有三大特性:封装性、继承性与多态性。面向对象思想1.封装性所谓的封装性,有着两方面的含义:一是将基本数据和对此数据进行操作的过程和函数结合起来,形成一个对象,各个对象之间相互独立,互不干扰。二是对象将对外界公开的是一个界面,将具体的细节隐藏起来,保证了数据的安全性。2.继承性继承性是面向对象程序设计中最重要的机制。通过继承机制,可以方便地利用一个已有的类(父类)建立一个新的类(子类)。新类不但可以继承已有类的属性和方法,还可以拥有自己特有的方法。3.多态性所谓多态性是当不同的对象收到相同的消息时产生不同的动作。多态性是面向对象程序设计的一个重要特征,其增加了程序的灵活性。类的声明类是具有相同属性和相同方法的对象的集合。类由类头(classhead)和类体(classbody)组成。类头由关键字class和类名组成。类体是指花括号({})中的内容。类体由数据成员和成员函数组成。需要注意提,类的声明以分号结束。声明类的一般形式为:类的声明其中,关键字private、public和protected称为成员访问限定符。用这些访问限定符来声明各成员的访问属性。private:只能在本类中访问,在类外不能访问。public:既能在本类中访问,又能在类外通过该类的对象进行访问。protected:与private类似,不能被类外访问,但能被派生类的成员函数访问。说明:如果在类的声明中没有使用关键字,则系统将数据成员和函数默认为是私有的。成员函数的定义在C++中,定义成员函数可以在类中定义,也可以在类外定义。如例4-1所示,display()是在类中进行声明并且定义。而GetName()和GetAge()只是在类中有声明,并没有进行定义。这种函数的定义代码如下:则在Student类中,函数GetName()和GetAge()的定义如下:类与对象的关系在现实生活中,每一个实体事物都可以作为一个对象。例如,一部手机、一支铅笔、一本书等。但是有些对象是有着相似性的。在C++中,将这些有着相似的对象归为一类(class)。类是对象的抽象,而对象是类的实例。在编写程序时,应该先声明一个类,再去实例化若干个同类型的对象。在一个类中,类的属性指的是类的数据成员,类的行为指的是类的方法。对象的声明和实例化类是一个抽象的概念,因此在程序中不能直接引用。而是将其实例化成为对象后,通过这个对象来对类进行相关的操作。对象的声明有3种方法。1.先声明类类型,后定义对象这种声明的语法代码如下:用这种方式为Student类声明对象:如果想要一次性为某个类声明多个对象,可以用逗号作为分隔符。2.在声明类的同时声明对象这种声明的语法代码如下:用这种方式为Student类声明对象:如果想要一次性为某个类声明多个对象,可以用逗号作为分隔符。3.不出现类名,直接声明对象这种声明的语法代码如下:如果想要一次性为某个类声明多个对象,可以用逗号作为分隔符。用这种方式为类声明对象:在声明对象之后,可以调用类中的方法。例如,stu1为Student类的一个对象,使用该对象对Student类中的数据成员和函数进行调用。代码如下:构造函数和析构函数下面介绍C++中两个特殊的函数:构造函数和析构函数。1.构造函数当声明一个类的属性时,可以不对其进行初始化,因为在C++中有专门的初始化函数对该属性进行初始化。这个专门用来处理对象的初始化的函数就是构造函数。构造函数是一种特殊的函数。其作用是在完成对象的初始化的同时,将对象的属性初始化。构造函数不需要用户自己来调用它,在创建对象时,由系统自动调用。定义构造函数的语法代码如下:构造函数和析构函数构造函数的特点如下所述。构造函数名与类名相同。构造函数不能指定返回值类型。构造函数可以有参数,也可以没有参数。构造函数不能被程序显示调用,只能由系统自动调用。每个类都必须有一个构造函数。如果在声明一个类时没有给出构造函数的定义,则系统会为该类自动添加一个默认的构造函数。该构造函数的参数列表为空,函数体也为空。类中各属性的值被指定为所属类型的默认值。构造函数可以重载(有关重载的概念,会在4.2节进行介绍)。也就是说,一个类可以有多个参数不同的构造函数。注意:当用户为声明的类添加一个自定义的构造函数时,系统则不再为程序添加默认的构造函数。构造函数和析构函数2.析构函数当一个对象的生命周期结束时,应当去释放该对象所占用的内存空间。这时,系统会自动调用析构函数来进行一些清理工作。定义析构函数的语法代码如下:析构函数的特点如下所述。析构函数不允许有返回值。析构函数不允许有参数。一个类中有且只有一个析构函数。因此,析构函数不能重载。对于一个对象来说,析构函数是最后一个被调用的函数。4.2C++类的继承和派生类的继承是指新的类从已有类中获得已有的特性,例如,数据成员、成员函数等。而从已有类产生新类的过程就称为派生。其中,已有类称为基类或父类,新的类称为派生类或子类。本节将具体绍有关继承与派生的有关知识。派生类的声明派生类可以将基类中的已有的特性继承下来,也可以添加一些自己特有的新特性。声明派生类的语法代码如下:从上述代码中可以看出,派生类Student不仅从基类Student中继承了Student类已有的数据成员和成员函数,还新添加了一些自己的数据成员和成员函数。另外,本例中采用的是公有继承。派生类的继承方式一个类中,其成员的访问权限有public、private和protected之分。而类的继承方式也有三种:公有继承、私有继承和受保护继承。1.公有继承在声明一个派生类时,将继承方式设为public,则该种继承方式称为公有继承。使用公有继承方式派生出来的类称为公有派生类,其基类称为公有基类。采用公有方式继承时,基类的公有成员和受保护的成员在派生类中是可以引用的,而其私有成员则不能在派生类中引用。有关公有继承中成员的访问权限如下表所示。2.私有继承在声明一个派生类时,将继承方式设为private,则该种继承方式称为私有继承。使用私有继承方式派生出来的类称为私有派生类,其基类称为私有基类。采用私有方式继承时,基类的公有成员和受保护的成员在派生类中相当于是私有成员。而其私有成员不能在派生类中引用。有关私有继承中成员的访问权限如下表所示。3.受保护继承在声明一个派生类时,将继承方式设为protected,则该种继承方式称为受保护继承。使用受保护继承方式派生出来的类称为受保护派生类,其基类称为受保护基类。采用受保护方式继承时,基类的公有成员和受保护成员在派生类中相当于是受保护成员。而其私有成员不能在派生类中引用。有关受保护继承中成员的访问权限如下表所示。单一继承和多重继承在C++中,继承分为两种:单一继承和多重继承。1.单一继承一个基类只能由一个派生类来继承,这种继承方式称为单一继承。单一继承关系所形成的是一种树形结构,如下图所示。单一继承和多重继承2.多重继承一个派生类不仅只能拥有一个基类,还可以拥有多个基类,这种继承方式称为多重继承。基于多重继承方式的派生类,同时拥有了多个基类的特性。多重继承的关系如下图所示。如果已经声明了类A、类B和类C,而类D想要同时成为A、B、C三个类的派生类,即类D是多重继承的派生类。代码如下:4.3C++的多态性在面向对象的程序中,多态性是一个非常重要的概念。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态的分类C++中的多态性是指同一个函数名称对应着功能类似的多个函数。这些函数执行不同但是功能类似的操作,从而实现了“一个接口,多种方法”。C++中的多态性分为两种:静态多态性和动态多态性。静态多态性是指在编译程序时,系统就能确定所调用的是哪一个函数。因此,静态多态性又称编译时多态性。静态多态性是通过函数重载和运算符重载实现的。动态多态性是指在程序运行的过程中才能动态地确定调用哪一个函数。因此,动态多态性又称运行时多态性。动态多态性是通过继承和虚函数实现的。运算符重载所谓重载,就是对一个事物赋予新的含义。而运算符重载,就是对已有的运算符进行重新定义,赋予其另外一种功能,以适应不同的数据类型。运算符重载的语法代码如下:在C++中,有关重载运算符的规则如下:只能对C++中已有的运算符进行重载。并不是C++中的所有运算符都能进行重载,运算符“.”、“::”、“?:”等不能重载。重载运算符不能改变操作数的个数。重载运算符不能改变运算符的优先级。重载运算符不能改变运算符的结合性。重载运算符不能使用默认参数。虚函数虚函数是指在派生类中定义与基类同名的函数,但基类中的该函数前有virtual修饰。声明虚函数的语法代码如下:在C++中,当一个成员函数被声明为虚函数后,其派生类中的同名函数将自动成为虚函数。因此,在派生类中重新声明该虚函数时,virtual可以不加。但为了使程序看起来清晰,一般在派生类中也加上virtual。纯虚函数在某些特殊情况下,需要使用纯虚函数。例如,有一个动物类,其中有一个名为睡觉的函数。而各种动物的睡觉方式是不同的。此时,可以将动物类中的睡觉函数声明为纯虚函数,而该动物类则成为了抽象类。声明纯虚函数的语法代码如下:纯虚函数没有函数体。语法代码后面的“=0”不是代表该函数的返回值为0。此种表达方式仅仅是通知系统,这是一个纯虚函数。有些类不用来定义对象,而只是作为一个基类去派生新的类,这种类称为抽象类。在抽象类中,可以使用纯虚函数。第5章菜单栏、工具栏和状态栏菜单栏、工具栏和状态栏是窗口界面的重要组成部分。三者是用户与应用程序交互的桥梁。合理地使用这三者,可以让用户更好地使用软件,提高用户体验度。本章将依次讲解在VisualC++中如何构建菜单栏、工具栏和状态栏。内容包括菜单的分类、使用下拉式菜单、使用弹出式菜单、编辑工具栏按钮、修改默认的工具栏等。通过本章的学习,读者会熟练地使用菜单栏、工具栏以及状态栏,并且可以根据自己的想法,设计出一个漂亮的窗口。5.1菜单的分类菜单栏一般位于应用程序窗口的顶部,如下图所示。菜单是用于显示一组选项(即菜单项)的下拉窗口,用户可以从这些菜单项中进行选择。在Windows窗口中,菜单分为两种:下拉式菜单和弹出式菜单(又称为上下文菜单)。5.1菜单的分类1.下拉式菜单一般情况下,在应用程序窗口顶部的菜单栏中,选择菜单中的某个选项,就会显示一个下拉式菜单。在上图所示的窗口中,当用户选择菜单栏中的某一选项(如文件)时,就会显示一个下拉菜单。下图中的左图所示的菜单即为一个下拉式菜单。2.弹出式菜单一般情况下,右击应用程序窗口中的空白处,就会显示一个弹出式菜单。该菜单处于自由浮动状态。下图中的右图所示的菜单即为一个弹出式菜单。5.2使用下拉式菜单在VisualC++中,当创建的基于单文档或多文档的程序时,提供了一个默认的菜单栏。它包括文件、编辑、查看、窗口和帮助等菜单项。但是当创建一个基于对话框的工程时,VisualC++将不会为其提供菜单栏。本节将使用菜单编辑器定义一个自己的菜单栏,并将其添加到基于对话框的工程中。移动和删除菜单项如果在添加了某个菜单项后,有时觉得某些位置可能不合适。如果想要移动的是菜单栏上的菜单项,则可以直接选择想要移动的菜单项,将其进行左右拖动,放到预期的位置即可,如下图中的左图所示。如果想要移动的是下拉式菜单里的菜单项,则可以直接选择要移动的菜单项,将其进行上下拖动,放到预期的位置即可,如下图中的右图所示。如果想要删除某个菜单项,只需选择要删除的菜单项,按下【Delete】键即可。启用和禁用菜单项如果一个新的菜单没有添加命令处理函数,应用程序会自动将其禁用。要启用这个菜单项,使用ClassWizard为其添加一个命令处理函数即可。但是如果想要根据应用程序,有选择的启用和禁用某个菜单项,可以用ClassWizard添加一个界面消息处理函数。标记菜单项如果想要给一个菜单项添加选中标记,同样可以使用ClassWizard添加的界面消息处理函数。在处理函数中添加如下代码。如果m_nCheck为TRUE,则菜单项前有一个选中标记“√”。如果m_nCheck为FALSE,则菜单项前没有选中标记“√”。添加快捷键在使用菜单命令时,不仅可以使用鼠标进行选择,也可以使用快捷键。例如,经常使用的复制操作可以使用【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工具栏的使用工具栏是一个显示位图式按钮行的控制条,按工具栏上的按钮,相当于选择菜单栏上的菜单项,可以执行相应的命令操作。工具栏一般位于窗口客户区菜单栏的下面,其也可以作为一个浮动的小窗口,任由鼠标拖动。移动和删除工具栏按钮如果想要移动某个工具栏按钮,可以将其选中,然后进行左右拖动,将其放到预期的位置上即可。如果想要删除某个工具栏按钮,不能直接按下【Delete】键,这样做只能删除该按钮上的位图。要想真正地删除工具栏上的按钮,将其选中并拖到工具栏之外,释放鼠标即可。添加按钮消息响应函数在为按钮添加完位图之后,运行程序时,工具栏上新添加的按钮处于灰色状态,即不可用状态。要想使用该按钮,就要为其添加消息响应函数。5.5状态栏的使用状态栏位于应用程序窗口的底部,可以随时为用户提供当前应用程序的状态信息,其既不接收输入消息,也不产生命令消息。状态栏概述当使用MFCAppWizard创建一个基于单文档的程序时,在应用向导的【MFCAppWizard-step4】选对话框中,默认选择了【Initialstatusbar】选项,如图5.25所示。那么,在生成的应用程序中,就自动添加了一个工具栏,图示可以参考程序sample0501的运行结果。默认的状态栏大体分为2个部分:提示信息窗格和指示器信息窗格。而指示器信息窗格又由3部分构成,其分别用于显示CapsLock、NumLockt和ScrollLock键的状态。修改默认的状态栏如果想要添加一个信息提示器到状态栏中,首先必须要在字符串表编辑器保存状态栏中符合条件时显示的文本。然后,使用文本编辑器添加一行代码到CMainFrame类中,通知CStatusBar类创建了一个新的指示器。第6章对话框对话框是Windows程序的一种资源。使用对话框上的各种控件,可以实现相应的功能,提供了人机交互性能。本章将依次讲解对话框中的模态对话框和非模态对话框。另外,还对通用对话框进行了介绍。通过本章的学习,读者可以熟练地使用对话框资源,从而设计出各式各样的对话框。6.1消息对话框消息对话框是最常用的对话框。消息对话框是通过函数MessageBox实现的,其函数原型如下:hWnd:表示拥有该消息对话框的父级窗口。如果为NULL,则表示该消息对话框没有窗口。lptText:表示用于指向将被显示的字符串的指针。lpCaption:表示用于指向该消息对话框标题的字符串的指针。UType:表示该消息对话框的风格。6.1消息对话框其中,UType由显示图标和按钮类型组成。两个类型的参数之间用“|”分隔。图标的种类及其对应的参数如下表所示。按钮类型及其对应的参数如下表所示。6.1消息对话框【示例6-1】平时在使用计算机时,当修改某些设置后,会弹出一些对话框,让用户确定是否真的修改。则该消息对话框的设计代码如下:运行结果如右图所示。从上图中可以看出,该消息对话框中,默认选中了【是】按钮。该默认按钮可以进行设置,如下表所示。6.1消息对话框例如,将上述代码改成如下代码:则运行结果如下图所示。6.2对话框的创建与使用前面只是介绍过如何创建一个基于对话框图的工程,下面将介绍如何创建一个新的对话框,以及如何使用对话框。对话框的分类对话框分为两种:模态对话框和非模态对话框。1.模态对话框当一个模态对话框工作时,其他窗口将失去输入焦点。只有当该模态对话框关闭后,用户才能对其他窗口进行操作。例如,MicrosoftWord中对图片进行操作时的【题注】对话框、【设置图片格式】对话框和【插入超链接】对话框都是模态对话框,如下图所示。2.非模态对话框而非模态对话框与模态对话框相反。当其工作时,点击其他窗口,被点击的窗口可以获得输入焦点。例如,MicrosoftWord中常用的【查找和替换】对话框,就是非模态对话框。2.非模态对话框模态对话框与非模态对话框的区别:(1)模态对话框由CDialog::DoModal函数创建,而非模态对话框由CDialog::Create函数来创建。(2)CDialog::DoModal函数负责显示其所创建的模态对话框,而非模态对话框需要调用CDialog::ShowWindow函数来显示对话框。(3)CDialog::DoModal函数负责销毁其所创建的模态对话框,而非模态对话框必须调用CWnd::DestoryWindow函数来关闭对话框。创建模态对话框在前面的章节中,已经介绍过如何创建一个基于对话框的工程。下面将创建一个基于单文档的工程,并为其添加一个模态对话框。这个过程大致分为4个部分:创建模态对话框、创建对话框类、向程序中添加代码、添加消息响应函数。6.3非模态对话框创建非模态对话框与创建模态对话框的方式不同。模态对话框通过DoModal()函数来创建,而非模态对话框通过Create()函数来创建。非模态对话框的一个重要作用就是在传递数据。也就是说,将非模态对话框中的数据及时的反应到其他窗口。下面通过实例向读者介绍如何创建与使用非模态对话框。6.4通用对话框通用对话框是指在Windows程序中有着特定功能的对话框。用户不必设计这类对话框,因为Windows系统本身提供了支持这类对话框的函数。通过调用这些函数,可以启动标准对话框来进行文件的打开和保存、搜索和替换、颜色选择、字体选择以及打印。文件对话框文件对话框(CFileDialog)可以实现Windows标准的打开和保存文件。也就是说,文件对话框包括两种:【打开】对话框,用于打开文件,如左图所示;【保存】对话框,用于保存文件,如右图所示。文件对话框CFileDialog类的构造函数原型如下:其中各参数解释如下。bOpenFileDialog:表示文件对话框的类型。如果为TRUE,则为【打开】对话框。如果为FALSE,则为【保存】对话框。lpszDefExt:表示默认文件的扩展名。lpszFileName:表示文件名。dwFlags:表示文件操作标记。文件对话框lpszFilter:表示过滤器。所谓过滤器就是一个限定字符串,对参数进行限制。pParentWnd:表示父窗口指针。CFileDialog类提供了许多用于获取文件信息的函数。GetPathName():用于获取所选文件的完整路径。GetFileName():用于获取所选文件名。GetFileExt():用于获取所选文件的扩展名。GetFileTitle():用于获取所选文件的标题名。颜色对话框颜色对话框(CColorDialog)是帮助用户设置颜色,如下图所示。CColorDialog类的构造函数原型如下:颜色对话框其中各参数解释如下。clrInit:表示默认选择的颜色。dwFlags:表示颜色选择标记。pParentWnd:表示父窗口指针。CColorDialog类提供了许多用于获取颜色信息的函数。GetColor():用于获取当前选择的颜色。GetSavedCustomColors():用于获取所选择的颜色。SetCurrentColor():用于设置当前的颜色。OnColorOK():用于验证输入对话框的颜色。字体对话框字体对话框(CFontDialog)用于字体的设置,如下图所示。CFontDialog类的构造函数原型如下:字体对话框其中各参数解释如下。lplfInitial:用于初始化对话框中的字体设置。dwFlags:表示该对话框的风格。pdcPrinter:表示一个打印机的对象。pParentWnd:表示父窗口指针。CFontDialog类提供了许多用于获取字体信息的函数。GetCurrentFont():用于获取所选文字的属性。GetFaceName():用于获取所选文字的字体名称。GetSize():用于获取所选文字的大小。GetColor():用于获取所选文字的颜色。GetWeight():用于获取所选文字的磅值。IsUnderline():用于获取所选文字是否有下画线。IsBold():用于获取所选文字是否为粗体。IsItalic():用于获取所选文字是否为斜体。查找和替换对话框查找和替换对话框是CFindReplaceDialog类实现的。这两个对话框是通用对话框中比较特殊的两个,因为它们是非模态对话框。【查找】对话框如图6.27所示,【查找/替换】对话框如下图所示。查找和替换对话框作为非模态对话框,必须用new操作符分配存储空间,再用Create()函数进行初始化,最后用ShowWindow()函数显示对话框。CFindReplaceDialog类中Create函数的原型如下:查找和替换对话框其中各参数解释如下。bFindDialogOnly:表示对话框的类型。如果该值为TRUE,表示【查找】对话框。如果为FALSE,则为【查找/替换】对话框。LpszFindWhat:表示要查找的字符串。LpszReplaceWhat:表示用于替换的字符串。DwFlag:标志位,用于设置对话框。它由一个或多个标志组成。PParentWnd:表示父窗口指针。CFindReplaceDialog类提供了许多用于获取查找替换信息的函数。FindNext:查找下一个匹配的字符串。GetFindString:返回查找到的字符串。GetReplaceString:返回替换的字符串。ReplaceAll:确定是否全部替换。ReplaceCurrent:确定是否替换当前字符串。SearchDown:确定是否向下查找。打印对话框打印对话框(CPrintDialog)有两种功能。它既可以实现Windows标准的【打印】对话框,如左图所示,还可以实现【打印设置】对话框,如右图所示。打印对话框CPrintDialog类的构造函数原型如下:其中各参数解释如下。bPrintSetupOnly:表示是否带设置对话框。如果为TRUE,则创建的是【打印】对话框。如果为FALSE,则创建的是【打印设置】对话框。dwFlags:用于设置对话框标记。pParentWnd:表示父窗口指针。打印对话框CPrintDialog类提供了许多用于获取打印信息的函数。GetCopies:用于获取对话框设置打印的份数。GetDefaults:返回打印机默认的设置。GetFormPage:返回打印范围的起始页面。GetToPage:返回打印范围的终止页面。GetPrinterDC:返回所选打印设备的HDC设备句柄。PrintAll:确定是否打印全部内容。PrintRange:确定是否打印指定范围的页面。PrintSelection:确定是否打印当前选择的部分页面。第7章控件在Windows应用程序中,控件也是人机交互的一个重要角色。例如,对话框中的按钮、下拉列表框、编辑框等都是控件。在VisualC++中,MFC提供了许多控件类。通过这些封装好的控件类,用户可以方便地创建和使用控件。本章将依次讲解Windows中常用的标准控件。通过本章的学习,读者可以熟练地为对话框添加和使用控件。7.1VisualC++中的标准控件

Windows操作系统有着大量的标准控件,控件随处可见。读者可以任意打开一个窗口或是对话框,可以看到各式各样的控件。控件概述VisualC++提供了许多常用的标准控件,如下表所示。创建控件在VisualC++中,创建控件有两种方法:一种是静态创建,另一种是动态创建。静态创建:所谓静态创建就是在对话框模板中利用控件工具栏,直接将控件拖动到对话框上。然后通过ClassWizard为控件添加变量、消息响应函数。动态创建:所谓动态创建,就是在编写代码时,利用控件对应的控件类构造一个控件对象,然后调用Create()函数来创建该控件。说明:静态创建控件是常用的创建控件的方法。本章示例都是采用这种方法。下面通过一个示例,向读者介绍如何创建控件。7.2按钮控件按钮控件可以说是最常用的控件。从表中可以看出,按钮分为三类:下压式按钮、单行按钮、复选框。下面分别对这几种按钮进行介绍。单选按钮单选按钮由一个圆形按钮和一个静态文本框组成。单选按钮可以有选中和未选中两种状态。当单击它时,会在中间显示一个小黑点,否则为空。单选按钮经常是成组出现的,但一次仅可以选择一组中的一个单选按钮。复选框复选框由一个方框标记和一个静态文本框组成。同单选按钮一样,复选框也可以有选中和未选中两种状态。当单击它时,会在中间一个对号,否则为空。复选框可以单个出现,也可以成组出现。当复选框成组出现时,可以选择一个或多个复选框。7.3静态控件静态控件与编辑控件都可以显示文本信息,但静态控件一般不接受用户的输入,而编辑控件允许用户进行输入操作。在控件工具栏中,静态文本(StaticText)、图片(Picture)和分组框(GroupBox)都是静态控件。这些静态控件可以用来显示静态的文本信息、图片及位图信息。静态文本静态文本控件在一般情况下,仅仅用于显示一些文本信息。其通常与编辑框一同使用。例如,在设计一个用户登录对话框时,需要将静态文本和编辑框结合使用,如下图所示。图片在应用程序中适当地引入一些图片,会增加程序的美观性。这时,可以使用图片控件。分组框分组框又称选择组,其通常包含一些单选按钮和复选框的组合,如下图所示。其使用方法和静态文本有些类似,因此有关分组框的其他用法,在此不再具体介绍。7.4列表框控件与组合框控件列表框控件从表面上看起来像是一个拉大的编辑框。其实,列表框控件的作用和组合框控件的作用是类似的,就是供用户选择信息。下面对这两种控件分别进行介绍。列表框(ListBox)列表框中的内容通常是一系列的供用户选择的信息选项。当用户从中进行选择时,可以选择其中的一项,也可以选择多项。列表框的风格属性是通过其属性对话框中Styles进行设置的,其属性对话框如下图所示。列表框(ListBox)【Styles】选择卡中各属性的含义如下表所示。列表框(ListBox)列表框对应的MFC类为CListBox类。CListBox类封装了对列表控件进行的各种操作。其中,常用的操作如下表所示。组合框(ComboBox)组合框是一个很简单的控件,它实际上是其他控件的一个集合。从表面上面,组合框是由一个编辑框和一个下拉列表框组合而成。用户可以从组合框预定义的列表中进行选择,也可以从编辑框中进行输入。组合框如左图中的主题所示。列表框的风格可以通过其属性对话框中的【Styles】选择卡进行设置。列表框的属性对话框如右图所示。组合框(ComboBox)【Styles】选择卡常用属性及其含义如下表所示。组合框(ComboBox)在使用组合框控件时,可以直接在【Data】选择卡中为其添加选项。注意:当填写完一个选项,需要按下【Ctrl+Enter】键,再填写另一下选项。组合框对应的MFC类为CComboBox类。CComboBox类封装了对组合框控件进行的各种操作。如果想要为组合框动态的添加选项,可以使用AddString()函数。AddString()函数的原型如下:intAddString(LPCTSTRlpszString);如果想要全部清除组合框中的内容,可以使用ResetContent()函数。ResetContent()函数的原型如下:voidResetContent();在组合框的使用中,最常用的操作就是获取当前选项的内容。该操作需要用到以下几个函数。GetDlogItem():获取组合框的指针。GetCurSel():获取组合框当前选项的索引值。GetLBText():获取组合框当前选项的字符串。7.5树形控件与列表视图控件树形控件(TreeControl)通常与列表视图控件(ListControl)结合使用。二者通过不同的方式向使用者显示信息。下面对这两个控件进行详细介绍。树形控件树形控件(TreeControl)用于显示具有层次结构的数据。该控件有一个根结点(Root),根结点下面有许多子结点。每个子结点又可以作为父结点拥有自己的子结点。树形控件的风格可以通过其属性对话框的【Styles】和【MoreStyles】选项卡进行设置。树形控件的属性对话框如下图所示。树形控件【Styles】和【MoreStyles】选择卡常用属性及其含义如下表所示。树形控件树形控件对应的MFC类为CTreeCtrl。CTreeCtrl类封装了对树形控件的大量操作。如果想要获取一个树形控件中的选项的项目,可以使用GetCount()函数。GetCount()函数的原型如下:UINTGetCount()const;如果想要查看一个结点是否存在子结点,可以使用ItemHasChildren()函数。ItemHasChildren()函数的原型如下:BoolItemHasChildren(HTREEITEMhItem);如果想要获取一个树形控件指定项的子项,可以使用GetChildItem()函数。GetChildItem()函数的原型如下:HTREEITEMGetChildItem(HTREEITEMhItem)const;如果想要获取一个树形控件指定项的父项,可以使用GetParentItem()函数。GetParentItem()函数的原型如下:HTREEITEMGetParentItem(HTREEITEMhItem)const;树形控件如果想要获取一个树形控件的当前项,可以使用GetSelectItem()函数。GetSelectItem()函数的原型如下:HTREEITEMGetSelectedItem()const;如果想要获取获取一个树形控件指定项的根结点,可以使用GetRootItem()函数。GetRootItem()函数的原型如下:HTREEITEMGetRootItem()const;如果想要获取一个树形控件指定项的文本信息,可以使用GetItemText()函数。GetItemText()函数的原型如下:CStringGetItemText(HTREEITEMhItem)const;如果想要设置一个树形控件指定项的文本信息,可以使用SetItemText()函数。SetItemText()函数的原型如下:BOOLSetItemText(HTREEITEMhItem,LPCTSTRlpszItem);树形控件如果想要在一个树形控件中插入一个新项,可以使用InsertItem(

温馨提示

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

评论

0/150

提交评论