第07章 Visual C++编程基础

上传人:飞*** 文档编号:6241787 上传时间:2017-08-08 格式:PPT 页数:91 大小:804KB
返回 下载 相关 举报
第07章 Visual C++编程基础_第1页
第1页 / 共91页
第07章 Visual C++编程基础_第2页
第2页 / 共91页
第07章 Visual C++编程基础_第3页
第3页 / 共91页
第07章 Visual C++编程基础_第4页
第4页 / 共91页
第07章 Visual C++编程基础_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《第07章 Visual C++编程基础》由会员分享,可在线阅读,更多相关《第07章 Visual C++编程基础(91页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计,MFC 编程,第七章 Visual C+ 编程基础,ARM Vector Table,FIQ,IRQ,(Reserved),Data Abort,Prefetch Abort,Software Interrupt,Undefined Instruction,Reset,1,3,2,Windows API 编程,Windows 程序运行机制,Windows是一种典型的事件驱动运行机制;比如单击鼠标时,Windows系统会向特定的窗口发送消息。在Visual C+6.0中,一般消息处理都被包含在MFC中,用户特定的消息可由程序员自行处理。MFCMicrosoft Foundati

2、on Class Library 微软基础类库在Visual C+6.0中,使用Class Wizard等工具,可以是消息处理更方便,可控性强、封装性更好。,7.1 Windows程序运行机制,7.1.1Windows中的事件驱动与消息循环,与DOS应用程序不同,Windows应用程序的运行机制并不是显示地运用一个函数来取得输入,而是等待Windows系统将输入传递给Windows应用程序的窗口。每个窗口都有一个被称为窗口过程的函数,当窗口有输入时, Windows系统将调用它。窗口过程函数处理输入后将控制返回给Windows系统。Windows系统以消息的形式将输入传给窗口过程;这里的消息是

3、指事件之间相互传送的具有一定意义的信号,Windows系统对每个输入事件都要产生输入消息。,7.1.1Windows中的事件驱动与消息循环,例7.1分析通过鼠标在Windows 的画图程序窗口中画一个矩形的消息传递和消息处理过程;当单击PaintBrush工具箱中的画矩形工具时,工具箱接收到单击鼠标的消息;当用户在窗口中按下鼠标左键时,产生WM_LBUTTONDOWN消息;当用户在窗口内拖动鼠标时,产生WM_MOUSEMOVE消息;当用户在窗口中放下鼠标左键时,将产生WM_LBUTTONUP消息。,7.1.1Windows中的事件驱动与消息循环,Windows系统首先接收到鼠标动作事件,然后产

4、生相应的消息并发给PaintBrush窗口;PaintBrush窗口一直等待Windows系统发给它的消息,当接收到消息时, PaintBrush窗口的窗口过程函数将处理接收到的消息;当消息处理完成后,将控制权返回给Windows系统,然后在等待Windows系统的消息。Windows应用程序在运行时就是不断地等待消息,处理消息,又等待消息这个过程循环往复直到程序运行结束时为止,一般称这个过程为消息循环。,7.1.2 消息和消息处理,在Windows中,从消息的发出到消息的处理是一个复杂的过程,其中一个重要的概念是消息结构MSG。消息结构MSG:typedef struct tagMSG HW

5、ND hwnd; /接收消息的窗口句柄UINT message; /标识一种消息类型,消息IDWPARAM wParam; /消息数据成员,消息本身LPARAM lParam; /消息数据成员,消息本身DWORD time; /消息放入消息队列中的时间POINT pt; /消息被放入消息队列时鼠标坐标 MSG, *PMSG;,7.1.2 消息和消息处理,MSG数据成员含义:1、 HWND hwnd:消息要发送到的应用程序窗口的句柄,如果是在一个有多个窗口的应用程序中用此数据成员可决定让哪个窗口接收消息; 2、 UINT message:是一个数值用于惟一标识一种消息类型;(消息ID)3、 WP

6、ARAM wParam:是一个32位的消息数据成员它的确切意义取决于消息本身; 4、 LPARAM lParam:也是一个32位的消息数据成员它的确切意义也取决于消息本身; 5、 DWORD time:消息放入消息队列中的时间,在这个数据成员中写入的并不是日期而是从Windows启动后所测量的时间值用于保持消息正确的顺序; 6、 POINT pt:消息被放入消息队列时的鼠标坐标;,7.1.2 消息和消息处理,HWND 窗口句柄typedef unsigned int UINT; typedef UINT WPARAM;/就是无符号整形 typedef long LONG; typedef LO

7、NG LPARAM;/就是长整形 DWORDPOINT,7.1.2 消息和消息处理,被送往应用程序的消息将被应用程序窗口的窗口过程函数所接收,如程序员编写有相应的函数,窗口过程函数将执行对应的函数;-这样消息就被响应。消息对应的函数称为消息函数。一个消息函数只对应一个消息,每个消息都有一个专门的函数来处理;如果程序员没有编写相应的消息函数,消息将由窗口默认处理。,7.1.2 消息和消息处理,回顾例7.1当用户在PaintBrush窗口中按下鼠标左键时,Windows系统发出WM_LBUTTONDOWN消息;消息的句柄是PaintBrush窗口的句柄,因此消息被发往PaintBrush窗口;当P

8、aintBrush窗口接收到消息后,该窗口的窗口过程函数立即调用该消息对应的消息函数对该消息进行处理:记录下鼠标左键按下的位置坐标。,7.1.2 消息和消息处理,当用户在窗口内拖动鼠标时, Windows系统发出WM_MOUSEMOVE消息;消息的句柄仍然是PaintBrush窗口的句柄,因此消息被发往PaintBrush窗口;当PaintBrush窗口接收到消息后,该窗口的窗口过程函数立即调用该消息对应的消息函数对该消息进行处理:记录下鼠标当前的位置坐标,并以此点与鼠标左键按下的那一点分别作为左上角和右下角画一个矩形,同时隐藏前一点与鼠标左键按下时的那一点所画的矩形。,7.1.2 消息和消息

9、处理,当鼠标不断移动,Windows系统不断的发出WM_MOUSEMOVE消息;该消息函数不断地重复以上的过程;最后当用户在窗口中放开鼠标左键时, Windows系统发出WM_LBUTTONUP消息。消息的句柄仍然是PaintBrush窗口的句柄,因此消息被发往PaintBrush窗口;当PaintBrush窗口接收到消息后,该窗口的窗口过程函数立即调用该消息对应的消息函数对该消息进行处理:记录下鼠标在该点的位置坐标,并以此点与鼠标左键按下的那一点分别作为左上角和右下角画一个矩形。最终在PaintBrush窗口中画出一个矩形。,7.1.2 消息映象机制,消息映像指在MFC类中将消息与消息处理函

10、数联系起来形成一一对应的机制;在MFC中,任何一个从类CCmdTarget派生的类都能处理消息,都有相应的消息映像;各种消息通过消息映象,找到处理该消息的处理函数。,7.1.2 消息映象机制,在VC的源文件中,宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的代码为消息映像代码。如象下面程序片段: BEGIN_MESSAGE_MAP(Cstep, CView) / AFX_MSG_MAP(CCircleView) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONLOCK() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() / A

11、FX_MSG_MAP END_MESSAGE_MAP()在MFC中,利用ClassWizard可以找到要处理的对象及其要处理的对象的消息,并且可以直接激活VC文本编辑器,向消息处理函数中加入代码。,我们看看一个具体的示例程序,7.2 Windows API编程7.2.1 API和SDK,1 APIWindows API(Windows Application Programming Interface,Windows应用程序编程接口) 是所有Windows应用程序的基础;API是一系列例程,Windows应用程序通过调用API来请求操作系统完成一些低级服务;在Windows图形用户界面中,应用

12、程序的窗口、图标、菜单和对话框等都是由API来进行管理和维护的;,7.2.1 API和SDK,Windows API有两种基本类型:Win16 API和Win32 API;两者在很多方面都非常相似,但Win32 API几乎包括了Win16 API中的所有内容,还增加了很多其他内容。,7.2.1 API和SDK,2 SDKWindowsSDKWindows Software Development Kit,Windows软件开发工具套件。SDK和API结合起来,形成一套帮助C+语言程序员创建Windows应用程序的工具包,7.2.1 API和SDK,SDK包括以下几个组成部分:1)大量的在线帮助

13、,帮助描述了Windows编程用到的函数消息结构宏及其他资源;2)各种编程工具,比如对话框编辑器及图标编辑器等;3)Windows库及头文件;4)使用C+语言编写的示例程序。,7.2.1 API和SDK,MFC提供了对Win32 API的比较完整的封装,对于编写Windows程序更加方便和高效。但在某些情况下直接调用Win32 API可以获得更高的执行效率,有更大的自由度,但对程序员要求比较高。使用MFC编写Windows应用程序与使用SDK编写的同一程序相比,MFC隐藏了大量的复杂操作,降低了编程的难度。但使用SDK编写Windows应用程序,可以很好的学习和掌握Windows程序的运行处理

14、机制。,7.2.2 Windows API应用程序的组成,Windows API应用程序主要由入口函数WinMain和窗口函数构成,其中还包括各种数据类型、数据结构与函数;,7.2.2 Windows API应用程序的组成,1 入口函数WinMain():WinMain()函数是所有 Windows 应用程序的入口, 与C 语言程序中的 main()函数类似,功能为完成初始化操作, 并产生消息循环; WinMain()函数有3个基本组成部分: 函数说明 初始化及消息循环-函数执行部分,7.2.2 Windows API应用程序的组成,(1) 函数说明 WinMain()函数的声明语句如下:in

15、t WINAPI WinMain( HINSTANCE hInstance, /程序实例句柄 HINSTANCE hPrevInstance,/为保持与Win16兼容的句柄 LPSTR lpCmdLIne, / 命令行参数 int nCmdShow / 初始化窗口显示方式 )HINSTANCE:LPSTR:,7.2.2 Windows API应用程序的组成,其中: hInstance为标识当前进程的实例句柄,在很多Windows API中,都要将作为一个参数进行传递,在应用程序中一般将它保存在全局变量中; hPrevInstance是应用程序为16为Windows保持兼容的一个句柄,在Win3

16、2中,这个参数值为NULL; lpCmdLIne是命令行参数,其功能与main()函数中的argv相似; int main(int argc,char*argv)/* argc 是外部命令参数的个数 ;argv存放外部命令参数*/ nCmdShow 用于指定应用程序主窗口的显示方式,包括最大化、最小化、一般化显示。,7.2.2 Windows API应用程序的组成,(2)初始化 通常是为窗口类的成员变量赋初值,以便创建窗口。(3)消息循环 采用消息循环接收消息,在API编程中消息循环一般采用while循环语句来实现。其一般格式为: while (GetMessage(&msgTmp, NULL, 0, 0) / 消息循环 TranslateMessage(&msgTmp); / 翻译消息 DispatchMessage(&msgTmp); / 将消息传递给处理函数 注:变量msgTmp是一个MSG类型的结构对象。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号