C++ 第七章 Visual C++ 编程基础.ppt
《C++ 第七章 Visual C++ 编程基础.ppt》由会员分享,可在线阅读,更多相关《C++ 第七章 Visual C++ 编程基础.ppt(91页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MFC 编程编程第七章第七章 Visual C+Visual C+编程基础编程基础ARM Vector TableFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset0 x1C0 x180 x140 x100 x0C0 x080 x040 x001 13 32 2Windows API 编程编程Windows 程序运行机制程序运行机制 WindowsWindows是一种是一种典型的事件驱动运行机制典型的事件驱动运行机制;比如单击鼠标时,比如单击鼠标时,WindowsWindows
2、系统会向特定的系统会向特定的窗口发送消息。窗口发送消息。在在Visual C+6.0Visual C+6.0中,一般消息处理都被包含中,一般消息处理都被包含在在MFCMFC中,用户特定的消息可由程序员自行处中,用户特定的消息可由程序员自行处理。理。MFCMFCMicrosoft Foundation Class LibraryMicrosoft Foundation Class Library 微软基础类库微软基础类库在在Visual C+6.0Visual C+6.0中,使用中,使用Class WizardClass Wizard等工等工具,可以是消息处理更方便,可控性强、封装具,可以是消息
3、处理更方便,可控性强、封装性更好。性更好。7.1 Windows程序运行机制程序运行机制7.1.1Windows7.1.1Windows中的事件驱动与消息循环中的事件驱动与消息循环与与DOS应用程序不同,应用程序不同,Windows应用程序的运应用程序的运行机制并不是显示地运用一个函数来取得输入,行机制并不是显示地运用一个函数来取得输入,而是等待而是等待Windows系统将输入传递给系统将输入传递给Windows应用程序的窗口。应用程序的窗口。每个窗口都有一个被称为窗口过程的函数,当每个窗口都有一个被称为窗口过程的函数,当窗口有输入时,窗口有输入时,Windows系统将调用它。系统将调用它。窗
4、口过程函数处理输入后将控制返回给窗口过程函数处理输入后将控制返回给Windows系统。系统。Windows系统以消息的形式将输入传给窗口过系统以消息的形式将输入传给窗口过程;程;这里的消息是指事件之间相互传送的具有一定这里的消息是指事件之间相互传送的具有一定意义的信号,意义的信号,Windows系统对每个输入事件都系统对每个输入事件都要产生输入消息。要产生输入消息。7.1.1Windows7.1.1Windows中的事件驱动与消息循环中的事件驱动与消息循环例例7.17.1分析通过鼠标在分析通过鼠标在Windows Windows 的画图程序的画图程序窗口中画一个矩形的消息传递和消息处理过窗口中
5、画一个矩形的消息传递和消息处理过程;程;当单击当单击PaintBrushPaintBrush工具箱中的画矩形工具时,工具箱中的画矩形工具时,工具箱接收到单击鼠标的消息;工具箱接收到单击鼠标的消息;当用户在窗口中按下鼠标左键时,产生当用户在窗口中按下鼠标左键时,产生WM_LBUTTONDOWNWM_LBUTTONDOWN消息;消息;当用户在窗口内拖动鼠标时,产生当用户在窗口内拖动鼠标时,产生WM_MOUSEMOVEWM_MOUSEMOVE消息;消息;当用户在窗口中放下鼠标左键时,将产生当用户在窗口中放下鼠标左键时,将产生WM_LBUTTONUPWM_LBUTTONUP消息。消息。7.1.1Win
6、dows7.1.1Windows中的事件驱动与消息循环中的事件驱动与消息循环Windows系统首先接收到鼠标动作事件,然后产系统首先接收到鼠标动作事件,然后产生相应的消息并发给生相应的消息并发给PaintBrush窗口;窗口;PaintBrush窗口一直等待窗口一直等待Windows系统发给它的系统发给它的消息,当接收到消息时,消息,当接收到消息时,PaintBrush窗口的窗口窗口的窗口过程函数将处理接收到的消息;过程函数将处理接收到的消息;当消息处理完成后,将控制权返回给当消息处理完成后,将控制权返回给Windows系系统,然后在等待统,然后在等待Windows系统的消息。系统的消息。Wi
7、ndowsWindows应用程序在运行时就是不断地应用程序在运行时就是不断地等待消息,等待消息,处理消息,处理消息,又等待消息这个过程循环往复直到程又等待消息这个过程循环往复直到程序运行结束时为止,一般称这个过程为序运行结束时为止,一般称这个过程为消息循环消息循环。7.1.2 7.1.2 消息和消息处理消息和消息处理 在在WindowsWindows中,从消息的发出到消息的处理是一中,从消息的发出到消息的处理是一个复杂的过程,其中一个重要的概念是消息结构个复杂的过程,其中一个重要的概念是消息结构MSGMSG。消息结构消息结构MSGMSG:typedef struct tagMSGtypedef
8、 struct tagMSG HWND hwnd;/HWND hwnd;/接收消息的窗口句柄接收消息的窗口句柄UINT message;/UINT message;/标识一种标识一种消息类型,消息消息类型,消息IDIDWPARAM wParam;/WPARAM wParam;/消息消息数据成员数据成员,消息本身消息本身LPARAM lParam;/LPARAM lParam;/消息消息数据成员数据成员,消息本身消息本身DWORD time;/DWORD time;/消息放入消息队列中的消息放入消息队列中的时间时间POINT pt;/POINT pt;/消息被放入消息队列时消息被放入消息队列时鼠
9、标坐标鼠标坐标 MSG,*PMSGMSG,*PMSG;7.1.2 7.1.2 消息和消息处理消息和消息处理MSGMSG数据成员含义:数据成员含义:1 1、HWNDHWND hwndhwnd:消息要发送到的应用程序窗口的消息要发送到的应用程序窗口的句句柄柄,如果是在一个有多个窗口的应用程序中用此数,如果是在一个有多个窗口的应用程序中用此数据成员可据成员可决定让哪个窗口接收消息决定让哪个窗口接收消息;2 2、UINT UINT messagemessage:是是一一个个数数值值用用于于惟惟一一标标识识一一种种消消息类型息类型;(;(消息消息IDID)3 3、WPARAM WPARAM wParam
10、wParam:是是一一个个3232位位的的消消息息数数据据成成员员它它的确切意义取决于消息本身;的确切意义取决于消息本身;4 4、LPARAM LPARAM lParamlParam:也也是是一一个个3232位位的的消消息息数数据据成成员员它的确切意义也取决于消息本身;它的确切意义也取决于消息本身;5 5、DWORD DWORD timetime:消消息息放放入入消消息息队队列列中中的的时时间间,在在这这个个数数据据成成员员中中写写入入的的并并不不是是日日期期而而是是从从WindowsWindows启启动后所测量的时间值用于动后所测量的时间值用于保持消息正确的顺序保持消息正确的顺序;6 6、P
11、OINT POINT ptpt:消息被放入消息队列时的消息被放入消息队列时的鼠标坐标鼠标坐标;7.1.2 7.1.2 消息和消息处理消息和消息处理HWND 窗口句柄窗口句柄typedef unsigned int UINT;typedef UINT WPARAM;/就是无符号整形就是无符号整形 typedef long LONG;typedef LONG LPARAM;/就是长整形就是长整形 DWORDPOINT7.1.2 7.1.2 消息和消息处理消息和消息处理被送往应用程序的消息将被应用程序窗口的被送往应用程序的消息将被应用程序窗口的窗口过程函数窗口过程函数所接收,如程序员编写有相应所接收
12、,如程序员编写有相应的函数,的函数,窗口过程函数窗口过程函数将执行对应的函数;将执行对应的函数;-这样消息就被响应。这样消息就被响应。消息对应的函数称为消息对应的函数称为消息函数。消息函数。一个消息函数只对应一个消息一个消息函数只对应一个消息,每个消息都,每个消息都有一个专门的函数来处理;有一个专门的函数来处理;如果程序员没有编写相应的消息函数,消息如果程序员没有编写相应的消息函数,消息将由窗口默认处理。将由窗口默认处理。7.1.2 7.1.2 消息和消息处理消息和消息处理回顾例回顾例7.17.1当用户在当用户在PaintBrushPaintBrush窗口中按下鼠标左键窗口中按下鼠标左键时,时
13、,WindowsWindows系统发出系统发出WM_LBUTTONDOWNWM_LBUTTONDOWN消消息;息;消息的句柄是消息的句柄是PaintBrushPaintBrush窗口的句柄,因此窗口的句柄,因此消息被发往消息被发往PaintBrushPaintBrush窗口;窗口;当当PaintBrushPaintBrush窗口接收到消息后,该窗口的窗口接收到消息后,该窗口的窗口过程函数窗口过程函数立即调用立即调用该消息对应的消息该消息对应的消息函数函数对该消息进行处理:对该消息进行处理:记录下鼠标左键按记录下鼠标左键按下的位置坐标。下的位置坐标。7.1.2 7.1.2 消息和消息处理消息和消
14、息处理当用户在窗口内拖动鼠标时,当用户在窗口内拖动鼠标时,WindowsWindows系系统发出统发出WM_MOUSEMOVEWM_MOUSEMOVE消息;消息;消息的句柄仍然是消息的句柄仍然是PaintBrushPaintBrush窗口的句柄,窗口的句柄,因此消息被发往因此消息被发往PaintBrushPaintBrush窗口;窗口;当当PaintBrushPaintBrush窗口接收到消息后,该窗口的窗口接收到消息后,该窗口的窗口过程函数窗口过程函数立即调用立即调用该消息对应的消息该消息对应的消息函数函数对该消息进行处理:对该消息进行处理:记录下鼠标当前的记录下鼠标当前的位置坐标,并以此点
15、与鼠标左键按下的那位置坐标,并以此点与鼠标左键按下的那一点分别作为左上角和右下角画一个矩形,一点分别作为左上角和右下角画一个矩形,同时隐藏前一点与鼠标左键按下时的那一同时隐藏前一点与鼠标左键按下时的那一点所画的矩形。点所画的矩形。7.1.2 7.1.2 消息和消息处理消息和消息处理当鼠标不断移动,当鼠标不断移动,Windows系统不断的发出系统不断的发出WM_MOUSEMOVEWM_MOUSEMOVE消息;消息;该消息函数不断地重复以上的过程;该消息函数不断地重复以上的过程;最后当用户在窗口中放开鼠标左键时,最后当用户在窗口中放开鼠标左键时,Windows系统发出系统发出WM_LBUTTONU
16、PWM_LBUTTONUP消息。消息。消息的句柄仍然是消息的句柄仍然是PaintBrushPaintBrush窗口的句柄,因此消窗口的句柄,因此消息被发往息被发往PaintBrushPaintBrush窗口;窗口;当当PaintBrushPaintBrush窗口接收到消息后,该窗口的窗口接收到消息后,该窗口的窗口过窗口过程函数程函数立即调用立即调用该消息对应的消息函数该消息对应的消息函数对该消息进对该消息进行处理:行处理:记录下鼠标在该点的位置坐标,并以此点记录下鼠标在该点的位置坐标,并以此点与鼠标左键按下的那一点分别作为左上角和右下角与鼠标左键按下的那一点分别作为左上角和右下角画一个矩形。画
17、一个矩形。最终在最终在PaintBrushPaintBrush窗口中画出一个矩形。窗口中画出一个矩形。7.1.2 7.1.2 消息映象机制消息映象机制消息映像消息映像指在指在MFCMFC类中将类中将消息与消息与消息处理函数消息处理函数联系起来形成一联系起来形成一一对应的机制;一对应的机制;在在MFCMFC中,任何一个从类中,任何一个从类CCmdTargetCCmdTarget派生的类都能处理派生的类都能处理消息,都有相应的消息映像;消息,都有相应的消息映像;各种各种消息通过消息映象消息通过消息映象,找到,找到处理该消息的处理函数。处理该消息的处理函数。7.1.2 7.1.2 消息映象机制消息映
18、象机制在在VCVC的的源文件中,源文件中,宏宏BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP和和END_MESSAGE_MAPEND_MESSAGE_MAP之间的代码之间的代码为消息映像代码。为消息映像代码。如象下面程序片段:如象下面程序片段:BEGIN_MESSAGE_MAP BEGIN_MESSAGE_MAP(Cstep,CView)(Cstep,CView)/AFX_MSG_MAP(CCircleView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONLOCK()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()/AFX_MSG_
19、MAP END_MESSAGE_MAP()END_MESSAGE_MAP()在在MFCMFC中,利用中,利用ClassWizardClassWizard可以找到要处理的对可以找到要处理的对象及其要处理的对象的消息,并且可以直接激活象及其要处理的对象的消息,并且可以直接激活VCVC文本编辑器,向消息处理函数中加入代码。文本编辑器,向消息处理函数中加入代码。我们看看一个具体的示例程序7.2 Windows API编程编程7.2.1 API和SDK1 APIWindows API(Windows Application Programming Interface,Windows应用程序应用程序编程接
20、口编程接口)是所有是所有Windows应用程序的基础;应用程序的基础;API是一系列例程,Windows应用程序通过应用程序通过调用调用API来来请求操作系统完成一些低级服务请求操作系统完成一些低级服务;在Windows图形用户界面中,应用程序的应用程序的窗窗口、图标、菜单和对话框口、图标、菜单和对话框等都是等都是由由API来进来进行管理和维护行管理和维护的;的;7.2.1 API和SDKWindows APIWindows API有两种基本类型:有两种基本类型:Win16 Win16 APIAPI和和Win32 APIWin32 API;两者在很多方面都非常相似,但两者在很多方面都非常相似,
21、但Win32 Win32 APIAPI几乎包括了几乎包括了Win16 APIWin16 API中的所有内中的所有内容,还增加了很多其他内容。容,还增加了很多其他内容。7.2.1 API和SDK2 SDKWindowsSDKWindowsSDKWindows Software Windows Software Development KitDevelopment Kit,WindowsWindows软件开软件开发工具套件。发工具套件。SDKSDK和和APIAPI结合起来,形成一套帮助结合起来,形成一套帮助C+C+语言程序员创建语言程序员创建WindowsWindows应用程应用程序的工具包序的工
22、具包7.2.1 API和SDKSDKSDK包括以下几个组成部分:包括以下几个组成部分:1)1)大量的在线帮助,帮助描述了大量的在线帮助,帮助描述了WindowsWindows编程用到的函数消息结构宏及其他资编程用到的函数消息结构宏及其他资源;源;2)2)各各种种编编程程工工具具,比比如如对对话话框框编编辑辑器器及及图标编辑器等;图标编辑器等;3)3)WindowsWindows库及头文件;库及头文件;4)4)使用使用C+C+语言编写的示例程序语言编写的示例程序。7.2.1 API和SDK MFC提供了对提供了对Win32 API的比较完整的封的比较完整的封装,对于编写装,对于编写Windows
23、程序更加方便和高效。程序更加方便和高效。但在某些情况下直接调用但在某些情况下直接调用Win32 API可以获可以获得更高的执行效率,有更大的自由度,但对得更高的执行效率,有更大的自由度,但对程序员要求比较高。程序员要求比较高。使用使用MFC编写编写Windows应用程序与使用应用程序与使用SDK编写的同一程序相比,编写的同一程序相比,MFC隐藏了大隐藏了大量的复杂操作,降低了编程的难度。量的复杂操作,降低了编程的难度。但使用但使用SDK编写编写Windows应用程序,可以应用程序,可以很好的学习和掌握很好的学习和掌握Windows程序的运行处理程序的运行处理机制。机制。7.2.2 Window
24、s API应用程序的组成应用程序的组成 Windows API Windows API应用程序主要由应用程序主要由入入口函数口函数WinMainWinMain和窗口函数和窗口函数构成,构成,其中还包括各种其中还包括各种数据类型、数数据类型、数据结构与函数据结构与函数;7.2.2 Windows API应用程序的组成应用程序的组成1 1 入口函数入口函数WinMain()WinMain():WinMain()WinMain()函数是所有函数是所有 Windows Windows 应用程序的应用程序的入口入口,与与C C 语言程序中的语言程序中的 main()main()函数类似函数类似,功能为完
25、成功能为完成初始化操作初始化操作,并产生消息循环;并产生消息循环;WinMain()WinMain()函数有函数有3 3个基本组成部分:个基本组成部分:函数说明函数说明 初始化及消息循环初始化及消息循环-函数执行部分函数执行部分7.2.2 Windows API应用程序的组成应用程序的组成(1)(1)函数说明函数说明 WinMain()WinMain()函数的声明语句如下:函数的声明语句如下:int WINAPI WinMain(int WINAPI WinMain(HINSTANCE hInstance,/HINSTANCE hInstance,/程序实例句柄程序实例句柄 HINSTANCE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 第七章 Visual 编程基础 第七 编程 基础
限制150内