VC++ 课件 第3章 Windows编程与MFC.ppt_第1页
VC++ 课件 第3章 Windows编程与MFC.ppt_第2页
VC++ 课件 第3章 Windows编程与MFC.ppt_第3页
VC++ 课件 第3章 Windows编程与MFC.ppt_第4页
VC++ 课件 第3章 Windows编程与MFC.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章Windows编程与MFC,MFC应用程序执行的大致流程; MFC的概念和作用; Windows应用程序的特点和运行机制; 消息的概念,机制; 利用MFC AppWizard 来创建Windows应用程序的步骤和方法; 创建应用程序中所产生的主要类及其功能、组成文件和程序的框架结构;,第3章Windows编程与MFC,3.1.1Windows系统特点 Windows操作系统是由Microsoft公司推出的基于个人电脑的图形操作系统。其有以下几个特点: 1、标准的图形用户界面,如窗口、菜单、按钮和列表框等。 2、应用程序与硬件无关的特性,对于同一类硬件,不管厂家和型号程序都无需进行如何修改

2、就可以运行。 3、所有的Windows应用程序都是消息驱动机制,也就是说,Winsows程序是通过操作系统发送 的消息来处理用户输入的。,第3章Windows编程与MFC,3.1.2事件与消息的概念 在Windows操作系统中,无论是系统产生的动作或是用户在运行应用程序中发出的操作动作都称为事件(Events),而消息(Message)用于描述某个事件发生的信息。事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件的响应。例如:按下鼠标左键,系统就会产生一条特定的消息,标志鼠标按键事件的发生。,第3章Windows编程与MFC,Windows应用程

3、序执行的基本流程,图3.1 Windows应用程序的基本流程,第3章Windows编程与MFC,图中的WM_QUIT是消息值,表示应用程序退出的消息。 在Visual C+编程过程中,系统规定每一种消息用一个特定的值表示,为了便于记忆,系统针对每一个消息值定义了对应的符号常量,如 WM_LBUTTONDOWN表示鼠标左键按下的消息,WM_LBUTTONUP表示鼠标左肩抬起的消息,WM_SIZE表示改变窗口尺寸的消息 ,第3章Windows编程与MFC,在应用程序运行中,消息是最重要的通信手段,在编程过程 中,Windows中的每一个消息中所包括的所有信息用一个MSG结构体来表示,MSG结构体的

4、定义如下: typedef struct tagMSG HWND hwnd; /获取消息的窗口句柄 UINT message; /消息编号 WPARAM wParam; /记录消息附加信息的字参数 LPARAM lParam; /记录消息附加信息的长字参数 DWORD time; /消息被发送到消息队列的时间 POINT pt; /消息发送时的光标所在位置 MSG; 其中的HWND、UINT、WPARAM、DWORD等都是在Visual C系统中针对Windows编程所定义的扩充数据类型。,第3章Windows编程与MFC,需要说明的是: 图3.1的流程是一个循环的流程;Windows所能向应

5、用程序发送的消息多达数百种,但是对于一般的应用程序来说,只有其中的一部分有意义。 如:如果应用程序中需要用鼠标来操作,则WM_KEYUP、WM_KEYDOWN和WM_CHAR等消息就没有如何意义,因为这些消息都是与按键有关的消息,也就是说,应用程序不需要处理这些消息,对于这些消息,只需要交给Windows作默认的处理即可。因此,在应用程序中所处理的消息只是所有消息中的一小部分。,第3章Windows编程与MFC,Windows应用程序实际上是由一系列的消息处理代码来实现的。这和我们传统的过程式编程方法很不一样,我们只能预测用户所利用的程序用户界面对象所进行的操作以及为这些操作编写处理代码,却不

6、可预测这些操作在什么时候发生或是什么顺序来发生,所以说,我们不可能知道什么消息会在什么时候以什么顺序来临。 Windows应用程序在处理消息时使用了一种叫做回调函数(callback function)的特殊函数。回调函数由应用程序定义,但是,在应用程序中并没有调用回调函数的代码,回调函数是供操作系统或者其子系统调用的,这种调用通常发生在某一事件发生时.典型的回调函数有窗口过程、对话框过程或构造函数。如:窗口过程函数的原型如下: LRESULT CALLBACK WindowProc ( HWND hwnd,/窗口句柄 unit uMsg,/消息标识 WPARAM wParam,/包含信息内容

7、的参数 LPARAM lParam/包含消息内容的参数 );,第3章Windows编程与MFC,3.2Windows编程中常用的数据类型和句柄 3.2.1数据类型 Visual C+编程过程中,经常会遇到一些Visual C的扩充数据类型,大多数是在原有C基本类型的基础上定义了新的便于记忆的名称,而有些是新扩充的数据类型。如:,第3章Windows编程与MFC,3.2.2Windows编程中常用的句柄 在Windows中,对象可以是所有的规范的部件,如窗口、菜单栏、工具栏、按钮和编辑框等。当然我们自己编写的程序也可称为对象。 句柄(Handle)是Windows编程中的一个重要的概念。句柄是一

8、个4字节长的整数值,是应用程序中不同对象的编号,每个对象的句柄是唯一的。应用程序通过句柄来访问相应的对象。如:,第3章Windows编程与MFC,每个对象除了句柄外,另外还有一个识别码(ID),它也是一个4字节长的整数值,可以看作是对象的名字,但是句柄和Id的区别主要有以下几个方面: 1、句柄是系统内给定的,而ID是用户自行定义的。 2、句柄是创建窗口时得到的,而ID是程序编写时确定的。 3、句柄具有唯一性,而ID可以重复。,第3章Windows编程与MFC,3.3利用MFC AppWizard 创建Windows应用程序 3.3.1MFC简介 Windows SDK:Windows Soft

9、ware Development Kit Windows 软件开发工具包 Windows API:Windows Application Programming Interface Windows应用程序接口 MFC :Microsoft Foundation Class 微软基础类库,第3章Windows编程与MFC,Windows SDK和Windows API紧密联系,是一套帮助C语言程序员创建Windows应用程序的工具,它包含: 1、Windows编程中可能用到的函数、消息、结构体、宏及其他资 源的帮助信息。 2、各种编程工具,如对话框编辑器、图像编辑器等。 3、Windows库及头

10、文件。 4、使用C语言编写的示例程序。 Windows SDK的最新版本是Win32 SDK,当我们在安装Visual C6.0系统时,它会被自动安装上。 基于API设计Windows应用程序时,程序开发者需要直接调用API函数,必须编写大量代码,并且要熟知Windows应用程序的框架,因此,程序开发难度高而且开发周期长。但是,采用这种方法编写程序可以使应用程序获得更高的效率,编写程序时有较大的自由度。,第3章Windows编程与MFC,3.3.1MFC简介 编写Windows应用程序,可采用两种方法: 1、直接使用Windows SDK(软件开发包)调用Windows API(应用程序接口)

11、函数的编程方法; 2、基于MFC(微软基础类库)的程序设计方法。 MFC是Microsoft公司推出的用于创建Windows应用程序的一套C类库。MFC按照C类的层次形式组织在一起,几个层次较高的类提供一般的功能,而此次较低的类去实现更具体的功能。每个低层次的类都是从高层类中派生出来的,因此继承了高层次的行为。在MFC类库中封装了大多数的Windows API函数,取而代之的是对程序员更友好的C类,很多Windows程序所共有的标准内容可以有MFC的类来提供。如窗口、按钮等标准部件都有相应的类,程序中用到这些标准部件时,直接使用即可。因此,使用MFC编程程序员可以把注意力集中于自己的程序所特有

12、的部分,不需要事事亲自来编。大大减少了程序代码的编写量,是编程变得更容易轻松。,第3章Windows编程与MFC,需要说明的: MFC还提供了一个应用程序开发模型,即文档/视图模型(DOC / View),是将应用程序数据与用户界面元素分离的一种应用编程方法。它允许这两部分程序独立存在,这样,程序员在更改其中一部分程序的时候,不会大量更改另一部分程序。 Visual C6.0应用程序开发环境特别适合于使用MFC。,第3章Windows编程与MFC,3.3.2利用MFC AppWizard创建Windows应用程序 MFC AppWizard:应用程序向导 在Visual C下可创建各种类型的应

13、用程序,而不同的应用程序具有不同的应用程序框架,为方便用户生成和利用这些框架,Visual C+6.0提供了MFC AppWizard,它可以帮助用户自动生成一些常用的标准程序结构框架。 如:基于MFC的Windows应用程序结构、DLL应用程序结构、单文档(SDI)应用程序结构和多文档(MDI)应用程序结构等。在这些程序框架中,最常用的是开发基于MFC的一般应用程序(MFC AppWizard(exe)。,第3章Windows编程与MFC,3.3.2创建一个单文档应用程序 开始 选择“File”“New”,选择Projects标签;选择MFC AppWizard(exe)的项目类型(该类型用

14、于创建可执行的Windows应用程序),将项目工作文件夹定位在“D:Visual C+ 6.0程序”,并在“Project Name”框中输入项目名Ex_SDIHello,如图,单击OK。,图4.5 MFC AppWizard的“New”对话框,4.3使用MFC AppWizard,第一步 从应用程序类型Single Document、Multiple Document和Dialog Based中选择SDI。 决定应用程序中是否需要MFC的“文档/视图”结构的支持。若不选定此项,则程序中的磁盘文件的打开、保存以及文档和视图的相互作用等功能需要用户来实现,且将跳过Step 2Step 5,直接弹

15、出“Step 6”对话框。 选择资源所使用的语言,这里是“中文中国”,单击Next按钮。,图4.6 SDI的“Step 1”对话框,4.3使用MFC AppWizard,第二步 单击Next按钮进入下一步。 第三步 单击Next按钮进入下一步。,图4.7 SDI的“Step 2”对话框,图4.8 SDI的“Step 3”对话框,4.3使用MFC AppWizard,第四步 单击Next按钮进入下一步。,4.3使用MFC AppWizard,第五步 在弹出的对话框(如图)中出现三个方面的选项,供用户来选择: 应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览器风格; 在源文件中是否加入

16、注释用来引导用户编写程序代码; 使用动态链接库还是静态链接库。 保留缺省状态,单击Next按钮进行下一步。,图 SDI的“Step 5”对话框,4.3使用MFC AppWizard,第六步 单击Finish按钮出现如图所示的对话框,图 SDI的“Step 6”对话框,图 项目信息对话框,4.3使用MFC AppWizard,编译并运行,第3章Windows编程与MFC,3.4MFC应用程序的类和文件 3.4.1类说明 刚刚建立的应用程序中,虽然这个程序什么也不能做,但它已经具备了Windows应用程序 的基本特征、功能和框架。我们将对AppWizard自动生成的应用程序框架进行分析,以加深对W

17、indows应用程序设计的理解。 AppWizard在生成应用程序时共派生了5个类: CAboutDlg:“关于”对话框的对话框类 CMainFrame:主框架窗口类 CMyExpApp:应用程序类 CMyExpDoc:文档类 CMyExpView:视图类,第3章Windows编程与MFC,CAboutDlg:“关于”对话框的对话框类 CAboutDlg是工程的对话框类,它是由MFC类库中的Cdialog类派生出来的,关于对话框的内容将在以后的章节中详细介绍到。 CMainFrame:主框架窗口类 CMainFrame是工程的主框架窗口类,他的基类是CFrameWnd,头文件为MainFrm.

18、h,实现文件MainFrm.cpp。 主框架窗口类用于管理主程序的窗口,并用来显示窗口的标题栏、工具栏和状态栏等,同时它还处理对窗口操作的消息,如窗口最大化、最小化以及改变窗口大小等一般操作。 CMyExpApp:应用程序类 CMyExpApp是工程的应用程序类,他的基类是CWinApp,头文件为MyExp.h,实现文件为MyExp.app。 应用程序类管理程序的整体以控制应用程序的所有对象,包括文档、视图和边框窗口,并完成应用程序的初始化工作和程序退出时的清除工作。,第3章Windows编程与MFC,CMyExpDoc:文档类 CMyExpDoc负责存放程序的数据并读取磁盘文件数据,或将磁盘

19、文件数据写入磁盘文件中。文档类必须通过视图类实现与用户的交互。 CMyExpView:视图类 CMyExpView主要负责管理视图窗口并显示文档类中的数据,其内容可以显示在屏幕上,也可以输出到打印机或其他设备上。它也负责处理用户数据,同时接受用户对数据的鼠标、键盘操作并传给文档类对象。,第3章Windows编程与MFC,3.4.2文件说明 AppWizard在自动生成应用程序框架时,除了生成刚才介绍的各个类的头文件和实现文件外,还生成了一些为建立应用程序所需要的其他文件。这些文件可以在应用程序生成时指定的路径中找到。,第3章Windows编程与MFC,文件说明: 1、MyExp.clw:类向导

20、ClassWizard的信息存储文件,存储由ClassWizard编辑已有的类或添加新类的信息和由ClassWizard建立和编辑各种消息处理函数和映射变量等的信息。 2、MyExp.dsp: Project文件,即项目文件。Project文件中保存这一个项目的各种信息,用于在打开项目时使用。一个项目文件对应一个项目应用程序。 3、MyExp.dsw:Workspace文件,即工作空间文件。一个Workspace文件可包含一个或多个工程。该文件存储这一个工作空间的组成情况(如包含哪些程序项目、程序项目的依赖关系等),用于存储和打开一个工作空间。 4、MyExp.rc:资源定义文件,包含了程序资

21、源的定义,其中保存了应用程序中使用到的各种资源信息,包括存储在文件夹中的图标、位图和光标等。 5、Resource.h:标准的头文件,它包含了所有资源ID号的定义,与MyExp.rc文件相对应。,第3章Windows编程与MFC,6、StdAfx.h:包含在所有AppWizard程序中的标准头文件,用于生成预编译信息。 7、StdAfx.cpp:包含在所有AppWizard程序中,它包含所有标准include文件。 8、resMyExpDoc.ico:文件中包含了打开文档时所用的图标文件。 9、resMyExp.rc2:资源定义文件,包含了用Vsual C+6.0不能直接编辑的资源。它可以将所

22、有不能由资源编辑器编辑的资源防治到这个文件中。 10、resMyExp.ico应用程序的图标文件。它包含在资源文件MyExp.rc中。 11、resToolbar.bmp:用于创建工具栏按钮的位图文件。初时工具栏和状态栏是在主边框窗口类中构造的。 12、ReadMe.txt:包含了对所有该程序文件的解释信息,并说明了所有创建的类。,第3章Windows编程与MFC,3.5.1事件驱动的程序设计 所有的Windows应用程序都是由消息驱动的(message-driven)(或事件驱动),这也是Windows编程方式与其它编程方式最大的区别。 事件驱动的程序设计方式是指,应用程序在屏幕上绘制几个界

23、面对象,如按钮、文本框和菜单等。应用程序通常通过一段称为事件循环的代码来响应用户的操作。用户可以使用鼠标或键盘来任意操作屏幕上的对象。当用户用鼠标单击一个按钮就成为一个事件。事件驱动系统把用户的动作如鼠标单击和键盘操作定义为事件,也把系统操作入更新屏幕定义为事件。也就是说,用户对以窗口形式显示的数据进行操作。每一个不同的操作对于Windows程序来说,都相当于发生了某个事件。对英语每个不同的事件,Windows传送不同的消息给不同的类的对象。每个不同类的对象不同的消息都会调用不同的处理函数执行有关处理,并把处理结果通过窗口界面向用户显示。如此循环往复,最终完成用户需要完成的工作。,第3章Win

24、dows编程与MFC,3.5.2标准的Windows消息 所有以WM_为前缀的消息(WM_COMMAND消息除外)都是标准的Windows消息,包括键盘消息、鼠标消息和窗口消息。他们一般由窗口对象和视图对象进行处理。窗口对象指的是从CWnd类中派生出的类的对象,如从CWnd、CFrameWnd、CMDIFrameWnd、CMDIChildWnd、Cview和Cdialog等MFC类或这些类的派生类中定义的对象。,第3章Windows编程与MFC,1、键盘消息 在程序运行过程中,当用户对键盘进行操作时,会产生对应的消息,系统将把此消息发送给对应的窗口。 如当键盘的某个键被按下时将产生WM_CHA

25、R消息,这个消息带有字符代码值、重复赤松和先前状态码3个参数。WM_CHAR消息的处理函数为OnChar(),此函数的原型为: afx_msg void onChar(UINT nChar,UINT nRepCnt,UINT nFlags); 其中:nChar是所按键的字符代码值。 nRepCnt是重复的次数,它表示用户按键时重复击键的次数。 nFlags表示扫描码、先前键状态和键转换状态等,其参数值如图,第3章Windows编程与MFC,键盘消息的类型有以下几种: 1、WM_KEYDOWN:表示某一键被按下。 2、WM_KEYUP:表示某一键弹起。 3、WM_CHAR:表示某一键被按下且弹起

26、,输入了一个字符。 与这些消息相应的消息处理函数的原型分别为: afx_msg void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags); afx_msg void OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags); afx_msg void onChar(UINT nChar,UINT nRepCnt,UINT nFlags);,第3章Windows编程与MFC,2、鼠标消息 在Windows中处理鼠标操作的方法基本上有以下3种: (1)单击(Click):表示按一下鼠标 的左键或右键,然后释放。 (2)双

27、击(Double Click):表示快速连续按两下鼠标左键。 (3)拖动(Drag):指按住鼠标的按键后,再移动鼠标。 消息类型: WM_MOUSEMOVE:鼠标移动 WM_LBUTTONDOWN:按下鼠标左键 WM_MBUTTONDOWN:按下鼠标中间键 WM_RBUTTONDOWN:按下数百右键 所有这些鼠标消息的处理函数都有相似的原型,且都有两个参数。 如:处理鼠标左键按下的消息函数OnLButtonDown(): Afx_msg void OnLbuttonDown (UINT nFlags,Cpoint point); Point 是鼠标事件发生时光标的位置,nFlags表示某些键的

28、状态。,第3章Windows编程与MFC,3、控件消息 控件是一个小的子窗口,它隶属于其他窗口(如对话框等),能接受操作并向父窗口发送消息。常见的控件有按钮、列表框、编辑框、符合框和滚动条等。 控件消息分为两类: (1)从控件传给消息,通常这类消息的前缀的最后一个字符 为N。 (2)由系统发送给控件的消息,这类消息的前缀的最后一个 字符为M。 与其他标准的Windows消息一样,空间消息也是由窗口对象和视图对象对其进行处理的。,第3章Windows编程与MFC,4、命令消息 命令消息主要包括由用户界面对象发送的WM_COMMAND消息,用户界面对象是指菜单、工具栏和快捷键等。它和控件消息的区别

29、在于:控件消息只能由特定控件向Windows系统传送,而命令消息是由用户界面发送的,它可以被更多的对象处理。在文档对象、视图对象、窗口对象以及空间对象中都能处理这种消息。,第3章Windows编程与MFC,3.6消息的发送和接收的基本过程和机制 应用程序进行了初始化后就会调用CWinApp的成员函数Run()开始每人的消息循环。Run()函数的工作就是得到并发送Windows消息直到收到WM_QUIT消息。Run()函数首先调用PreTranslateMessage()成员函数进行某些特殊处理,之后调用Windows函数TranslateMessage做标准键盘翻译,最后是DispatchMe

30、ssage()分发消息,并将消息发送到适当的窗口。,第3章Windows编程与MFC,3.6消息的发送和接收的基本过程和机制 消息循环对标准的Windows消息和控件消息的发送和接收比较直接。当消息循环接受到一条Windows消息或控件消息时,它首先通过查询一种内部结构来确定消息要发送的窗口,出口对应的窗口类将对其进行处理。每个窗口对象都有自己的消息映射和处理函数。MFC的积累将检测这一目标类是否在其消息中为这一消息提供了处理函数入口。如果找到入口,则消息被送往处理函数,并结束消息发送过程;如果消息无对应入口,则对目标类进行积累消息映射检测,并沿着层次向上查找,知道找到入口函数为止。,第3章W

31、indows编程与MFC,3.7.1消息处理函数 CCmdTarget类:由Cobject类直接派生而生,它负责将消息发送到能够响应这些消息的对象。它是所有能进行消息映射的MFC类的基类,如CWinThread、CWinApp、Cview等类的基类。消息映射就是将消息或命令发送到程序员为处理消息所编写的函数中,使其对消息进行处理。所有的窗口类都是由CCmdTarget派生的,程序员只需处理那些感兴趣的消息,而将其他消息交给高级的类处理。 ClassWizard是一个功能非常强大的工具,我们可以用ClassWizard来创建新类、定义消息处理函数、覆盖MFC的虚函数以及从对话框、表单视图或记录视

32、图的控件中获取数据。 本节中我们先介绍利用ClassWizard管理窗口消息处理函数的方法和步骤,利用ClassWizard管理控件消息处理函数和命令消息处理函数的方法放到其他章节介绍。,第3章Windows编程与MFC,3.7.2消息和消息映射 消息分类 Windows应用程序中的消息主要有三种类型。 窗口消息(Windows message) 主要指由WM_开头的消息,一般由窗口类和视图类对象来处理。窗口消息往往带有参数,以标志处理消息的方法。 控件的通知消息(Control notifications) 当控件的状态发生改变时,控件就会向其父窗口发送WM_COMMAND通知消息。应用程序

33、框架处理控件消息的方法和窗口消息相同,但按钮的BN_CLICKED通知消息除外,它的处理方法与命令消息相同。 命令消息(Command message) 主要包括由用户交互对象(菜单、工具条的按钮、快捷键等)发送的WM_COMMAND通知消息。命令消息的处理方式与其他两种消息不同,它能够被多种对象接收、处理,这些对象包括文档类、文档模板类、应用程序本身以及窗口和视类等;而窗口消息和控件的通知消息是由窗口对象接收并处理的,这里的窗口对象是指从CWnd中派生的类的对象,它包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些类派生的对象等。

34、,第3章Windows编程与MFC,消息映射与消息处理函数 在Visual C+中,用户只需要编写对于该消息发生响应的函数,而Visual C+内部将自动为用户添加一个消息映射关系。通过消息映射,消息就和它的处理函数对应起来。 消息处理函数指的是与某个消息消息对应的函数。消息处理函数的执行是由其对应的消息引发的,某个类对象中的消息处理函数是与这个类对象能够得到的一个消息对应的,当这个消息发生时,这个函数就会被执行。 消息处理函数的定义与使用方法与类的一般的成员函数不同。一般成员函数包括两部分:函数的定义部分和函数的实现部分。定义一个一般成员函数时,在类中定义函数的原型,在实现文件中书写函数的实

35、现代码。而消息处理函数除了这两部分以外还有消息映射部分,通过消息映射在消息处理函数和引发它的消息之间建立联系。消息处理函数的定义方法与一般成员函数也不完全相同。,第3章Windows编程与MFC,3.7.3ClassWizard概述 打开MFC的ClassWizard的方法: 选择“View”“ClassWizard”菜单或直接使用Ctrl+W快捷键。 在源代码文件的文档编辑窗口中,右击鼠标,选择ClassWizard命令。 当ClassWizard打开后,就会弹出如图的MFC ClassWizard对话框。,图 MFC ClassWiard对话框,第3章Windows编程与MFC,例如,向C

36、Ex_SDIHelloView中添加WM_LBUTTOMDOWN的消息映射,则可按下列步骤进行: (1)按Ctrl+W快捷键打开MFC ClassWizard对话框。 (2)在Class name组合框中,将类名选定为CEx_SDIHelloView。 (3)在Object IDs列表框中选定CEx_SDIHelloView,而在Messages列表中选定WM_LBUTTOMDOWN消息。 (4)双击Messages列表中的WM_LBUTTOMDOWN消息或单击Add Function按钮,都会在CEx_SDIHelloView类中添加该消息的映射函数OnLButtonDown,同时在Memb

37、er funcions列表中显示这一消息映射函数和被映射的消息,如图。,图 映射WM_LBUTTONDOWN消息,第3章Windows编程与MFC,(5)单击Edit Code,转向文档窗口,定位到OnLButtonDown源代码处。 (6)添加下列代码: void CEx_SDIHelloView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default MessageBox (你好,我的Visual C+世界!, 问候, 0) ; CView

38、:OnLButtonDown(nFlags, point); (7)程序运行后,在窗口客户区左击,弹出一个消息对话框。,第3章Windows编程与MFC,3.7.3类的添加和删除 用MFC ClassWizard给项目添加一个类通常是按下列步骤进行的: (1)按快捷键Ctrl+W启动MFC ClassWizard对话框。单击Add Class,选择New命令,如图所示的New Class对话框。,图 New Class对话框,第3章Windows编程与MFC,(2)对话框中,Name框是用来输入用户定义的类名,注意要以“C”字母打头,以保持与MFC标识符命名规则一致;File Name是该类的

39、源代码文件名,单击Change按钮可改变源文件名称及其在磁盘中的位置;Base class框用来指定该类的基类;Dialog ID框是当选择CDialog作为基类时指定对话框的资源ID号。最下面的Automation是用来设置对自动化的支持。 (3)单击OK按钮,一个新类就会自动添加到项目中。 而当添加的类需要删除时,则需要按下列步骤进行: (1)将Visual C+ 6.0打开的所有文档窗口关闭。 (2)将项目工作区窗口切换到FileView页面,展开Source Files和Header Files结点,分别选定要删除类的对应.h和.cpp文件,按下Delete键,删除这两个文件。 (3)

40、选择“File”“Close Workspace”菜单命令,关闭项目。 (4)从实际的文件夹中删除对应的.h和.cpp文件与.clw文件。 需要注意的是,当下一次打开MFC ClassWizard对话框时,就会弹出Select Source Files对话框,这时只要单击右下的Add All按钮即可。,第3章Windows编程与MFC,3.8MFC应用程序的执行过程分析 在前面我们建立了一个什么都没有操作的MFC应用程序,虽然它已经能够运行,但该程序又是从哪里执行和从哪里得到控制的? 一个MFC应用程序的执行过程可分为以下几步: 1、调用CWinApp类的构造函数 2、程序的入口函数WinMa

41、in得到程序控制 3、在WinMain函数执行的过程中调用程序类的InitInstance 函数 4、WinMain进入消息循环 5、WinMain函数执行完毕,程序终止并退出,第3章Windows编程与MFC,1、调用CWinApp类的构造函数 打开MyExp.cpp文件可发现,程序中定义了一个全局的应用程序类的对象theApp,即: CMyExpApp theApp; 在程序入口函数WinMain得到程序的控制之前,要先调用应用程序类CMyExpApp的构造函数来完成对全局对象theApp的构造。 由于CMyExpApp是CWinApp的派生类,所以,在构造CMyExpApp的对象theA

42、pp时,类CMyExpApp会自动调用基类CWinApp的构造函数来完成theApp对象的构造。之所以将对象theApp定义成全局的,其目的是为了在MFC中能够对CWinAppd成员函数进行调用。,第3章Windows编程与MFC,2、程序的入口函数WinMain得到程序控制 全局对象theApp构造完成后,程序入口函数WinMain得到程序的控制。这个函数已经在MFC中做了定义,在建立可执行文件时能够链接到应用程序MyExp中,这个函数类似C语言中main函数,是程序的入口,它能够完成的任务很多。 3、在WinMain函数执行的过程中调用程序类的InitInstance 函数 在WinMai

43、n函数得到了程序的控制后,就调用应用程序类CMyExpApp的成员函数InitInstance函数来完成程序的初始化工作。 InitInstance函数的实现代码可以在应用程序类CMyExpApp的实现文件MyExp.cpp中找到。,第3章Windows编程与MFC,4、WinMain进入消息循环 在上面完成了程序的初始化任务后,函数WinMain进出消息循环。该函数通过调用Run()函数把消息从消息队列中取出,并发送到别的窗口。大多数的命令消息被发送到应用程序的主窗口中,其中函数WindowPro()得到消息,再根据消息的类别发送到适当的对象,激活并运行对象中的消息处理函数。 5、WinMa

44、in函数执行完毕,程序终止并退出 在程序MyExp中,选择“文件”菜单中的“退出”菜单项,或选择系统菜单中的“关闭”菜单项,或单击主框架窗口的关闭按钮,应用程序则删除程序窗口,并调用Windows的API函数PostQuitMessage使消息循环结束,然后WinMain函数返回,程序运行结束。,第3章Windows编程与MFC,3.9MFC宏 在C/C+语言中都能使用宏,宏就是用预处理指令define定一定一个标识符,用它来表示一个字符串或一段源代码。宏在功能上类似于函数,可以带有参数。 MFC提供的宏很多,常用的包括消息映射宏、运行时类型识别的宏、调试宏和异常宏等。我们只需要知道其中一些宏

45、的用法即可,不一定必须了解宏的具体的定义。 1、RUNTIME_CLASS宏 RUNTIME_CLASS是个带参数的宏,其定义如下: define RUNTIME_CLASS(class_name) (CRuntimeClass*)( 如果对象是参数pClass所指向的类的对象,则函数返回非0值,否则返回0值。 3、动态创建宏DECLARE_DYNCREATE和IMPLEMENT_KYNCREATE 动态创建是动态支持的一个超集,除了基本的类型识别机能,使用动态创建宏能够使Cobject的拍摄类具有在运行时动态创建对象的功能。,第3章Windows编程与MFC,3.9.2MFC调试宏 跟踪和断言在查找程序设计错误时是非常有用的。跟踪可以让程序在运行过程中遇到跟着宏时在输出窗口显示制定的信息,而断言使程序在断言条件下不成立时暂停程序的运行。MFC提供了一些跟踪和断言宏,其中最常用的宏有TRACE()、ASSERT()、ASSERT_VALID()等。,第3章Windows编程与MFC,1、跟踪宏TRACE() TRACE()宏语法说明: TRACE(); 其中参数是由输出格式和变量等

温馨提示

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

评论

0/150

提交评论