版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 Windows编程基础,Windows 程序设计的基本概念Windows的事件驱动机制 Windows应用程序中常见的消息 Windows 程序设计的基本框架,本章主要内容,9.1 Windows 程序设计基本概念,1. Visual C+应用程序设计方法 (1)使用Windows提供的Windows API函数 Windows API是Windows系统和Windows应用程序间的标准程序接口,应用程序可以通过此接口访问系统。 (2)使用Microsoft提供的MFC类库 MFC类库集成了大量已经预先定义好的类,用户可以根据编程的需要调用相应的类,或根据需要自定义有关的类。,本章要点
2、,内容:使用Windows提供的API函数进行Windows程序设计 目的:掌握Windows程序的基本结构 理解Windows程序的运行机制,2. Windows程序设计基本概念 (1)窗口 窗口是应用程序与用户之间交互的接口环境。用户可以通过窗口输入数据,控制应用程序的运行;应用程序可以通过窗口显示数据和状态。 (2)对象与句柄 对象是指Windows的规范部件,包括各种窗口、菜单、按钮、对话框以及程序模块等。 所谓句柄,就是一个唯一的整数值,是一个4字节长的数值,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷和文件等。 由于Windows是一个多任务操作系统,它可以同时运行多
3、个程序或一个程序的多个副本。Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件和图标等系统资源。 常见的Windows对象句柄如表9-1所示,所有的句柄类型以H开头。,(3)事件驱动 Windows应用程序以消息为基础,以事件驱动之。Windows应用程序启动之后将进入一个消息循环,等待系统或应用程序的消息,消息的产生是因为事件发生的结果,Windows程序设计主要围绕编写事件或消息的响应函数上。,(4)消息(Message)及其在Windows编程中的应用,消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的
4、一个键都会使Windows发送一个消息给应用程序。 消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息。 鼠标被移动会产生WM_MOUSEMOVE消息; 鼠标左键被按下会产生WM_LBUTTONDOWN的消息; 鼠标右键按下便产生WM_RBUTTONDOWN消息等。,Windows应用程序是由消息驱动的。Windows系统下每一个应用程序窗口都维护一个消息队列,操作系统接收和管理所有输入消息、系统消息,并把它们发送给相应窗口的消息队列。应用程序初始化完成后,进入消息循环,维护自己的消息队列,从中取出消息,并进行处理。 编写消息处理函数是Windows编程的主要工作之一
5、。 系统传递给应用程序的消息数据是一个MSG结构体数据类型的数据。,消息的功能,功能 帮助Windows实现多任务。 通知应用程序某一事件已经发生,各应用程序给予响应。,消息的组成,操作系统是怎样将感知到的事件传递给应用程序呢?这是通过消息机制(Message)来实现的。 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。,在winuser.h中,消息结构体MSG的定义如下: typedef struct tagMSG / 消息 HWND hwnd; /目标窗口句柄 UINT
6、 message; /消息标识 WPARAM wParam; /消息参数1 LPARAM lParam; /消息参数2 DWORD time; /消息发送时间 POINT pt; /消息发送时鼠标的屏幕坐标 MSG; 消息标识 message 是利用#define 宏定义好的消息名标识,是用于区别其他消息的常量值,每个Windows消息都有一个信息值,该值由windows.h头文件中的宏定义来标识。,Windows程序和Windows消息处理的基本流程,Windows消息分类,在windows系统中,大约有近千种消息。大致可以分为3类: (1)Windows 消息 此类消息主要包括以前缀 WM
7、_ 开头的消息,WM_COMMAND 除外。如键盘消息、鼠标消息,Windows 消息由窗口和视图处理。 如:WM_LBUTTONDOWN 单击鼠标左键产生的消息 (2)控件消息 例如按钮,列表框的选择等都会产生通告消息。控件消息是从控件传送给父窗口的消息。 (3)命令消息 此类消息包括用户界面对象(菜单、工具栏按钮和快捷键)发出的 WM_COMMAND 通知消息。,在Win32中,消息统一由一个MSG结构来描述,每一条消息在消息队列中放置一个MSG结构变量。一般情况下,应用程序只需对结构中的消息类别message、附加参数wParam和lParam三个字段进行判断就可以区别一个消息。,系统保
8、留消息标识符的值在0 x0000在0 x03ff(WM_USER-1)范围。这些值被系统定义消息使用。应用程序不能使用这些值给自己的消息。 应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信. WM_NULL-0 x0000 空消息。0 x0001-0 x0087 主要是窗口消息。0 x00A0-0 x00A9 非客户区消息 0 x0100-0 x0108 键盘消息0 x0111-0 x0126 菜单消息0 x0132-0 x0138 颜色
9、控制消息0 x0200-0 x020A 鼠标消息0 x0211-0 x0213 菜单循环消息0 x0220-0 x0230 多文档消息0 x03E0-0 x03E8 DDE消息0 x0400 WM_USER0 x8000 WM_APP0 x0400-0 x7FFF 应用程序自定义私有消息,消息的传递,Windows系统有一个存放消息的队列。 每个应用程序也有一个消息队列。 Windows系统先将收到的消息存放在系统队列中。 然后再分发到相应的应用程序队列中。 应用程序则从自身的队列中获取消息并进行处理。,9.2 Windows 中的事件驱动,Windows应用程序以消息为基础,以事件驱动之。事
10、件用来标识发生的某件事情,主要采用以下三种方式产生: (1) 通过输入设备,如键盘和鼠标。 (2) 通过屏幕上的可视对象,如菜单、工具栏按钮、滚动条和对话框上的控件。 (3) 来自Windows内部。 事件驱动程序设计是围绕着消息的产生与处理而展开的。一条消息是关于发生的事件的信息。作为一个Windows程序员,其工作就是对正开发的应用程序所要发出或要接收的消息进行排序和管理。,Windows中事件产生的消息由系统传递给应用程序,应用程序必须有一个消息循环接收消息和处理相应的消息。消息循环的实现如下: MSG msg /定义一个MSG类型的变量 while (GetMessage ( /将消息
11、传递给窗口函数,以便处理相应的消息 ,9.3 Windows 应用程序中常见消息,1. 鼠标消息,2. 键盘消息 (1) WM_KEYDOWN 这是在按下一个非系统键时产生的消息。此外相似的消息还有WM_KEYUP,它是在放开非系统键时产生。 (2) WM_CHAR 这也是按下一个非系统键时产生的消息。 3. 关闭窗口消息 关闭窗口时产生的消息是WM_CLOSE。,4. 退出程序消息 退出程序时产生的消息是WM_QUIT,这是退出应用程序时由PostQuitMessage函数发出的消息。 The PostQuitMessage function indicates to the system
12、that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message. When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system. The exit value returned to the system must be the wP
13、aram parameter of the WM_QUIT message.,5. 重画消息 当发生用户区移动或显示事件、用户窗口改变大小的事件以及程序通过滚动条滚动窗口时,均产生一条WM_PAINT消息。此外,当下拉式菜单关闭并需要恢复被覆盖的部分以及Windows清除对话框或消息框等对象,并需要恢复被覆盖的部分时,将产生WM_PAINT消息。 WM_PAINT An application sends the WM_PAINT message when the system or another application makes a request to paint a portion
14、of an applications window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function.,【例】一个简单的Windows32应用程序。,#include int APIENTRY WinMain(HINSTANCE
15、hInstance,HINSTANCE hPreinstance,LPSTR lpCmdLine,int nCmdshow) MessageBox(NULL,一个简单的Win32应用程序,例9.1,MB_OK); return 0; ,9.4 Windows应用程序的基本框架,1. Windows应用程序的组成 一个完整的Windows应用程序通常由五种类型的文件组成,见下表。,2. Windows API 应用程序实例 Windows应用程序的开始部分十分相似,下面通过一个实例的分析充分展示Windows应用程序的各个部分。 【例9-1】简单窗口显示。,3. Windows API 应用程序
16、结构分析 Windows的应用程序具有相对固定的基本结构,其中由入口函数WinMain和窗口函数构成基本框架,并包含各种数据类型、数据结构与函数等。 1) WinMain函数 WinMain函数是所有Windows应用程序的入口,类似于C语言中的main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。 WinMain函数有三个基本的组成部分:函数说明、初始化和消息循环。,(1) WinMain函数说明 int WINAPI WinMain ( HINSTANCE hInstance, /应用程序当前实例句柄 HINSTANCE hPrevInstance, /应用程序其他实例句柄
17、PSTR szCmdLine, /指向程序命令行参数的指针 int iCmdShow )/应用程序开始执行时窗口显示方式/的整数值,(2) 初始化 初始化包括窗口类的定义、注册、创建窗口实例和显示四个部分。 窗口类的定义 窗口类定义通过给窗口类数据结构WNDCLASS赋值完成。,结构体类型WNDCLASS的定义如下: typedef struct tagWNDCLASS UINT style; /窗口类的样式,一般设置为0 WNDPROC lpfnWndProc; /指向窗口函数的指针 int cbClsExtra; /分配在窗口类结构后的字节数 int cbWndExtra; /分配在窗口实
18、例后的字节数 HINSTANCE hInstance;/定义窗口类的应用程序的实例句柄 HICON hIcon; /窗口类的图标 HCURSOR hCursor; /窗口类的光标 HBRUSH hbrBackground; /窗口类的背景刷 LPCWSTR lpszMenuName; /窗口类的菜单名 LPCWSTR lpszClassName; /窗口类名 WNDCLASS;, 注册窗口类 RegisterClass( /wndclass为窗口类结构 窗口类必须先注册后使用。, 创建窗口 创建一个窗口类的实例由函数CreatWindow( )实现,该函数的原型为: HWND CreateWi
19、ndow( LPCTSTR lpClassName, / 窗口类名 LPCTSTR lpWindowName, / 窗口标题名称 DWORD dwStyle, / 窗口样式,常用窗口样式见表9-5 int x, / 窗口左上角横坐标 int y, / 窗口左上角纵坐标 int nWidth, / 窗口宽度 int nHeight, / 窗口高度 HWND hWndParent, /该窗口的父窗口句柄 HMENU hMenu, / 窗口主菜单句柄 HANDLE hInstance, / 创建窗口的应用程序当前句柄 LPVOID lpParam / 指向一个传递给窗口的参数值的指针 );, 显示窗
20、口 由ShowWindow和 UpdateWindow函数共同实现。 ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); 其中,hwnd为窗口句柄,nCmdShow为窗口显示形式标识,常见显示形式标识及特点见表9-6。 调用完ShowWindow后,应用程序调用UpdateWindow更新窗口,并发出WM_PAINT消息,绘制用户区。,(3) 消息循环 MSG msg; /定义一个MSG类型的变量 while (GetMessage ( /消息分发 GetMessage的作用是从消息队列中读取一条消息,并将消息放在一个MSG结构的变量中。 Transl
21、ateMessage的作用是翻译消息,如将键盘操作转化为消息。 DispatchMessage函数将消息传递给窗口函数,以便处理相应的消息。,2) 窗口函数 窗口函数是应用程序处理接收到的消息的函数,其中包含了应用程序对各种可能接收到的消息的处理过程,是消息处理分支控制语句的集合。 一般来说,窗口函数由一个或多个switch语句组成。每一个case语句对应一种消息,当应用程序接受到一个消息时,在窗口函数内的相应的case语句就会被激活并执行相应的响应程序模块。,窗口函数的一般形式如下: LRESULT CALLBACK WndProc ( HWND hwnd, /窗口句柄 UINT iMsg,
22、 /代表所处理消息的消息值 WPARAM wParam, /消息的附加参数 LPARAM lParam) /消息的附加参数 switch (iMsg) case WM_DESTROY : PostQuitMessage (0) ; /调用函数PostQuitessage退出程序 return 0 ; /系统默认的处理过程,以保证所有发送到该窗口的消息均得以处理。 return DefWindowProc (hwnd, iMsg, wParam, lParam) ; ,Windows中的数据类型 除了C+中经典的数据类型,在32位Windows的C+开发平台中,为了满足数据定义的需要,扩充定义了一些新的数据类型。一般而言,指针数据类型以P或LP作为前缀,句柄类型以H作为前缀。(参下表或MSDN),Windows常用的基本数据类型,Windows基本数据类型,说明: 这些基本数据类型都是用大写字符来表示,以与一般C+基本数据类型相区别。 数据类型的前缀是P或LP,表示是一个指针或长指针数据类型。前缀是U,表示无符号数据类型,等等。 Windows还提供一些宏来处理上述基本数据类型。,Windows中的数据类型 类型 定义-BOOL 布尔型(逻辑型)变量(应为TRUE或FALSE)BOOLEAN 布尔型(逻辑型)变量(应为TRUE或FALSE)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医护理面部护理
- 2026年山西省太原市单招职业适应性测试题库附答案详解(典型题)
- 2026年广西安全工程职业技术学院单招职业适应性测试题库带答案详解(a卷)
- 2026年广东省广州市单招职业倾向性测试题库及答案详解(夺冠)
- 2026年山西运城农业职业技术学院单招职业倾向性测试题库带答案详解(综合题)
- 2026年常德科技职业技术学院单招职业技能测试题库及答案详解(基础+提升)
- 2026年广东省惠州市单招职业倾向性考试题库含答案详解(培优b卷)
- 2025年AI驱动蔬菜种植标准化管理
- 保洁工作心理调适技巧
- 儿科护理中的伦理决策与案例分析
- 小学二年级下册《人与社会》教案
- 第一单元 一方水土一方情跟着课文探民风 整体公开课一等奖创新教学设计
- 租赁合同(2025年写字楼转租)
- (一模)东北三省三校2026年高三第一次联合模拟考试英语试卷(含答案)+听力音频+听力原文
- 2025-2030中国对叔丁基苯甲酸市场竞争格局展望与营销创新发展趋势研究报告
- 设计公司钉钉考勤制度
- (2026春新版)苏教版二年级数学下册全册教学设计1
- 2026年江苏农林职业技术学院单招职业技能考试题库附答案解析
- 2026年上饶职业技术学院单招职业适应性测试题库及答案详解(历年真题)
- 2026石嘴山市能达建设发展有限公司招聘3人考试参考题库及答案解析
- 2026年春季人教版小学数学三年级下册教学计划(含进度表)
评论
0/150
提交评论