MFC应用程序概述 (2).ppt
《MFC应用程序概述 (2).ppt》由会员分享,可在线阅读,更多相关《MFC应用程序概述 (2).ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第3章章 MFC应用程序概述应用程序概述MFC应用程序概述应用程序概述Windows 应用程序概述应用程序概述MFC应用程序框架应用程序框架文档文档/视图结构视图结构消息映射消息映射3.1 Windows 应用程序概述应用程序概述3.1.1 窗口编程基础窗口编程基础l窗口窗口l消息和消息队列消息和消息队列l事件驱动的程序设计事件驱动的程序设计l资源管理资源管理1.窗口窗口(Window)l窗口是应用程序与用户交互的界面窗口是应用程序与用户交互的界面l窗口元素以对象方式组织窗口元素以对象方式组织l一个应用程序由多个窗口组成一个应用程序由多个窗口组成l程序运行过程是窗口之间,窗口与系统,程序运行
2、过程是窗口之间,窗口与系统,窗口与用户之间交换并处理数据的过程。窗口与用户之间交换并处理数据的过程。2.窗口的界面元素窗口的界面元素垂直滚动条垂直滚动条标题栏标题栏菜单栏菜单栏关闭按钮关闭按钮最小化按钮最小化按钮最大化按钮最大化按钮水平滚动条水平滚动条窗口边界窗口边界客户区客户区消息消息(Message)和消息队列和消息队列 l消息用于通知某个事件的产生消息用于通知某个事件的产生l消息机制消息机制lMSGl消息的类型消息的类型消息消息(Message)和消息队列和消息队列lWindows应用程序是利用消息与其他应用程序是利用消息与其他Windows应用程序和操作系统进行信息应用程序和操作系统进
3、行信息交换的。交换的。l消息的作用是通知一个应用程序某个确消息的作用是通知一个应用程序某个确定的事件的产生。定的事件的产生。l应用程序对该事件做出响应,即编写相应用程序对该事件做出响应,即编写相应的消息处理代码。应的消息处理代码。举例:按下鼠标左键时,系统会产生举例:按下鼠标左键时,系统会产生WM_LBUTTONDOWN消息消息消息消息(Message)和消息队列和消息队列Windows应用程序接受系统队列传递过来应用程序接受系统队列传递过来的消息的步骤:的消息的步骤:(1)每个每个Windows应用程序都有一个应用程序都有一个WinMain()函数函数,在该函数中会定义一个在该函数中会定义一
4、个窗口句柄窗口句柄,当应用程序启动时,会使该窗口句柄注当应用程序启动时,会使该窗口句柄注册,操作系统使用窗口句柄与册,操作系统使用窗口句柄与Windows应用程序通信。应用程序通信。消息消息(Message)和消息队列和消息队列(2)Windows应用程序创建一个或多个窗口,应用程序创建一个或多个窗口,每个窗口都有一个窗口处理函数每个窗口都有一个窗口处理函数(WndProc),负责窗口显示和响应用户输,负责窗口显示和响应用户输入。入。(3)消息映射消息映射(Message Mapping):负责从:负责从消息队列中取消息,并送回窗口,由窗消息队列中取消息,并送回窗口,由窗口处理函数选择合适的消
5、息处理函数响口处理函数选择合适的消息处理函数响应消息。应消息。派送消息消息源1消息源2消息源n否程序开始程序结束捕获消息处理消息是否退出消息是消息机制消息机制消消息息机机制制是是Windows应应用用程程序序运运行行的的核核心心工工作作机制,用如下机制,用如下结构体结构体MSG表示:表示:typedef struct tagMSG HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;MSG;MSG结构体成员说明:结构体成员说明:(1)hwnd 接收消息的窗口句柄。接收消息的窗口句柄。(2)Message
6、消息值,每个消息值,每个windows消息都有一个消消息都有一个消息值,该值由息值,该值由windows.h头文件的宏定头文件的宏定义来标识。义来标识。(3)wParam和和lParam 包含有关消息的附加信息,它随消息的不同而包含有关消息的附加信息,它随消息的不同而不同。不同。(4)Time 指定消息送至队列的时间界限。指定消息送至队列的时间界限。(5)pt 指定消息发送时屏幕光标的位置,结构如下:指定消息发送时屏幕光标的位置,结构如下:typedef struct tagPOINT LONG x;LONG y;POINT;消息的类型消息的类型1.输入消息输入消息 由键盘和鼠标操作产生输入消
7、息。这由键盘和鼠标操作产生输入消息。这类消息首先放在系统消息队列中,后由类消息首先放在系统消息队列中,后由Windows操作系统将他们放到应用程序操作系统将他们放到应用程序消息队列中,由应用程序处理消息。消息队列中,由应用程序处理消息。2.控件消息控件消息 用户操作窗口对象时产生控件消息,用户操作窗口对象时产生控件消息,这类消息一般不进入应用程序消息队列,这类消息一般不进入应用程序消息队列,而直接发送到控件对象所属的对话框窗而直接发送到控件对象所属的对话框窗口口消息的类型消息的类型3.系统消息系统消息 对程序化的事件或系统时钟中断做出的放对程序化的事件或系统时钟中断做出的放映。一类例如映。一类
8、例如DDE(动态数据交换消息动态数据交换消息)要通过要通过Windows的系统消息队列,送入应用程序的的系统消息队列,送入应用程序的消息队列,另一类直接送入应用程序的消息队消息队列,另一类直接送入应用程序的消息队列,例如创建窗口消息。列,例如创建窗口消息。4.用户消息用户消息 是程序员自己定义并在应用程序中主动发出是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分做内部处理。的,一般由应用程序的某一部分做内部处理。3.事件驱动的程序设计事件驱动的程序设计lWindowsWindows操作系统下的操作系统下的WindowsWindows应用程序应用程序采用事件驱动的程序设计,与采
9、用事件驱动的程序设计,与DosDos操作系操作系统下面向过程有明显不同。统下面向过程有明显不同。l事件驱动的程序的逻辑顺序是按事件的事件驱动的程序的逻辑顺序是按事件的产生而决定的。产生而决定的。l事件的产生不是预先定义的,有着随机事件的产生不是预先定义的,有着随机性性。3.事件驱动的程序设计事件驱动的程序设计例例1、一个应用程序的功能是体操全能比赛、一个应用程序的功能是体操全能比赛项目运动成绩管理,体操全能包括项目运动成绩管理,体操全能包括4个项个项目,在一个驱动中需要如下步骤:目,在一个驱动中需要如下步骤:(1)输入第一项运动员的成绩。输入第一项运动员的成绩。(2)输入第二项运动员的成绩。输
10、入第二项运动员的成绩。(3)输入第三项运动员的成绩。输入第三项运动员的成绩。(4)输入第四项运动员的成绩。输入第四项运动员的成绩。(5)计算每个运动员的总分。计算每个运动员的总分。(6)按总分排名。按总分排名。开始开始输入第一项某运动员的输入第一项某运动员的成绩成绩输入第二项某运动员的输入第二项某运动员的成绩成绩输入第三项某运动员的输入第三项某运动员的成绩成绩输入第四项某运动员的输入第四项某运动员的成绩成绩计算每个运动员计算每个运动员的总分的总分按总分排名按总分排名结束结束消息消息循环循环事件驱动程序流程示例事件驱动程序流程示例4.资源管理资源管理l资源的类型资源的类型l用户自定义资源用户自定
11、义资源l菜单菜单l对话框对话框l工具栏工具栏l系统资源系统资源l设备上下文设备上下文l画刷画刷l画笔画笔l字体字体l通信端口通信端口3.1.2 Windows应用程序组成应用程序组成一个应用程序是如何开始?一个应用程序是如何开始?l操作系统创建一个新的进程和一个初始操作系统创建一个新的进程和一个初始线程线程l应用程序代码装载到内存应用程序代码装载到内存l动态链接库装载到内存动态链接库装载到内存(如果需要使用如果需要使用DLL)l为数据和堆栈分配物理内存,并映射到为数据和堆栈分配物理内存,并映射到虚拟内存虚拟内存l应用程序开始执行应用程序开始执行3.1.2 Windows应用程序组成应用程序组成
12、Windows应用程序必须包含两个基本函数:应用程序必须包含两个基本函数:(1)应用程序主函数应用程序主函数WinMain()WinMain函数定义了窗口句柄,创建初函数定义了窗口句柄,创建初始化窗口并启动一个消息循环。始化窗口并启动一个消息循环。(2)窗口处理函数窗口处理函数WinProc()WinProc函数处理所有从操作系统传递函数处理所有从操作系统传递到窗口的消息。每一个窗口都要有一个窗口到窗口的消息。每一个窗口都要有一个窗口处理函数。处理函数。3.1.2 Windows应用程序组成应用程序组成1.WinMain()函数函数 Windows应用程序是从应用程序是从WinMain()函数
13、开始函数开始和结束的。和结束的。在在”WINBASE.H”中定义如下:中定义如下:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSR lpCmdLine,int nCmdShow );3.1.2 Windows应用程序组成应用程序组成参数说明如下:参数说明如下:(1)hInstance 系统分配的窗口所属的应用程序的实例系统分配的窗口所属的应用程序的实例句柄,标识当前进程的实例,是进程所句柄,标识当前进程的实例,是进程所占据的地址空间的首地址,是程序的唯占据的地址空间的首地址,是程序的唯一标识。一标识。(2)h
14、PrevInstance 用于检查是否有多个程序实例运行。用于检查是否有多个程序实例运行。3.1.2 Windows应用程序组成应用程序组成(3)lpCmdLine 是一个指向字符串的指针,用来保存是一个指向字符串的指针,用来保存程序运行时的参数,同程序运行时的参数,同main函数中的函数中的argv 相似。相似。(4)nCmdShow 用来指明应用程序的主窗口的显示用来指明应用程序的主窗口的显示方式方式(最大化,最小化,一般显示最大化,最小化,一般显示),通,通常被常被ShowWindow()函数作为显示窗口函数作为显示窗口的参数。的参数。3.1.2 Windows应用程序组成应用程序组成W
15、inMain函数的作用:函数的作用:注册窗口类,创建并初始化窗口,注册窗口类,创建并初始化窗口,创建消息循环创建消息循环(message loop)。(1)注册窗口类注册窗口类 每个窗口都包含一些基本属性,如窗每个窗口都包含一些基本属性,如窗口边框、标题、大小、位置、鼠标、背口边框、标题、大小、位置、鼠标、背景色等,注册的过程是将这些属性报告景色等,注册的过程是将这些属性报告给系统。给系统。3.1.2 Windows应用程序组成应用程序组成(2)创建并初始化窗口创建并初始化窗口 CreateWindow()函数用于创建窗口,函数用于创建窗口,定义了窗口的名称、位置、尺寸等数据,定义了窗口的名称
16、、位置、尺寸等数据,创建成功返回窗口句柄,否则为创建成功返回窗口句柄,否则为0。创建后创口需要调用创建后创口需要调用ShowWindow()和和UpdateWindow()两个函数显示窗口。两个函数显示窗口。3.1.2 Windows应用程序组成应用程序组成(3)创建消息循环创建消息循环 使用使用While语句创建一个消息循环,负责从语句创建一个消息循环,负责从消息队列中获取消息并发送给相应的处理函数。消息队列中获取消息并发送给相应的处理函数。while(GetMessage (&Msg,NULL,0,0)TranslateMessage(&Msg);DispatchMessage(&Msg)
17、;TranslateMessage()函数的作用是将来自键函数的作用是将来自键盘的命令翻译为消息的盘的命令翻译为消息的ID字符表示。字符表示。DispatchMessage()把每个消息分发给相应的把每个消息分发给相应的窗口函数。窗口函数。3.1.2 Windows应用程序组成应用程序组成2.窗口处理函数窗口处理函数 决定窗口在它的客户区中显示哪些内容、窗决定窗口在它的客户区中显示哪些内容、窗口如何响应用户输入,窗口函数定义如下:口如何响应用户输入,窗口函数定义如下:LRESULT CALLBACK WndProc(HWND hwnd,UNIT Message,WPARAM wParam,LP
18、ARAM lparam,)3.1.2 Windows应用程序组成应用程序组成参数说明如下:参数说明如下:(1)LRESULT 表示该函数返回值为长整数,由系统使用。表示该函数返回值为长整数,由系统使用。(2)CALLBACK 表示该函数是回调函数,由系统使用。表示该函数是回调函数,由系统使用。(3)Hwnd 接收消息的窗口句柄接收消息的窗口句柄(4)Message用来标示消息的数字用来标示消息的数字(5)wParam和和lparam两个两个32位的消息参数,用来提供消息的附加信息。位的消息参数,用来提供消息的附加信息。Windows的编程模型与的编程模型与MS-DOS编编程模型之比较程模型之比
19、较 l第一,用第一,用C语言编写基于语言编写基于MS-DOS的应用程序时,的应用程序时,唯一绝对需要的是一个名为唯一绝对需要的是一个名为main的函数。而当的函数。而当Windows操作系统启动一个程序时,调用的是操作系统启动一个程序时,调用的是WinMain函数。函数。l第二,许多第二,许多MS-DOS程序直接写显存和打印机接程序直接写显存和打印机接口。这种技术的不利之处是对每一种设备需要其口。这种技术的不利之处是对每一种设备需要其支持的驱动程序软件。支持的驱动程序软件。Windows引入了一个名引入了一个名为图形设备接口(为图形设备接口(GDI)的抽象化外层,所以用)的抽象化外层,所以用户
20、不必知道有关系统设备的类型。户不必知道有关系统设备的类型。Windows程程序不是寻址硬件,而是调用序不是寻址硬件,而是调用GDI函数。函数。Windows的编程模型与的编程模型与MS-DOS编程模型之比较编程模型之比较l第三,要在第三,要在MS-DOS环境下进行数据驱动编环境下进行数据驱动编程,必须或者为把数据编码成为初始化常量程,必须或者为把数据编码成为初始化常量或者提供独立的数据文件让程序来读。进行或者提供独立的数据文件让程序来读。进行Windows编程时,使用大量已经确立的格式编程时,使用大量已经确立的格式在资源文件中存储数据。在资源文件中存储数据。l第四,在第四,在MS-DOS环境下
21、一个程序的所有对环境下一个程序的所有对象模块在建立过程中是静态连接的。象模块在建立过程中是静态连接的。Windows允许动态链接,这意味着特别创建允许动态链接,这意味着特别创建的库可以在运行时加载和链接。多个应用程的库可以在运行时加载和链接。多个应用程序可以共享动态链接库(序可以共享动态链接库(DLLs),它节省内),它节省内存和磁盘空间。动态链接增加了程序的模块存和磁盘空间。动态链接增加了程序的模块性。性。3.1.3 应用程序举例应用程序举例 分析使用分析使用AppWizard生成的生成的Win32窗窗口程序示例口程序示例Exam3_2,并对该程序作以,并对该程序作以下修改:下修改:(1)修
22、改输出的文本字符串修改输出的文本字符串”Hello World”为为”Hello C+!”。(2)在视图的中央输出文本在视图的中央输出文本”Starting your VC+learning!”(3)添加一个对话框,并能使用菜单调用这添加一个对话框,并能使用菜单调用这个对话框。个对话框。3.2 MFC应用程序框架应用程序框架lVisual C+6.0是一种集成开发环境,提供了MFC类库。lMFC(Microsoft基本类库,Microsoft Foundation Class Library)lMFC是微软公司对大部分标准的Win32 API函数的封装,提供了图形环境应用程序的框架及创建应用程
23、序的组件.MFC 简简 介介lMFC是用来写是用来写Windows应用程序的应用程序的VC+类集,该类集以层次结构组织起来。类集,该类集以层次结构组织起来。提供的类库对程序设计高度抽象,使代码提供的类库对程序设计高度抽象,使代码的可靠性和重用性得到很大的提高。的可靠性和重用性得到很大的提高。lMFC给给Windows系统开发平台程序员以系统开发平台程序员以最好支持的基本类结构,它包含的类分层最好支持的基本类结构,它包含的类分层结构和功能是具有可伸缩性,在功能扩展结构和功能是具有可伸缩性,在功能扩展的同时,的同时,MFC还保持了程序的向下兼容性。还保持了程序的向下兼容性。MFC类的层次结构类的层
24、次结构lMFC类库中是以层次结构的方式类库中是以层次结构的方式组织起来的,每个层次结构都与一组织起来的,每个层次结构都与一具体的具体的Windows的实体相对应。的实体相对应。l大多数大多数MFC类是从类是从3个基类个基类(CObject类、类、CCmdTarget类、类、CWnd类)派生的类)派生的MFC类的层次结构类的层次结构l根类:根类:CObject类类CObject类类 CCmdTarget类类CWnd类类l从从CObject类派生的类具有运行时获类派生的类具有运行时获得对象大小的名字的能力得对象大小的名字的能力l从从CCmdTarget类派生的类能够处类派生的类能够处理命令消息理命
25、令消息l从从CWnd类派生的类能够控制窗口类派生的类能够控制窗口派生派生派生派生CObject派生类派生类CObjectCCmdTargetCWinThreadCWinAppCWndCFrameWndCViewCDocumentMFC类的层次结构类的层次结构lMFC提供的一些重要的类分为以下几种:v应用程序框架结构类CWinAppv程序窗口类CFramWndv图形打印类CGdiObjectv文件类CFilevInternet类v集合类v异常和调试支持类应用程序类应用程序类CWinAppl应用程序框架类主要包括应用程序应用程序框架类主要包括应用程序类、线程类、文档类和文档模板类。类、线程类、文档
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC应用程序概述 2 MFC 应用程序 概述
限制150内