




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第3章章Windows编程与MFCMFC应用程序执行的大致流程;应用程序执行的大致流程;MFC的概念和作用;的概念和作用;Windows应用程序的特点和运行机制;应用程序的特点和运行机制;消息的概念,机制;消息的概念,机制;利用利用MFC AppWizard 来创立来创立Windows应用程序应用程序的步骤和方法;的步骤和方法;创立应用程序中所产生的主要类及其功能、组成文创立应用程序中所产生的主要类及其功能、组成文件和程序的框架结构;件和程序的框架结构;第第3章章Windows编程与MFC系统特点系统特点 Windows操作系统是由操作系统是由Microsoft公司推出公司推出的基于个人电脑
2、的图形操作系统。其有以下几个的基于个人电脑的图形操作系统。其有以下几个特点:特点:1、标准的图形用户界面,如窗口、菜单、按钮和、标准的图形用户界面,如窗口、菜单、按钮和列表框等。列表框等。2、应用程序与硬件无关的特性,对于同一类硬件,、应用程序与硬件无关的特性,对于同一类硬件,不管厂家和型号程序都无需进行如何修改就可以不管厂家和型号程序都无需进行如何修改就可以运行。运行。3、所有的、所有的Windows应用程序都是消息驱动机制,应用程序都是消息驱动机制,也就是说,也就是说,Winsows程序是通过操作系统发送程序是通过操作系统发送 的消息来处理用户输入的。的消息来处理用户输入的。第第3章章Wi
3、ndows编程与MFC事件与消息的概念事件与消息的概念 在在Windows操作系统中,无论是操作系统中,无论是系统产生的动作或是用户在运行应用程序系统产生的动作或是用户在运行应用程序中发出的操作动作都称为事件中发出的操作动作都称为事件Events,而消息而消息Message用于描述某个事件发用于描述某个事件发生的信息。事件和消息密切相关,事件是生的信息。事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件事件。所谓消息的响应,其实质就是事件的响应。例如:按下鼠标左键,系统就会的响应。例如:按下鼠标左键,系统就会产
4、生一条特定的消息,标志鼠标按键事件产生一条特定的消息,标志鼠标按键事件的发生。的发生。第第3章章Windows编程与MFCWindows应用程序执行的根本流程应用程序执行的根本流程图图3.1 Windows应用程序的基本流程应用程序的基本流程第第3章章Windows编程与MFC 图中的图中的WM_QUIT是消息值,表示应用程序退出的是消息值,表示应用程序退出的消息。消息。 在在Visual C+编程过程中,系统规定每一种消息编程过程中,系统规定每一种消息用一个特定的值表示,为了便于记忆,系统针对每一个用一个特定的值表示,为了便于记忆,系统针对每一个消息值消息值定义了对应的符号常量,如定义了对应
5、的符号常量,如WM_LBUTTONDOWN表示鼠标左键按下的消息,表示鼠标左键按下的消息,WM_LBUTTONUP表示鼠标左肩抬起的消息,表示鼠标左肩抬起的消息,WM_SIZE表示改变窗口尺寸的消息表示改变窗口尺寸的消息第第3章章Windows编程与MFC在应用程序运行中,消息是最重要的通信手段,在编程过程在应用程序运行中,消息是最重要的通信手段,在编程过程 中,中,Windows中的每一个消息中所包括的所有信息用一个中的每一个消息中所包括的所有信息用一个MSG结结构体来表示,构体来表示,MSG结构体的定义如下:结构体的定义如下:typedef struct tagMSG HWND hwnd;
6、 /获取消息的窗口句柄获取消息的窗口句柄UINT message; /消息编号消息编号WPARAM wParam; /记录消息附加信息的字参数记录消息附加信息的字参数LPARAM lParam; /记录消息附加信息的长字参数记录消息附加信息的长字参数DWORD time; /消息被发送到消息队列的时间消息被发送到消息队列的时间POINT pt; /消息发送时的光标所在位置消息发送时的光标所在位置 MSG; 其中的其中的HWND、UINT、WPARAM、DWORD等都是在等都是在Visual C系统中针对系统中针对Windows编程所定义的扩充数据类型。编程所定义的扩充数据类型。第第3章章Win
7、dows编程与MFC需要说明的是:需要说明的是: 图的流程是一个循环的流程;图的流程是一个循环的流程;Windows所能向应用程序发送所能向应用程序发送的消息多达数百种,但是对于一般的应用程序来说,只有其中的一的消息多达数百种,但是对于一般的应用程序来说,只有其中的一局部有意义。局部有意义。如:如果应用程序中需要用鼠标来操作,那么如:如果应用程序中需要用鼠标来操作,那么WM_KEYUP、WM_KEYDOWN和和WM_CHAR等消息就没有如何意义,因为这些等消息就没有如何意义,因为这些消息都是与按键有关的消息,也就是说,应用程序不需要处理这些消息都是与按键有关的消息,也就是说,应用程序不需要处理
8、这些消息,对于这些消息,只需要交给消息,对于这些消息,只需要交给Windows作默认的处理即可。作默认的处理即可。因此,在应用程序中所处理的消息只是所有消息中的一小局部。因此,在应用程序中所处理的消息只是所有消息中的一小局部。第第3章章Windows编程与MFCWindows应用程序实际上是由一系列的消息处理代码来实现应用程序实际上是由一系列的消息处理代码来实现的。这和我们传统的过程式编程方法很不一样,我们只能预测用户的。这和我们传统的过程式编程方法很不一样,我们只能预测用户所利用的程序用户界面对象所进行的操作以及为这些操作编写处理所利用的程序用户界面对象所进行的操作以及为这些操作编写处理代码
9、,却不可预测这些操作在什么时候发生或是什么顺序来发生,代码,却不可预测这些操作在什么时候发生或是什么顺序来发生,所以说,我们不可能知道什么消息会在什么时候以什么顺序来临。所以说,我们不可能知道什么消息会在什么时候以什么顺序来临。Windows应用程序在处理消息时使用了一种叫做回调函数应用程序在处理消息时使用了一种叫做回调函数callback function的特殊函数。回调函数由应用程序定义,但的特殊函数。回调函数由应用程序定义,但是,在应用程序中并没有调用回调函数的代码,回调函数是供操作是,在应用程序中并没有调用回调函数的代码,回调函数是供操作系统或者其子系统调用的,这种调用通常发生在某一事
10、件发生时系统或者其子系统调用的,这种调用通常发生在某一事件发生时.典典型的回调函数有窗口过程、对话框过程或构造函数。如:窗口过程型的回调函数有窗口过程、对话框过程或构造函数。如:窗口过程函数的原型如下:函数的原型如下:LRESULT CALLBACK WindowProc (HWND hwnd,/窗口句柄窗口句柄unit uMsg,/消息标识消息标识WPARAM wParam,/包含信息内容的参数包含信息内容的参数LPARAM lParam/包含消息内容的参数包含消息内容的参数);第第3章章Windows编程与MFC编程中常用的数据类型和句柄编程中常用的数据类型和句柄数据类型数据类型 Visu
11、al C+编程过程中,经常会遇到一些编程过程中,经常会遇到一些Visual C的扩充的扩充数据类型,大多数是在原有数据类型,大多数是在原有C根本类型的根底上定义了新的便根本类型的根底上定义了新的便于记忆的名称,而有些是新扩充的数据类型。如:于记忆的名称,而有些是新扩充的数据类型。如:Windows中所用的数据类型中所用的数据类型对应的基本数据类型对应的基本数据类型说明说明BOOLInt布尔值FLOATFloat浮点数LPTSTRChar *指向字符串的32位指针第第3章章Windows编程与MFC编程中常用的句柄编程中常用的句柄 在在Windows中,对象可以是所有的标准的部件,如窗口、菜单中
12、,对象可以是所有的标准的部件,如窗口、菜单栏、工具栏、按钮和编辑框等。当然我们自己编写的程序也可称为栏、工具栏、按钮和编辑框等。当然我们自己编写的程序也可称为对象。对象。 句柄句柄Handle是是Windows编程中的一个重要的概念。句柄编程中的一个重要的概念。句柄是一个是一个4字节长的整数值,是应用程序中不同对象的编号,每个对字节长的整数值,是应用程序中不同对象的编号,每个对象的句柄是唯一的。应用程序通过句柄来访问相应的对象。如:象的句柄是唯一的。应用程序通过句柄来访问相应的对象。如:句柄类型句柄类型说明说明HBRUSH画刷句柄HFONT字体句柄HMENU菜单句柄第第3章章Windows编程
13、与MFC每个对象除了句柄外,另外还有一个识别码每个对象除了句柄外,另外还有一个识别码ID,它也是一,它也是一个个4字节长的整数值,可以看作是对象的名字,但是句柄和字节长的整数值,可以看作是对象的名字,但是句柄和Id的区的区别主要有以下几个方面:别主要有以下几个方面:1、句柄是系统内给定的,而、句柄是系统内给定的,而ID是用户自行定义的。是用户自行定义的。2、句柄是创立窗口时得到的,而、句柄是创立窗口时得到的,而ID是程序编写时确定的。是程序编写时确定的。3、句柄具有唯一性,而、句柄具有唯一性,而ID可以重复。可以重复。第第3章章Windows编程与MFC利用利用MFC AppWizard 创立
14、创立Windows应用程序应用程序简介简介Windows SDK:Windows Software Development Kit Windows 软件开发工具包软件开发工具包Windows API:Windows Application Programming Interface Windows应用程序接口应用程序接口MFC :Microsoft Foundation Class微软根底类库微软根底类库第第3章章Windows编程与MFCWindows SDK和和Windows API紧密联系,是一套帮助紧密联系,是一套帮助C语语言程序员创立言程序员创立Windows应用程序的工具,它包含:
15、应用程序的工具,它包含:1、Windows编程中可能用到的函数、消息、结构体、宏及其他资编程中可能用到的函数、消息、结构体、宏及其他资 源的帮助信息。源的帮助信息。2、各种编程工具,如对话框编辑器、图像编辑器等。、各种编程工具,如对话框编辑器、图像编辑器等。3、Windows库及头文件。库及头文件。4、使用、使用C语言编写的例如程序。语言编写的例如程序。 Windows SDK的最新版本是的最新版本是Win32 SDK,当我们在安装,当我们在安装Visual C系统时,它会被自动安装上。系统时,它会被自动安装上。基于基于API设计设计Windows应用程序时,程序开发者需要直接调应用程序时,程
16、序开发者需要直接调用用API函数,必须编写大量代码,并且要熟知函数,必须编写大量代码,并且要熟知Windows应用程序的应用程序的框架,因此,程序开发难度高而且开发周期长。但是,采用这种方框架,因此,程序开发难度高而且开发周期长。但是,采用这种方法编写程序可以使应用程序获得更高的效率,编写程序时有较大的法编写程序可以使应用程序获得更高的效率,编写程序时有较大的自由度。自由度。第第3章章Windows编程与MFC简介简介编写编写Windows应用程序,可采用两种方法:应用程序,可采用两种方法:1、直接使用、直接使用Windows SDK软件开发包调用软件开发包调用Windows API应应用程序
17、接口函数的编程方法;用程序接口函数的编程方法;2、基于、基于MFC微软根底类库的程序设计方法。微软根底类库的程序设计方法。 MFC是是Microsoft公司推出的用于创立公司推出的用于创立Windows应用程序的一应用程序的一套套C类库。类库。MFC按照按照C类的层次形式组织在一起,几个层次类的层次形式组织在一起,几个层次较高的类提供一般的功能,而此次较低的类去实现更具体的功能。较高的类提供一般的功能,而此次较低的类去实现更具体的功能。每个低层次的类都是从高层类中派生出来的,因此继承了高层次的每个低层次的类都是从高层类中派生出来的,因此继承了高层次的行为。在行为。在MFC类库中封装了大多数的类
18、库中封装了大多数的Windows API函数,取而代函数,取而代之的是对程序员更友好的之的是对程序员更友好的C类,很多类,很多Windows程序所共有的标程序所共有的标准内容可以有准内容可以有MFC的类来提供。如窗口、按钮等标准部件都有相应的类来提供。如窗口、按钮等标准部件都有相应的类,程序中用到这些标准部件时,直接使用即可。因此,使用的类,程序中用到这些标准部件时,直接使用即可。因此,使用MFC编程程序员可以把注意力集中于自己的程序所特有的局部,不编程程序员可以把注意力集中于自己的程序所特有的局部,不需要事事亲自来编。大大减少了程序代码的编写量,是编程变得更需要事事亲自来编。大大减少了程序代
19、码的编写量,是编程变得更容易轻松。容易轻松。第第3章章Windows编程与MFC需要说明的:需要说明的:MFC还提供了一个应用程序开发模型,即文档还提供了一个应用程序开发模型,即文档/视图模型视图模型DOC / View,是将应用程序数据与用户界面元素别离的一种应,是将应用程序数据与用户界面元素别离的一种应用编程方法。它允许这两局部程序独立存在,这样,程序员在更改用编程方法。它允许这两局部程序独立存在,这样,程序员在更改其中一局部程序的时候,不会大量更改另一局部程序。其中一局部程序的时候,不会大量更改另一局部程序。Visual C应用程序开发环境特别适合于使用应用程序开发环境特别适合于使用MF
20、C。第第3章章Windows编程与MFC利用利用MFC AppWizard创立创立Windows应用程序应用程序MFC AppWizard:应用程序向导:应用程序向导 在在Visual C下可创立各种类型的应用程序,而不同的应用下可创立各种类型的应用程序,而不同的应用程序具有不同的应用程序框架,为方便用户生成和利用这些框架,程序具有不同的应用程序框架,为方便用户生成和利用这些框架,提供了提供了MFC AppWizard,它可以帮助用户自动生成一些常用的标,它可以帮助用户自动生成一些常用的标准程序结构框架。准程序结构框架。如:基于如:基于MFC的的Windows应用程序结构、应用程序结构、DLL
21、应用程序结构、单应用程序结构、单文档文档SDI应用程序结构和多文档应用程序结构和多文档MDI应用程序结构等。在应用程序结构等。在这些程序框架中,最常用的是开发基于这些程序框架中,最常用的是开发基于MFC的一般应用程序的一般应用程序MFC AppWizardexe。第第3章章Windows编程与MFC创立一个单文档应用程序创立一个单文档应用程序开始开始选择选择“File“New,选择,选择Projects标签;选择标签;选择MFC AppWizard(exe)的工程类型的工程类型(该类型用于创立可执行的该类型用于创立可执行的Windows应用程序应用程序),将工程工作文件夹定位在,将工程工作文件
22、夹定位在“程序,并在程序,并在“Project Name框中输入工程名框中输入工程名Ex_SDIHello,如图,单击,如图,单击OK。图图4.5 MFC AppWizard的的“New”对话框对话框使用使用MFC AppWizard第一步第一步从应用程序类型从应用程序类型Single Document、Multiple Document和和Dialog Based中选择中选择SDI。决定应用程序中是否需要决定应用程序中是否需要MFC的的“文档文档/视图结构的支持。假设不视图结构的支持。假设不选定此项,那么程序中的磁盘文件的翻开、保存以及文档和视图的相选定此项,那么程序中的磁盘文件的翻开、保存
23、以及文档和视图的相互作用等功能需要用户来实现,且将跳过互作用等功能需要用户来实现,且将跳过Step 2Step 5,直接弹出,直接弹出“Step 6对话框。对话框。选择资源所使用的语言,这里是选择资源所使用的语言,这里是“中文中文中国中国,单击,单击Next按钮。按钮。图图4.6 SDI的的“Step 1”对话框对话框使用使用MFC AppWizard第二步第二步单击Next按钮进入下一步。 第三步第三步单击Next按钮进入下一步。 图图4.7 SDI的的“Step 2”对话框对话框图图4.8 SDI的的“Step 3”对话框对话框使用使用MFC AppWizard第四步第四步单击Next按钮
24、进入下一步。 使用使用MFC AppWizard第五步第五步在弹出的对话框在弹出的对话框(如图如图)中出现三个方面的选项,供用户来选择中出现三个方面的选项,供用户来选择: 应用程序的主窗口是应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览标准风格还是窗口左边有切分窗口的浏览器风格;器风格;在源文件中是否参加注释用来引导用户编写程序代码;在源文件中是否参加注释用来引导用户编写程序代码;使用动态链接库还是静态链接库。使用动态链接库还是静态链接库。保存缺省状态,单击保存缺省状态,单击Next按钮进行下一步。按钮进行下一步。图图 SDI的的“Step 5”对话框对话框使用使用MFC App
25、Wizard第六步第六步单击单击Finish按钮出现如下图的对话框按钮出现如下图的对话框 图图 SDI的的“Step 6”对话框对话框图图 项目信息对话框项目信息对话框使用使用MFC AppWizard编译并运行编译并运行图图4.13 应用程序运行结果应用程序运行结果菜单栏工具栏状态栏标题栏文档窗口第第3章章Windows编程与MFC应用程序的类和文件应用程序的类和文件类说明类说明 刚刚建立的应用程序中,虽然这个程序什么也不能做,但它已刚刚建立的应用程序中,虽然这个程序什么也不能做,但它已经具备了经具备了Windows应用程序应用程序 的根本特征、功能和框架。我们将对的根本特征、功能和框架。我
26、们将对AppWizard自动生成的应用程序框架进行分析,以加深对自动生成的应用程序框架进行分析,以加深对Windows应用程序设计的理解。应用程序设计的理解。AppWizard在生成应用程序时共派生了在生成应用程序时共派生了5个类:个类:CAboutDlg:“关于对话框的对话框类关于对话框的对话框类CMainFrame:主框架窗口类主框架窗口类CMyExpApp:应用程序类:应用程序类CMyExpDoc:文档类:文档类CMyExpView:视图类:视图类第第3章章Windows编程与MFCCAboutDlg:“关于对话框的对话框类关于对话框的对话框类 CAboutDlg是工程的对话框类,它是由
27、是工程的对话框类,它是由MFC类库中的类库中的Cdialog类派生出来的,关于对话框的内容将在以后的章节中详细介绍到。类派生出来的,关于对话框的内容将在以后的章节中详细介绍到。CMainFrame:主框架窗口类主框架窗口类 CMainFrame是工程的主框架窗口类,他的基类是是工程的主框架窗口类,他的基类是CFrameWnd,头文件为,实现文件。,头文件为,实现文件。 主框架窗口类用于管理主程序的窗口,并用来显示窗口的标题主框架窗口类用于管理主程序的窗口,并用来显示窗口的标题栏、工具栏和状态栏等,同时它还处理对窗口操作的消息,如窗口栏、工具栏和状态栏等,同时它还处理对窗口操作的消息,如窗口最大
28、化、最小化以及改变窗口大小等一般操作。最大化、最小化以及改变窗口大小等一般操作。CMyExpApp:应用程序类:应用程序类CMyExpApp是工程的应用程序类,他的基类是是工程的应用程序类,他的基类是CWinApp,头文件为,头文件为,实现文件为。,实现文件为。 应用程序类管理程序的整体以控制应用程序的所有对象,包括应用程序类管理程序的整体以控制应用程序的所有对象,包括文档、视图和边框窗口,并完成应用程序的初始化工作和程序退出文档、视图和边框窗口,并完成应用程序的初始化工作和程序退出时的去除工作。时的去除工作。第第3章章Windows编程与MFCCMyExpDoc:文档类:文档类 CMyExp
29、Doc负责存放程序的数据并读取磁盘文件数据,或将负责存放程序的数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。文档类必须通过视图类实现与用户磁盘文件数据写入磁盘文件中。文档类必须通过视图类实现与用户的交互。的交互。CMyExpView:视图类:视图类 CMyExpView主要负责管理视图窗口并显示文档类中的数据,主要负责管理视图窗口并显示文档类中的数据,其内容可以显示在屏幕上,也可以输出到打印机或其他设备上。它其内容可以显示在屏幕上,也可以输出到打印机或其他设备上。它也负责处理用户数据,同时接受用户对数据的鼠标、键盘操作并传也负责处理用户数据,同时接受用户对数据的鼠标、键盘操作并传给文
30、档类对象。给文档类对象。第第3章章Windows编程与MFC文件说明文件说明 AppWizard在自动生成应用程序框架时,除了生成刚刚介绍在自动生成应用程序框架时,除了生成刚刚介绍的各个类的头文件和实现文件外,还生成了一些为建立应用程序所的各个类的头文件和实现文件外,还生成了一些为建立应用程序所需要的其他文件。这些文件可以在应用程序生成时指定的路径中找需要的其他文件。这些文件可以在应用程序生成时指定的路径中找到。到。第第3章章Windows编程与MFC文件说明:文件说明:1、:类向导、:类向导ClassWizard的信息存储文件,存储由的信息存储文件,存储由ClassWizard编辑编辑已有的
31、类或添加新类的信息和由已有的类或添加新类的信息和由ClassWizard建立和编辑各种消息建立和编辑各种消息处理函数和映射变量等的信息。处理函数和映射变量等的信息。2、MyExp.dsp: Project文件,即工程文件。文件,即工程文件。Project文件中保存这一文件中保存这一个工程的各种信息,用于在翻开工程时使用。一个工程文件对应一个工程的各种信息,用于在翻开工程时使用。一个工程文件对应一个工程应用程序。个工程应用程序。3、MyExp.dsw:Workspace文件,即工作空间文件。一个文件,即工作空间文件。一个Workspace文件可包含一个或多个工程。该文件存储这一个工作空文件可包含
32、一个或多个工程。该文件存储这一个工作空间的组成情况如包含哪些程序工程、程序工程的依赖关系等,间的组成情况如包含哪些程序工程、程序工程的依赖关系等,用于存储和翻开一个工作空间。用于存储和翻开一个工作空间。4、MyExp.rc:资源定义文件,包含了程序资源的定义,其中保存了应资源定义文件,包含了程序资源的定义,其中保存了应用程序中使用到的各种资源信息,包括存储在文件夹中的图标、位用程序中使用到的各种资源信息,包括存储在文件夹中的图标、位图和光标等。图和光标等。5、Resource.h:标准的头文件,它包含了所有资源标准的头文件,它包含了所有资源ID号的定义,与文号的定义,与文件相对应。件相对应。第
33、第3章章Windows编程与MFC6、StdAfx.h:包含在所有包含在所有AppWizard程序中的标准头文件,用于生成程序中的标准头文件,用于生成预编译信息。预编译信息。7、:包含在所有、:包含在所有AppWizard程序中,它包含所有标准程序中,它包含所有标准include文件。文件。8、resMyExpDoc.ico:文件中包含了翻开文档时所用的图标文件。文件中包含了翻开文档时所用的图标文件。9、:资源定义文件,包含了用不能直接编辑的资源。它可以将所有不、:资源定义文件,包含了用不能直接编辑的资源。它可以将所有不能由资源编辑器编辑的资源防治到这个文件中。能由资源编辑器编辑的资源防治到这
34、个文件中。10、应用程序的图标文件。它包含在资源文件中。、应用程序的图标文件。它包含在资源文件中。11、resToolbar.bmp:用于创立工具栏按钮的位图文件。初时工具用于创立工具栏按钮的位图文件。初时工具栏和状态栏是在主边框窗口类中构造的。栏和状态栏是在主边框窗口类中构造的。12、:包含了对所有该程序文件的解释信息,并说明了所有创立的类、:包含了对所有该程序文件的解释信息,并说明了所有创立的类。第第3章章Windows编程与MFC事件驱动的程序设计事件驱动的程序设计 所有的所有的Windows应用程序都是由消息驱动的应用程序都是由消息驱动的message-driven或事件驱动,这也是或
35、事件驱动,这也是Windows编程方式与其它编程编程方式与其它编程方式最大的区别。方式最大的区别。事件驱动的程序设计方式是指,应用程序在屏幕上绘制几个界事件驱动的程序设计方式是指,应用程序在屏幕上绘制几个界面对象,如按钮、文本框和菜单等。应用程序通常通过一段称为事面对象,如按钮、文本框和菜单等。应用程序通常通过一段称为事件循环的代码来响应用户的操作。用户可以使用鼠标或键盘来任意件循环的代码来响应用户的操作。用户可以使用鼠标或键盘来任意操作屏幕上的对象。当用户用鼠标单击一个按钮就成为一个事件。操作屏幕上的对象。当用户用鼠标单击一个按钮就成为一个事件。事件驱动系统把用户的动作如鼠标单击和键盘操作定
36、义为事件,也事件驱动系统把用户的动作如鼠标单击和键盘操作定义为事件,也把系统操作入更新屏幕定义为事件。也就是说,用户对以窗口形式把系统操作入更新屏幕定义为事件。也就是说,用户对以窗口形式显示的数据进行操作。每一个不同的操作对于显示的数据进行操作。每一个不同的操作对于Windows程序来说程序来说,都相当于发生了某个事件。对英语每个不同的事件,都相当于发生了某个事件。对英语每个不同的事件,Windows传送不同的消息给不同的类的对象。每个不同类的对象不同的消息传送不同的消息给不同的类的对象。每个不同类的对象不同的消息都会调用不同的处理函数执行有关处理,并把处理结果通过窗口界都会调用不同的处理函数
37、执行有关处理,并把处理结果通过窗口界面向用户显示。如此循环往复,最终完成用户需要完成的工作。面向用户显示。如此循环往复,最终完成用户需要完成的工作。第第3章章Windows编程与MFC标准的标准的Windows消息消息所有以所有以WM_为前缀的消息为前缀的消息WM_COMMAND消息除外都消息除外都是标准的是标准的Windows消息,包括键盘消息、鼠标消息和窗口消息。消息,包括键盘消息、鼠标消息和窗口消息。他们一般由窗口对象和视图对象进行处理。窗口对象指的是从他们一般由窗口对象和视图对象进行处理。窗口对象指的是从CWnd类中派生出的类的对象,如从类中派生出的类的对象,如从CWnd、CFrame
38、Wnd、CMDIFrameWnd、CMDIChildWnd、Cview和和Cdialog等等MFC类或这些类的派生类中定义的对象。类或这些类的派生类中定义的对象。第第3章章Windows编程与MFC1、键盘消息、键盘消息在程序运行过程中,当用户对键盘进行操作时,会产生对应的消在程序运行过程中,当用户对键盘进行操作时,会产生对应的消息,系统将把此消息发送给对应的窗口。息,系统将把此消息发送给对应的窗口。如当键盘的某个键被按下时将产生如当键盘的某个键被按下时将产生WM_CHAR消息,这个消息带消息,这个消息带有字符代码值、重复赤松和先前状态码有字符代码值、重复赤松和先前状态码3个参数。个参数。WM
39、_CHAR消息的处消息的处理函数为理函数为OnChar,此函数的原型为:,此函数的原型为:afx_msg void onChar(UINT nChar,UINT nRepCnt,UINT nFlags);其中:其中:nChar是所按键的字符代码值。是所按键的字符代码值。nRepCnt是重复的次数,它表示用户按键时重复击键的次数。是重复的次数,它表示用户按键时重复击键的次数。nFlags表示扫描码、先前键状态和键转换状态等,其参数值如图表示扫描码、先前键状态和键转换状态等,其参数值如图位位含义含义015指明键重复按下的次数1623指定扫描码24如果同时按下扩展键(Alt),则为1,反之为0252
40、8由Windows内部使用第第3章章Windows编程与MFC键盘消息的类型有以下几种:键盘消息的类型有以下几种:1、WM_KEYDOWN:表示某一键被按下。:表示某一键被按下。2、WM_KEYUP:表示某一键弹起。:表示某一键弹起。3、WM_CHAR:表示某一键被按下且弹起,输入了一个字符。:表示某一键被按下且弹起,输入了一个字符。与这些消息相应的消息处理函数的原型分别为:与这些消息相应的消息处理函数的原型分别为:afx_msg void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags);afx_msg void OnKeyUp(UINT nCha
41、r,UINT nRepCnt,UINT nFlags);afx_msg void onChar(UINT nChar,UINT nRepCnt,UINT nFlags);第第3章章Windows编程与MFC2、鼠标消息、鼠标消息在在Windows中处理鼠标操作的方法根本上有以下中处理鼠标操作的方法根本上有以下3种:种:1单击单击Click:表示按一下鼠标:表示按一下鼠标 的左键或右键,然后释放。的左键或右键,然后释放。2双击双击Double Click:表示快速连续按两下鼠标左键。:表示快速连续按两下鼠标左键。3拖动拖动Drag:指按住鼠标的按键后,再移动鼠标。:指按住鼠标的按键后,再移动鼠标
42、。消息类型:消息类型:WM_MOUSEMOVE:鼠标移动:鼠标移动WM_LBUTTONDOWN:按下鼠标左键:按下鼠标左键WM_MBUTTONDOWN:按下鼠标中间键:按下鼠标中间键WM_RBUTTONDOWN:按下数百右键:按下数百右键所有这些鼠标消息的处理函数都有相似的原型,且都有两个参数。所有这些鼠标消息的处理函数都有相似的原型,且都有两个参数。如:处理鼠标左键按下的消息函数如:处理鼠标左键按下的消息函数OnLButtonDown:Afx_msg void OnLbuttonDown (UINT nFlags,Cpoint point);Point 是鼠标事件发生时光标的位置,是鼠标事件
43、发生时光标的位置,nFlags表示某些键的状态。表示某些键的状态。第第3章章Windows编程与MFC3、控件消息、控件消息控件是一个小的子窗口,它隶属于其他窗口如对话框等,控件是一个小的子窗口,它隶属于其他窗口如对话框等,能接受操作并向父窗口发送消息。常见的控件有按钮、列表框、编能接受操作并向父窗口发送消息。常见的控件有按钮、列表框、编辑框、符合框和滚动条等。辑框、符合框和滚动条等。控件消息分为两类:控件消息分为两类:1从控件传给消息,通常这类消息的前缀的最后一个字符从控件传给消息,通常这类消息的前缀的最后一个字符 为为N。2由系统发送给控件的消息,这类消息的前缀的最后一个由系统发送给控件的
44、消息,这类消息的前缀的最后一个 字符为字符为M。 与其他标准的与其他标准的Windows消息一样,空间消息也是由窗口对象消息一样,空间消息也是由窗口对象和视图对象对其进行处理的。和视图对象对其进行处理的。第第3章章Windows编程与MFC4、命令消息、命令消息命令消息主要包括由用户界面对象发送的命令消息主要包括由用户界面对象发送的WM_COMMAND消消息,用户界面对象是指菜单、工具栏和快捷键等。它和控件消息的息,用户界面对象是指菜单、工具栏和快捷键等。它和控件消息的区别在于:控件消息只能由特定控件向区别在于:控件消息只能由特定控件向Windows系统传送,而命系统传送,而命令消息是由用户界
45、面发送的,它可以被更多的对象处理。在文档对令消息是由用户界面发送的,它可以被更多的对象处理。在文档对象、视图对象、窗口对象以及空间对象中都能处理这种消息。象、视图对象、窗口对象以及空间对象中都能处理这种消息。第第3章章Windows编程与MFC消息的发送和接收的根本过程和机制消息的发送和接收的根本过程和机制应用程序进行了初始化后就会调用应用程序进行了初始化后就会调用CWinApp的成员函数的成员函数Run开始每人的消息循环。开始每人的消息循环。Run函数的工作就是得到并函数的工作就是得到并发送发送Windows消息直到收到消息直到收到WM_QUIT消息。消息。Run函数首函数首先调用先调用Pr
46、eTranslateMessage成员函数进行某些特殊处理成员函数进行某些特殊处理,之后调用,之后调用Windows函数函数TranslateMessage做标准键盘翻译做标准键盘翻译,最后是,最后是DispatchMessage分发消息,并将消息发送到适分发消息,并将消息发送到适当的窗口。当的窗口。第第3章章Windows编程与MFC消息的发送和接收的根本过程和机制消息的发送和接收的根本过程和机制消息循环对标准的消息循环对标准的Windows消息和控件消息的发送和接收比消息和控件消息的发送和接收比较直接。当消息循环接受到一条较直接。当消息循环接受到一条Windows消息或控件消息时,它消息或
47、控件消息时,它首先通过查询一种内部结构来确定消息要发送的窗口,出口对应的首先通过查询一种内部结构来确定消息要发送的窗口,出口对应的窗口类将对其进行处理。每个窗口对象都有自己的消息映射和处理窗口类将对其进行处理。每个窗口对象都有自己的消息映射和处理函数。函数。MFC的积累将检测这一目标类是否在其消息中为这一消息提的积累将检测这一目标类是否在其消息中为这一消息提供了处理函数入口。如果找到入口,那么消息被送往处理函数,并供了处理函数入口。如果找到入口,那么消息被送往处理函数,并结束消息发送过程;如果消息无对应入口,那么对目标类进行积累结束消息发送过程;如果消息无对应入口,那么对目标类进行积累消息映射
48、检测,并沿着层次向上查找,知道找到入口函数为止。消息映射检测,并沿着层次向上查找,知道找到入口函数为止。第第3章章Windows编程与MFC消息处理函数消息处理函数 CCmdTarget类:由类:由Cobject类直接派生而生,它负责将消类直接派生而生,它负责将消息发送到能够响应这些消息的对象。它是所有能进行消息映射的息发送到能够响应这些消息的对象。它是所有能进行消息映射的MFC类的基类,如类的基类,如CWinThread、CWinApp、Cview等类的基类等类的基类。消息映射就是将消息或命令发送到程序员为处理消息所编写的函。消息映射就是将消息或命令发送到程序员为处理消息所编写的函数中,使其
49、对消息进行处理。所有的窗口类都是由数中,使其对消息进行处理。所有的窗口类都是由CCmdTarget派派生的,程序员只需处理那些感兴趣的消息,而将其他消息交给高级生的,程序员只需处理那些感兴趣的消息,而将其他消息交给高级的类处理。的类处理。 ClassWizard是一个功能非常强大的工具,我们可以用是一个功能非常强大的工具,我们可以用ClassWizard来创立新类、定义消息处理函数、覆盖来创立新类、定义消息处理函数、覆盖MFC的虚函数的虚函数以及从对话框、表单视图或记录视图的控件中获取数据。以及从对话框、表单视图或记录视图的控件中获取数据。本节中我们先介绍利用本节中我们先介绍利用ClassWi
50、zard管理窗口消息处理函数的管理窗口消息处理函数的方法和步骤,利用方法和步骤,利用ClassWizard管理控件消息处理函数和命令消息管理控件消息处理函数和命令消息处理函数的方法放到其他章节介绍。处理函数的方法放到其他章节介绍。第第3章章Windows编程与MFC消息和消息映射消息和消息映射消息分类消息分类Windows应用程序中的消息主要有三种类型。u窗口消息窗口消息(Windows message)主要指由WM_开头的消息,一般由窗口类和视图类对象来处理。窗口消息往往带有参数,以标志处理消息的方法。u控件的通知消息控件的通知消息(Control notifications)当控件的状态发
51、生改变时,控件就会向其父窗口发送WM_COMMAND通知消息。应用程序框架处理控件消息的方法和窗口消息相同,但按钮的BN_CLICKED通知消息除外,它的处理方法与命令消息相同。u命令消息命令消息(Command message)主要包括由用户交互对象(菜单、工具条的按钮、快捷键等)发送的WM_COMMAND通知消息。命令消息的处理方式与其他两种消息不同,它能够被多种对象接收、处理,这些对象包括文档类、文档模板类、应用程序本身以及窗口和视类等;而窗口消息和控件的通知消息是由窗口对象接收并处理的,这里的窗口对象是指从CWnd中派生的类的对象,它包括CFrameWnd、CMDIFrameWnd、C
52、MDIChildWnd、CView、CDialog以及从这些类派生的对象等。 第第3章章Windows编程与MFC消息映射与消息处理函数消息映射与消息处理函数在在Visual C+中,用户只需要编写对于该消息发生响应的函中,用户只需要编写对于该消息发生响应的函数,而数,而Visual C+内部将自动为用户添加一个消息映射关系。通内部将自动为用户添加一个消息映射关系。通过消息映射,消息就和它的处理函数对应起来。过消息映射,消息就和它的处理函数对应起来。消息处理函数指的是与某个消息消息对应的函数。消息处理函消息处理函数指的是与某个消息消息对应的函数。消息处理函数的执行是由其对应的消息引发的,某个类
53、对象中的消息处理函数数的执行是由其对应的消息引发的,某个类对象中的消息处理函数是与这个类对象能够得到的一个消息对应的,当这个消息发生时,是与这个类对象能够得到的一个消息对应的,当这个消息发生时,这个函数就会被执行。这个函数就会被执行。消息处理函数的定义与使用方法与类的一般的成员函数不同。消息处理函数的定义与使用方法与类的一般的成员函数不同。一般成员函数包括两局部:函数的定义局部和函数的实现局部。定一般成员函数包括两局部:函数的定义局部和函数的实现局部。定义一个一般成员函数时,在类中定义函数的原型,在实现文件中书义一个一般成员函数时,在类中定义函数的原型,在实现文件中书写函数的实现代码。而消息处
54、理函数除了这两局部以外还有消息映写函数的实现代码。而消息处理函数除了这两局部以外还有消息映射局部,通过消息映射在消息处理函数和引发它的消息之间建立联射局部,通过消息映射在消息处理函数和引发它的消息之间建立联系。消息处理函数的定义方法与一般成员函数也不完全相同。系。消息处理函数的定义方法与一般成员函数也不完全相同。第第3章章Windows编程与MFC概述概述翻开翻开MFC的的ClassWizard的方法:的方法:选择选择“View“ClassWizard菜单或直接使用菜单或直接使用Ctrl+W快捷键快捷键。在源代码文件的文档编辑窗口中,右击鼠标,选择在源代码文件的文档编辑窗口中,右击鼠标,选择C
55、lassWizard命命令。令。当当ClassWizard翻开后,就会弹出如图的翻开后,就会弹出如图的MFC ClassWizard对话对话框。框。 图图 MFC ClassWiard对话框对话框第第3章章Windows编程与MFC例如,向CEx_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,那么可按以下步骤进行:(1)按Ctrl+W快捷键翻开MFC ClassWizard对话框。(2)在Class name组合框中,将类名选定为CEx_SDIHelloView。(3)在Object IDs列表框中选定CEx_SDIHelloView,而在Messages列表中选定WM
56、_LBUTTOMDOWN消息。(4)双击Messages列表中的WM_LBUTTOMDOWN消息或单击Add Function按钮,都会在CEx_SDIHelloView类中添加该消息的映射函数OnLButtonDown,同时在Member funcions列表中显示这一消息映射函数和被映射的消息,如图。图图 映射映射WM_LBUTTONDOWN消息消息第第3章章Windows编程与MFC(5)单击Edit Code,转向文档窗口,定位到OnLButtonDown源代码处。(6)添加以下代码:void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CP
57、oint point) / TODO: Add your message handler code here and/or call defaultMessageBox (你好,我的Visual C+世界!, 问候, 0) ;CView:OnLButtonDown(nFlags, point);(7)程序运行后,在窗口客户区左击,弹出一个消息对话框。第第3章章Windows编程与MFC类的添加和删除类的添加和删除用用MFC ClassWizard给工程添加一个类通常是按以下步骤进给工程添加一个类通常是按以下步骤进行的:行的:(1)按快捷键按快捷键Ctrl+W启动启动MFC ClassWizar
58、d对话框。单击对话框。单击Add Class,选择,选择New命令,如下图的命令,如下图的New Class对话框。对话框。图图 New Class对话框对话框第第3章章Windows编程与MFC(2)对话框中,Name框是用来输入用户定义的类名,注意要以“C字母打头,以保持与MFC标识符命名规那么一致;File Name是该类的源代码文件名,单击Change按钮可改变源文件名称及其在磁盘中的位置;Base class框用来指定该类的基类;Dialog ID框是中选择CDialog作为基类时指定对话框的资源ID号。最下面的Automation是用来设置对自动化的支持。(3)单击OK按钮,一个新
59、类就会自动添加到工程中。而当添加的类需要删除时,那么需要按以下步骤进行:(1)将翻开的所有文档窗口关闭。(2)将工程工作区窗口切换到FileView页面,展开Source Files和Header Files结点,分别选定要删除类的对应.h和.cpp文件,按下Delete键,删除这两个文件。(3)选择“File“Close Workspace菜单命令,关闭工程。(4)从实际的文件夹中删除对应的.h和.cpp文件与.clw文件。需要注意的是,当下一次翻开MFC ClassWizard对话框时,就会弹出Select Source Files对话框,这时只要单击右下的Add All按钮即可。第第3章
60、章Windows编程与MFC应用程序的执行过程分析应用程序的执行过程分析在前面我们建立了一个什么都没有操作的在前面我们建立了一个什么都没有操作的MFC应用程序,虽然应用程序,虽然它已经能够运行,但该程序又是从哪里执行和从哪里得到控制的?它已经能够运行,但该程序又是从哪里执行和从哪里得到控制的?一个一个MFC应用程序的执行过程可分为以下几步:应用程序的执行过程可分为以下几步:1、调用、调用CWinApp类的构造函数类的构造函数2、程序的入口函数、程序的入口函数WinMain得到程序控制得到程序控制3、在、在WinMain函数执行的过程中调用程序类的函数执行的过程中调用程序类的InitInstance 函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水利水电工程环保技术应用试题及答案
- 研究方法设计与实施路径
- 工程经济的政策影响与建议试题及答案
- 水利水电工程对气候变化的适应策略试题及答案
- 管理技巧的2025年中级经济师试题及答案
- 病毒性心肌炎健康教育
- 行政管理经济法复习知识检验试题及答案
- 危险的小圆珠健康风险解析
- 2025年工程经济项目融资设计试题及答案
- 深海潜水旅游活动安全与责任告知合同
- 石膏自流平标准jc1023
- 2024至2030年全球及中国比特币和加密货币钱包细分市场深度研究报告
- 2023年海南省中考物理试题(解析版)
- DL-T+544-2012电力通信运行管理规程
- 食品安全日管控、周排查及月调度记录表
- 2024年浙江省绍兴市高二下学期期末调测数学试题及答案
- 计算机程序设计员国家职业技能标准
- 《人民调解法》讲解
- 新加坡员工合同范本
- 《无人机测绘技能训练模块》课件-模块9:无人机解析空中三角测量
- 江苏省镇江外国语学校2024届中考四模数学试题含解析
评论
0/150
提交评论