




已阅读5页,还剩129页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章 Windows编程基础和MFC编程基础,主要内容,基础知识 简单的Windows编程(API) MFC编程基础,1.基础知识,基本概念,窗口和程序 进程与线程 句柄 API与SDK 事件及消息,窗口和程序,窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位。 很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。 其实窗口的概念很广,例如按钮和对话框等也是窗口,只不过是一种特殊的窗口。,窗口,窗口 (Window) 由句柄唯一标识。 Windows程序的基本操作单元。 系统管理应用程序的基本单位。 应用程序与用户交互的接口环境。 应用程序的运行就是窗口内部、窗口之间、窗口与系统之间数据处理与交换的过程。 一个Windows程序至少有一个窗口。,窗口的组成,应用程序的主窗口,窗口,窗口,窗口,窗口,窗口,窗口的组成,窗口是屏幕上的一个矩形区域 应用程序在该区域中显示数据并等待鼠标点击 Windows应用系统的用户界面可以包含许多窗口 每个窗口都有不同的特点,但都是互相联系的,三种类型的窗口,在这么多窗口中,基本类型只有三种: 重叠( Overlapped ) 窗口 弹出( Popup ) 窗口 子( Child ) 窗口 在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的,三种类型的窗口,重叠窗口通常用于建立应用程序主窗口。事实上,有时也叫做“主”窗口或者“框架”窗口 弹出窗口通常以对话框和消息框的形式与用户对话 子窗口通常用在视图( View )中,如在文本编辑器中的文本显示,也用在控件中,如在对话框中的OK按钮 而对那些看起来像按钮或控件的子窗口,也称为“控件”窗口,三种窗口组成的应用程序,属于桌面的重叠窗口,也称主窗口,主窗口的子窗口,主窗口的子窗口,主窗口的弹出窗口,弹出窗口的子窗口,三种类型的窗口,主要区别 重叠窗口和弹出窗口 弹出窗口出现时可以没有标题(也称为标题栏) 子窗口与重叠窗口、弹出窗口 子窗口只能出现在另一个窗口中,并且子窗口的任何多余部分都被该窗口移去或剪切掉 另外,子窗口是唯一不能有菜单条的窗口,程序,通常说的程序都是指一个能让计算机识别的文件。 接触得最多的是以exe或者com作为扩展名的文件。,进程与线程,进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。 一个以exe作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。 当关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。 进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。,Windows任务管理器进程,线程,线程是进程的一个执行单元。 同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。 进程本来就具有动态的含义,是通过线程来体现的。,Windows应用程序,操作系统,计算机硬件之间的相互关系,向下的箭头1表示操作系统能够操纵输出设备,以执行特定的功能,如让声卡发出声音,让显卡画出图形。向上的箭头2表示操作系统能够感知输入设备状态的变化,如鼠标移动,键盘按下,并且能够知道鼠标移动的具体位置,键盘按下的哪个字符。这就是操作系统和计算机硬件之间的交互关系,应用程序开发者通常不需知道其具体实现细节。,API与SDK,API是英文Application Programming Interface 的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口 在编程时可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了 SDK是英文Software Development Kit的缩写,意思是“软件开发工具包” 微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等,关于API,向下的箭头表示应用程序可以通知操作系统执行某个具体的动作。 如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。,关于API,应用程序是如何通知操作系统执行某个功能的呢? 在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口Windows API。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。,事件及消息,事件(Event)是对计算机操作的动作。每个事件对应一个消息,即每个事件发生的效果是产生消息。 消息(Message)是描述事件发生的信息。 比如:按键事件按下键的消息、字符消息和键弹起的消息 程序执行的顺序取决于事件发生的顺序,但是消息的产生并不要求有次序之分。,事件驱动编程方法,事件驱动编程方法对于编写交互式程序很有用处,它避免了死板的操作模式。 Windows程序设计是针对事件或消息的处理进行。,消息(Message),向上的箭头表示操作系统能够将输入设备的变化上传给应用程序。 如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。,消息(Message),消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息。 鼠标被移动会产生WM_MOUSEMOVE消息; 鼠标左键被按下会产生WM_LBUTTONDOWN的消息; 鼠标右键按下便产生WM_RBUTTONDOWN消息等。,消息的功能,功能 帮助Windows实现多任务。 通知应用程序某一事件已经发生,各应用程序给予响应。,消息的组成,操作系统是怎样将感知到的事件传递给应用程序呢?这是通过消息机制(Message)来实现的。 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。 消息的组成: 消息号字参数长字参数 消息号事先定义好。 字参数(wParam)长字参数(lParam)提供附加信息,含义和具体消息号相关。,典型的消息结构,typedef struct tagMSG HWND hwnd; / 接收窗口 UINT message; / 消息标识 WPARAM wParam; / 附加信息 LPARAM lParam; / 附加信息 DWORD time; / 发送时间 POINT pt; / 鼠标位置 MSG , *PMSG; /vcincludewtypes.h,句柄 (HANDLE),句柄(HANDLE):资源的标识。 操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。 按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。 操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。,句柄,句柄是一个指针 通过句柄就可以控制该句柄指向的对象 编写程序总是要和各种句柄打交道的 句柄(handle)是一个4字节长的整数值 是系统用于表示应用程序中不同的对象和同类对象中不同的实例。 如一个窗口、按钮、图标、菜单等 这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。,常用的句柄,消息驱动机制,DOS程序是通过调用系统的函数来获得用户输入。 Windows程序则是通过操作系统发送的消息来处理用户输入 在Windows操作系统环境内 系统产生的动作 用户运行应用程序产生的动作,事件产生的消息,消息驱动机制,Windows程序 接收消息 分发消息 处理消息,与用户进行交互,消息的产生,用户产生消息 Windows 本身产生消息 应用程序本身产生消息 其他应用程序产生消息,消息的分类,窗口管理消息、初始化消息、输入消息、系统消息等。 VC定义不同的前缀用于消息宏定义识别消息类型。 BM 按钮消息 CB 组合框消息 DM 下压按钮控制消息 EM 编辑框消息 LB 列表框消息 WM 窗口消息,不同消息类型的取值范围,Windows应用程序常用消息,WM_LBUTTONDOWN WM_KEYDOWN WM_CREAT WM_CLOSE WM_DISTORY WM_QUIT WM_PAINT WM_CHAR WM_COMMAND,Windows应用程序常用消息,窗口管理消息 初始化消息 输入消息 系统消息 剪贴板消息 控制处理消息,控制通知消息 滚动条通知消息 非用户区消息 MDI消息 DDE消息 应用程序自定义的消息,消息的传递,Windows系统有一个存放消息的队列。 每个应用程序也有一个消息队列。 Windows系统先将收到的消息存放在系统队列中。 然后再分发到相应的应用程序队列中。 应用程序则从自身的队列中获取消息并进行处理。,消息的传递,事件,事件,事件,系统消息队列,应用程序队列,应用程序队列,应用程序队列,应用程序,应用程序,应用程序,一个应用程序队列,Windows,Input Message,System Queue,Application Queue,WinMain (),Message Loop,Windows Function,两个应用程序队列,Windows,Input Message,System Queue,Application Queue,Application Queue,WinMain (),Mesaage Loop,Windows Function,WinMain (),Mesaage Loop,Windows Function,结束一个应用程序,WM_DESTROY,Windows,WM_QUIT,Application Queue,Windows Function,Application,WinMain(),Message Loop,创建消息循环,Windows程序至少包含两个函数: WinMain ( ) : 必有且仅有一个 窗口函数 : 每个窗口对应一个窗口函数,以响应该窗口的消息 通常每个Windows 应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件,创建消息循环,While (GetMessage( / 将消息发送给窗口过程, 例程中指WndProc 何时退出 ? / 当从应用程序消息队列中检取的消息是 / WM_QUIT时,则退出循环,投递和发送消息,PostMessage和SendMessage PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行 这是个异步消息投放函数,会造成消息的滞后性 SendMessage必须等待其他程序处理消息完了之后才返回,继续执行 这是个同步消息投放函数,不会造成消息的滞后性 但如果消息处理失败,则会造成程序停止 PostMessage的返回值表示PostMessage函数执行是否正确 SendMessage的返回值表示其他程序处理消息后的返回值,投递和发送消息图示,Windows,System Queue,Application Queue,WinMain (),Mesaage Loop,Windows Function,PostMessage( ),SendMessage( ),Application,投递和发送消息示例,PostQuitMessage(nExitCode) 功能: 发送WM_QUIT消息给系统, 以通知系统应用程序要结束。 WM_QUIT消息只能用PostMessage,因为该消息将导致应用程序释放消息环,也就无法返回结果 。 SendDlgItemMessage( ) 功能: 向对话框控件发送消息 相当于先用GetDlgItem()得到控件句柄,再 SendMessage(),是一种组合的方便方式。,VC6.0下三种编程方式,控制台编程(DOS编程) Win32 Console Application Windows API编程: Win32 Application MFC编程: MFC AppWizard(exe),Visual C+开发环境,标题栏,菜单栏,工具栏,项目工作区窗口,文档窗口,工具栏,输出窗口,输出窗口标签,状态栏,开发环境的菜单功能,File菜单中的命令主要用来对文件和项目进行操作 Edit菜单中的命令是用来使用户便捷地编辑文件内容 View菜单中的命令主要用来改变窗口和工具栏的显示方式,激活调试时所用的各个窗口等 Insert菜单中的命令主要用于项目及资源的创建和添加,开发环境的菜单功能,Project菜单中的命令主要用于项目的一些操作 Build菜单中的命令主要用来应用程序的编译、连接、调试、运行 Tools菜单中的命令主要用于选择或定制开发环境中的一些实用工具 Windows菜单中的命令主要用于文档窗口的操作 Visual C+ 提供了大量详细的帮助信息,MFC,API,控制台(DOS),File菜单,VC6.0可以创建的项目类型,开发环境的工具栏,标准工具栏 类向导工具栏 小型编译连接工具栏 工具栏的显示与隐藏、浮动与停泊 “Customize”对话框方式(Tools-Customize) 快捷菜单方式(任何工具栏处右击鼠标),2. Windows编程基础,Windows编程基础和MFC编程基础,利用Visual C+开发面向对象Windows应用程序有两种主要方法:一种是使用Windows提供的Windows API(Application Programming Interface,应用程序编程接口)函数,另一种是利用Microsoft提供的MFC(Microsoft Foundation Class,微软基础类库)类库。 Windows API是Windows系统和应用程序间的标准接口,为应用程序提供Windows支持的函数定义、参数定义和消息格式等。 MFC类库包括用来开发C+应用程序和Windows应用程序的一组类,这些类用来表示窗口、对话框等标准的Windows部件,封装了大部分的Windows API函数。,9.1 Windows编程基础,Windows系统支持多个应用程序同时执行,在界面形式上,它支持多个窗口同时活动。它的运行机制是“消息传递,事件驱动(message based,event driven)”。 1. 消息传递 2 事件驱动 3. Windows API 4. Windows数据类型与变量的命名规则,1. 消息传递,消息是一种报告有关事件发生的通知,类似于DOS下的用户输入。Windows应用程序是由消息驱动的。Windows操作系统允许多个任务同时运行,应用程序的输入输出由Windows统一管理;Windows系统下每一个窗口都维护一个消息队列,操作系统接收和管理所有输入消息、系统消息,并把它们发送给相应窗口的消息队列。应用程序初始化完成后,进入消息循环,维护自己的消息队列,从中取出消息,对其进行处理。编写消息处理函数是Windows编程的主要工作之一。,Windows应用程序的消息来源有以下四种(1),(1) 输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。 (2) 控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。,(3) 系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,像DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。 (4) 用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。,Windows应用程序的消息来源有以下四种(2),Windows消息,Windows消息是在Windows文件中用宏定义的常数。消息常数名通常以WM开头,格式为WM_XXX。在winuser.h中,消息结构的定义如下: typedef struct tagMSG HWND hWnd; / 指定消息发向的窗口句柄 UINT message; / 标识消息的消息值 WPARAM wParam; / 消息参数 LPARAM lParam; / 消息参数 DWORD time; / 消息进入队列的时间 POINT pt; / 消息进入队列时鼠标指针的屏幕坐标 MSG,*PMSG,NEAR *NPMSG,FAR * LPMSG;,Windows程序和Windows消息处理的基本流程,2 事件驱动,Windows系统使用事件驱动的编程模式。事件用来标识发生的某件事情,主要采用以下三种方式产生: (1) 通过输入设备,如键盘和鼠标。 (2) 通过屏幕上的可视对象,如菜单、工具栏按钮、滚动条和对话框上的控件。 (3) 来自Windows内部。,句柄,句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个唯一的整数值,是一个4字节长的数值,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷和文件等。由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件和图标等系统资源。常见的Windows对象句柄如表9.1所示,所有的句柄类型以H开头。,3. Windows API,Windows API是应用程序编程接口的英文缩写。它是大量函数加上数字常量、宏、结构、类型以及其它相关项的集合。在Windows应用程序中,调用API函数的方法同调用C库函数的方法相同,重要区别是C库函数的目标代码直接放到程序目标代码中,而API函数的目标代码则位于程序之外的某个动态链接库(DLL)中。 Windows API是包含在Windows操作系统中的,另外还有单独的驱动程序开发包(DDK),用来开发Windows驱动程序。因为Windows API函数本身是用C语言编写的,所以C/C+编程可以很方便地利用计算机的底层资源,程序运行速度远远高于其它语言。,【例9.1】一个简单的Windows32应用程序。,#include int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPreinstance,LPSTR lpCmdLine, int nCmdshow) MessageBox(NULL,“一个简单的Win32应用程序“,“例9.1“,MB_OK); return 0; ,4. Windows数据类型与变量的命名规则(1),Windows API自定义了一些关键字,用来定义Windows函数中的有关参数和返回值的大小和意义,通常把它们看作Windows的数据类型,常用的如表9.2所示(P222)。,说明: 基本数据类型都是用大写字符来表示,以与一般C+基本数据类型相区别。 数据类型的前缀是P或LP,表示是一个指针或长指针数据类型。前缀是U,表示无符号数据类型,等等。 Windows还提供一些宏来处理上述基本数据类型。,4. Windows数据类型与变量的命名规则(1),在编程时,变量、函数的命名是一个极其重要的问题。好的命名方法使变量易于记忆且增加程序的可读性。Micorsoft采用匈牙利(Hungarian)命名法来命名Windows API函数和变量。匈牙利命名法为C+标识符的命名定义了一种非常标准化的方式,以下述两条规则为基础:,(1) 标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。表9.3(P223)列出了常用数据类型的标准前缀。 (2) 在标识符内,前缀之后就是一个或多个首字母大写的单词,这些单词明确指出源程序中那个对象的用途。例如,m_szPersonAddress表示一个人住址的类数据成员,数据类型是字符串。,4. Windows数据类型与变量的命名规则(2),从变量的类型区分变量的用途,int x,y; x=30; y=30; /x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。 typedef int WIDTH typedef int HEIGHT WIDTH x; HEIGHT y; /好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。,9.2 MFC编程基础,9.2.1 MFC编程概述 9.2.2 MFC的类层次 9.2.3 常用的MFC类 9.2.4 MFC应用程序的消息映射 9.2.5 一个最简单的MFC应用程序 9.2.6 典型的Windows应用程序,9.2.1 MFC编程概述(1/3),MFC类库作为C+与Windows的接口,建立在Win32应用程序编程接口API之上,封装了大多数的API函数,主要是API中与程序结构相关的部分和最常用的部分。MFC还封装了重要的Windows扩展,如COM,ActiveX,ODBC和Internet APIs,为这些难以编程实现的功能提供了简便方法。,MFC中的各种类结合起来构成了一个应用程序框架,它的目的是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK(Software Development Kit软件开发包)来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于直观地设计用户界面;ClassWizard用来协助添加代码到框架文件;最后进行编译,则通过类库实现了应用程序特定的逻辑。,9.2.1 MFC编程概述(2/3),在MFC编程中,入口函数WinMain()被封装在MFC的应用程序框架内,已经不用也不可以再定义为另一个WinMain()函数。 MFC编程最好的办法是使用MFC的应用程序向导工具AppWizard。AppWizard为程序员提供了一种快捷方便的工具来定制基于MFC的应用程序框架,程序员只需以此为基础,添加与修改程序代码来实现所需功能。,9.2.1 MFC编程概述(3/3),9.2.2 MFC的类层次,MFC中的类可划分为根类、应用程序结构类、窗口类、OLE类、数据库类等十个大类,在其中一些大类的基础上又派生出许多子类。 各个类的具体定义参见文件Afxwin.h。 1. 根类CObject 2. MFC应用程序结构类(如CWinApp类等) 3. 用户界面类(控件类、绘图和打印相关类等) 4. 一般用途的类(文件、数据库和网络相关的类) 5. 集合类 (数组、链表等相关的类) 6. 非CObject派生类 (CString、CRect类等),MFC类的基本层次结构,9.2.3 常用的MFC类,1字符串类CString CString类用于描述和处理VC+中的字符串,该类没有基类。CString对象的字符串的长度是可变的,如果在程序中改变了字符串的内容,CString类会自动调整所需内存。因此,使用CString类要比使用简单的字符数组和字符指针更安全。 #include CString类的数据成员均为私有成员,不能直接使用,只需注意其方法(成员函数)和运算即可。 表9.4为CString类的常用成员函数。 【例9.2】CString类的使用举例。,CString 类的定义在”afx.h”头文件中 ,使用时还应说明“Use MFC in a Static Library”,形式: CString 对象名; CString 对象名=”字符串常量”; CString 对象名(”字符串常量”); CString 对象名(字符,int n); /重复产生n个相同的字符,CString s1=“C/C+程序设计“; CString s(d,5);couts; /s获得字符串”ddddd”,1. 定义CString 类对象,2. 输入/输出,#include “iostream.h“ #include “afx.h“ void main() char c80; CString st1; coutc; st1=c; cout“输出结果: “; coutst1endl; ,应利用字符数组间接输入,不能直接用cin输入,CString对象可直接通过cout输出,3. 基本运算,假设有定义: CString st1(“ASDFG”),st2,st3(“DD”);,运算符,含义,实例,结果,=,赋值,st2=”C+程序设计”; st3=st1;,st2的值为”C+程序设计” st3的值为”ASDFG”,+,字符串连接,st2=st2+”教程”,st2的值为”C+程序设计教程”,+=,字符串连接并赋值,st2+=”教程”,在st2相同初值的基础上效果同上, = = !=,关系运算,st1=”ASDF” st1st3,false true, ,取指定位置的字符 将CString 对象看成数组,st10 st13,A /第一个字符位置为0 F,4. 成员函数,(1)取子串 形式: CString Mid(int nFirst,int nCount) /取字符串中nFirst位置开始的nCount个字符 CString Left(int nCount) /取字符串的左边nCount个字符 CString Right(int nCount) /取字符串的右边nCount个字符,有定义:CString s(“12345“ ); 则:s.Mid(2,2)的值为34 s.Left(3)的值为123,【例】利用Left函数,输出如图所示的结果。,分析: 确定每行显示字符的起始位,通过setw(n)显示一个空格的位数来实现,也可通过产生一个有若干个空格的字符串后left(n) 显示n个空格来实现。 显示可变的字符串,利用left(n)。,#include “iostream.h“ #include “afx.h“ void main() CString st1( ,30); / 产生30个空 CString st2(“ABCDEFGHIJKLMNOPQRS“); for(int i=1;i=10;i+) coutst1.Left(10-i)st2.Left(2*i-1)endl; ,程序:,(2)查看字符串信息 int Find(TCHAR ch); /返回指定字符在串中的位置 int Find(LPCTSTR lpszSub); /返回指定子字符串在串中的位置 int GetLength(); /返回字符串的字符数,有定义:CString s (“ABCDEF“); 则:s.Find(C)的值为2 s.Find(“BCD”)的值为1 s.GetLengh()的值为6,(3)字符串修改 void SetAt(int nIndex,TCHAR ch) /用字符替换指定位置上的字符 int Insert(int nIndex, TCHAR ch) /将字符插入到指定位置,原位置的字符右移 int Delete (int nIndex,int nCount=1) /从指定位置开始删除一个或多个字符 int Replace(TCHAR chOld, TCHAR chNew) /将新字符替换字符串中的老字符 int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew) /同上,区别替换的是子字符串,有定义:CString s (“ABCDEF“); 则:s.SetAt(1,b); couts; /输出AbCDEF s.Insert(1,b); couts; / 输出AbBCDEF s.Replace(g,k);couts; /输出ABCDEF s.Replace(“BCD”,“bc”); couts; /输出AbcEF,思考: 如何删除字符串中任意子字符串?,(4)转换字符串 void MakeUpper() /将字符串中的所有字符转换成大写 void MakeLower() /将字符串中的所有字符转换成小写 void MakeReverse() /将字符串中各字符的顺序倒转 void Empty() /将字符串中的所有字符删除,有定义:CString s (“ABCabc“); 则:s. MakeUpper(); couts; 输出:ABCABC s. MakeReverse(); couts; 输出:cbaCBA s. Empty();couts; 输出: (空),(5)格式化输出 形式: void Format(格式字符串,输出参数列表); 功能:构造一个输出的字符串。 其中: “格式字符串”由输出的文字和数据格式说明符组成,文字可以是直接键入的各种字符,还可以是转义符;数据格式说明符形式: %输出宽度格式字符 “输出参数列表” 表示要输出的数据,其个数与类型必须与格式说明符依次对应。,有定义:CString s; 则:s.Format(“a1=%d,a2=%5.2f,a3=%s“,123,12.3,“abc“); couts; 输出:a1=123,a2=12.30,a3=abc,2CTime类(1),CTime类用来描述一个具体日期和时间,该类没有基类。 CTime类引入了ANSI time_t数据类型及与time_t相联系的运行时函数。CTime对象的值基于世界标准时间(UCT)或等价的格林威治时间(GMT)。本地时区由TZ环境变量控制。时间环境变量TZ由三部分组成:_daylight、_timezone和_tzname,其值由函数_tzset()设置。 和CTime相对应的是CTimeSpan类,该类标识时间间隔,即两个CTime对象的差。,2CTime类(2),CTime和CTimeSpan类不可派生。由于没有虚函数,所以CTime和CTimeSpan对象只有4个字节,并且多数成员函数为内联函数。 CTime类的定义放在afx.h中,所以使用该类前应加上文件包含预处理命令: #include 表9.5为CTime类的常用成员函数。 【例9.3】CTime类的使用举例。,3CTimeSpan类,CTimeSpan类没有基类。 CTiemSpan类的定义放在afx.h中,所以使用该类前应加上文件包含预处理命令: #include 表9.6为CTime类的常用成员函数。 【例9.4】构造一个CTimeSpan对象,并获取其中的完整天数、小时数、分数和秒数。,4数组类(1),MFC的数组类创建和管理任何类型数据的数组对象,这些数组对象和标准数组相似,但MFC可以在运行期动态地扩大或缩小数组对象,由于MFC的数组可以动态生成,所以用户可以不必考虑在常规数组使用中经常发生的内存浪费问题。,数组类包括CArray(模板类)、CByteArray(字节)、CDWordArray(32为双字)、CObArray(COject指针)、CPtrArray(void指针)、CUIntArray(无符号整数)、CWordArray(16位字)和CStringArray(CString对象)等,它们的父类均为CObject,但这些类相互之间没有继承关系。从类名即可知,每个类都对应特定的数据类型。这些数组类除了保存的数据类型不同外,其它完全相同。 表9.7为CArray类的常用成员函数。 【例9.5】数组类的使用举例。,4数组类(2),5链表类,MFC提供三种链表类,用户可用其创建自己的链表。这些链表是CObList(对象链表)、CPtrList(指针链表)和CStringList(字符串链表),每个链表类都有类似的成员函数。 表9.8为链表类的常用成员函数。 【例9.6】链表类的使用举例。 【例9.7】编写学生信息管理程序,实现的功能如下:显示学生信息、增加学生信息、删除学生信息、存储学生信息到文件、读取文件信息等。,6CPiont类,CPoint类用于处理窗口或客户区中的坐标点。类CPoint是对Windows结构POINT的封装,凡是能用POINT结构的地方都可以用CPoint代替。 结构POINT表示屏幕上的一个二维点,其定义为: typedef struct tagPOINT LONG x; LONG y; POINT; 其中 x、y分别是点的横坐标和纵坐标。 #include CPoint类的成员函数如表9.9所示。,7CSize类(1/2),CSize类是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。结构SIZE表示一个矩形的长度和宽度,其定义为: typedef struct tagSIZE LONG cx; LONG cy; SIZE; 其中 cx、cy分别是长度和宽度。,7CSize类(2/2),与CPoint类似,CSize也提供了一些重载运算符。如运算符“+”,“-”,“+=”和“-=”,用于两个CSize对象或一个CSize对象与一个CPoint对象的加减运算,运算符“=”和“!=”用于比较两个CSize对象是否相等。 由于CPoint和CSize都包含两个整数类型的成员变量,他们可以进行相互操作。CPoint对象的操作可以以CSize对象为参数。同样,CSize对象的操作也可以以CPoint对象为参数。如可以用一个CPoint对象构造一个CSize对象,也可以用一个CSize对象构造一个CPoint对象,允许一个CPoint对象和一个CSize对象进行加减运算。 #include,8CRect类,CRect类是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替。 结构RECT表示一个矩形的位置和尺寸,其定义为: typedef struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT; #include CRect类的成员函数如表9.10所示。,9.2.4 MFC应用程序的消息映射,1.消息类别 在Win32中,我们已经介绍过消息统一由一个MSG结构来描述,应用程序为每一条消息在消息队列中放置一个MSG结构变量。一般情况下,应用程序只需对结构中的消息类别message、附加参数wParam和lParam三个字段进行判断就可以区别一个消息。 MFC应用程序的三种类型的消息:,(1) 窗口消息 (2) 命令消息 (3) 控件消息,2.消息处理过程(1),(1) 应用程序类Run()函数调用:DispatchMessage(MSG *msg)把消息交给全局函数LRESULT AfxWndPorc(HWND hwnd,UINT nmsg,WPARAM wParam,LPARAM lParam)。 (2) AfxWndPorc()接收消息,并寻找消息的目标窗口CWnd对象,然后调用LRESULT AfxCallWndProc(CWnd *pWnd,HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)。 (3) AfxCallWndProc()存储消息的消息标志符和参数,然后调用目标窗口对象的虚函数LRESULT WndProc(UINT nmsg,WPARAM wParam,LPARAM lParam)。,(4) WndProc()将发送消息给BOOL OnWndMsg(UINT nmsg,WPARAM wParam,LPARAM lParam,LRESULT *pResult)。OnWndMsg()负责将消息分类为窗口消息、命令消息和控件消息三种,不同的消息类别将交给不同的消息处理函数去处理。 (5) 如果消息类别是WM_COMMAND,则OnWndMsg()将调用LRESUL OnCommand(WPARAM wParam,LPARAM lParam);如果消息类别是WM_NOTIFY,则OnWndMsg()将调用BOOL OnNotify(WPARAM wParam,LPARAM lParam,LRESULT pResult);其它则认为是窗口消息,OnWndMsg()将搜索目标窗口类或者基类的消息映射表,以判断该类及其基类能否处理该消息。如果不能处理此消息,OnWndMsg()将把消息交给LRESULT DefWindowProc(UINT nmsg,WPARAM wParam,LPARAM lParam)函数进行默认处理。,(6) OnCommand()继续判断消息lParam参数是否为0。如果不为0,则为控件消息,将通知控件处理该消息;如果lParam参数为0或者控件不能处理该消息,将调用BOOL OnCmdMsg(UINT nID,int nCode,void *pExtra,AFX_CMDHANDLERlNFO *pHandlerlnfo),OnCmdMsg()将按照一定的路径搜索相应类的消息映射表,以确定能否处理该消息。,2.消息处理过程(3),(7) OnNotify()将通知控件处理该消息:如果控件不能处理该消息,则也将调用OnCmdMsg()按照一定的路径搜索相应类的消息映射表。 (8) OnCmdMsg()按照已经规定好的路径搜索相应类的消息映射表,以便找到消息处理函数并执行,如果不能找到,则把相应的界面元素(如菜单项)变灰。OnCmdMsg()把搜索的结果反馈给OnNotify()和OnCommand(),然后它们分别把处理的结果反馈给OnCmdMsg()函数,以便确定OnCmdMsg()能否处理该消息。,2.消息处理过程(4),9.2.5 一个最简单的MFC应用程序,【例9.8】一个最简单的MFC应用程序(显示一个消息框)。,程序代码:,#include class eg9_8:public CWinApp public: virtual BOOL InitInstance() MessageBox(NULL,“一个简单的MFC应用程序“,“eg9.8“,0); return TRUE; ; eg9_8 theApp;,P249250,例: 设计一个MFC程序,例Ex_HelloMFC 一个MFC应用程序。 (1) 创建一个“An empty project”类型的Win32 Application(Win32 应用程序)项目Ex_HelloMFC。 (2) 选择“文件”“新建”。 (3)建立C+ Source File文件,并输入代码 。,(4) 选择“工程”“设置”菜单命令,在出现的对话框中选择“General”标签。然后在“Microsoft Foundation Classes”组合框中,选择“Use MFC in a Shared DLL”。单击OK按钮。 (5) 程序运行后,单击鼠标左键,就会弹出一个对话框,结果同Ex_HelloWin。,理解程序代码,1. 程序运行机制 MFC是使用afxwin.h来代替头文件windows.h,在Ex_HelloMFC程序中看不到Windows应用程序所必须的程序入口函数WinMain,因为MFC将它隐藏在应用程序框架内部了。当用户运行应用程序时,Windows会自动调用应用程序框架内部的WinMain函数,并自动查找该应用程序类CHelloApp的全局变量theApp,然后自动调用CHelloApp的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。,首先执行的是: m_pMainWnd = new CMainFrame(); 该语句用来创建从CFrameWnd类派生而来的用户框架窗口CMainFrame类对象,继而调用该类的构造函数,使得Create函数被调用,完成窗口的创建工作。 然后执行后面两句,用作窗口的显示和更新。 m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); 最后返回TRUE,表示窗口创建成功。,InitInstance的执行过程:,理解程序代码,应用程序类CWinApp是用来调用WinMain以及进行实例的初始化,在每个MFC应用程序中有且只能有一个这样的应用程序类,且需要一个全局的对象实例,如theApp。 InitInstance完成初始化工作后,接下来调用基类CWinApp的成员函数Run,执行应用程序的消息循环,即重复执行接收消息并转发消息的工作。当Run检查到消息队列为空时,将调用基类CWinApp的成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处理等待状态,一直等到有消息为止。当程序结束时,调用基类CWinApp的成员函数ExitInstance,完成终止应用程序的收尾工作。,理解程序代码,2. 消息映射(Message Map) 在MFC中,一个消息的处理往往是通过独特的MFC映射机制来进行的。 消息映射机制指MFC类中将消息与消息处理函数联系起来,一一对应的机制。这种机制使得应用程序处理消息变得更方便、更直接、更紧凑。在MFC中,任何一个从CCmdTarget类派生的类理论上均可处理消息,且都有相应的消息映射函数。,理解程序代码,映射
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- mtbe考试试卷及答案
- 电网业务知识培训课件
- 电缆厂知识培训课件
- 电磁兼容原理课件接地
- 高端酒销售基础知识培训课件
- 新解读《GB-T 32151.11-2018温室气体排放核算与报告要求 第11部分- 煤炭生产企业》
- Ochracenomicin-B-生命科学试剂-MCE
- Acetohexamide-d11-生命科学试剂-MCE
- MLN-591-MLN2704-antibody-生命科学试剂-MCE
- 保育大赛考试试题题库及答案
- 人员管理办法格式范本
- 2025AI办公发展现状软件市场竞争格局及未来发展前景分析报告
- 北京员工待岗管理办法
- 停工缓建项目管理办法
- 淋巴水肿健康科普
- 采购应急计划管理办法
- 上海选调生面试题和考官用题本及答案21套
- 2025年学校食堂从业人员食品安全知识培训考试试题及答案
- 2025年国家电投校园招聘笔试考点考试题库及答案
- 语文老师职业试讲课件
- 让情绪有着落-2025年情绪营销8大趋势洞察报告
评论
0/150
提交评论