02-窗口程序.ppt_第1页
02-窗口程序.ppt_第2页
02-窗口程序.ppt_第3页
02-窗口程序.ppt_第4页
02-窗口程序.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、Windows高级编程 窗口程序,Instructor : Teaching Assistants: ?,Windows高级编程 20072008 学年 第一学期 绪论 - 2,主要内容,21 基本概念 22 程序结构 23 程序实例,Windows高级编程 20072008 学年 第一学期 绪论 - 3,主要内容,21 基本概念 22 程序结构 23 程序实例,介绍Windows窗口程序基本概念。,Windows高级编程 20072008 学年 第一学期 绪论 - 4,窗口,窗口是Windows应用程序中一个非常重要的元素,一个Windows应用程序至少要有一个窗口,称为主窗口。窗口是屏幕上

2、的一块矩形区域,是Windows应用程序与用户进行交互的接口。利用窗口,可以接收用户的输入,以及显示输出。,Windows高级编程 20072008 学年 第一学期 绪论 - 5,窗口(续),一个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最小化框、最大化框、可调边框,有的还有滚动条。 窗口可以分为客户区和非客户区。客户区是窗口的一部分,应用程序通常在客户区中显示文字或者绘制图形。标题栏、菜单栏、系统菜单、最小化框和最大化框、可调边框统称为窗口的非客户区,它们由Windows系统来管理,而应用程序则主要管理客户区的外观及操作。 窗口可以有一个父窗口,有父窗口的窗口称为子窗口。对话框和消息框

3、也是一种窗口。在对话框上通常还包含许多子窗口,这些子窗口的形式有按钮、单选按钮、复选框、文本编辑框等。,Windows高级编程 20072008 学年 第一学期 绪论 - 6,句柄,句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。句柄并不是指针,采用句柄来访问系统资源,可以防止应用程序直接访问系统对象的内部结构。 例如:一个窗口打开之后,操作系统将会为它分配一个内存块,这个窗口所在的内存块地址往往会由操作系统做动态的调整,但窗口所对应的句柄值却不会随之变化,因此可以通过句柄来访问这个窗口

4、。,Windows高级编程 20072008 学年 第一学期 绪论 - 7,句柄的常见类型,Windows高级编程 20072008 学年 第一学期 绪论 - 8,数据类型,Windows应用程序中的数据量非常大,为了提高应用程序的可读性,Windows给许多基本数据类型定义了别名,例如: Typedef unsigned long DWORD; Typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; 等等。,Windows高级编程 20072008 学年 第一学期 绪论 - 9,数据类型(续),Wi

5、ndows应用程序还使用了一些结构类型的数据,例如: typedefstructtag_POINT LONG x,y; POINT; 描述了一个点的位置。,Windows高级编程 20072008 学年 第一学期 绪论 - 10,typedef struct tagMSG HWNDhwnd; UINTmessage; WPARAM wParam; LPARAM lParam; DWORD time; POINTpt; MSG;,这是一个事件,事件的描述是一个消息,事件与消息,Windows高级编程 20072008 学年 第一学期 绪论 - 11,事件驱动,在传统的C程序中,我们调用fopen

6、函数打开文件,这个库函数最终调用操作系统(提供的函数)来打开文件。而在Windows中,不仅用户程序可以调用系统的API函数,反过来,系统也会调用用户程序,这个调用是通过消息来进行的。,Windows高级编程 20072008 学年 第一学期 绪论 - 12,事件驱动(续),Windows程序设计是一种事件驱动方式的程序设计模式,主要是基于消息的。例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行响应。 在这个处理过程中,操作系统会给应用程序“发送消息”。所谓“发送消息”

7、,实际上是操作系统调用应用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。,Windows高级编程 20072008 学年 第一学期 绪论 - 13,消息,在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下(参见MSDN): typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,Windows高级编程 20072008 学年 第一学期 绪论 - 14,消息(续),第一个成员变量hwnd表示消息所属窗口的句柄。

8、我们通常开发的程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在Windows程序中,用HWND类型的变量来标识窗口。,Windows高级编程 20072008 学年 第一学期 绪论 - 15,消息(续),第二个成员变量message指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是Window Message的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键按下消息是W

9、M_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。,Windows高级编程 20072008 学年 第一学期 绪论 - 16,消息(续),第三、第四个成员变量wParam和lParam,用于指定消息的附加信息。例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wParam和lParam来说明。wParam、lParam表示的信息随消息的不同而不同。 最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。,Window

10、s高级编程 20072008 学年 第一学期 绪论 - 17,常见的Windows消息,Windows高级编程 20072008 学年 第一学期 绪论 - 18,主要内容,21 基本概念 22 程序结构 23 程序实例,介绍Windows窗口程序的结构 及工作原理。,Windows高级编程 20072008 学年 第一学期 绪论 - 19,一个基本的窗口程序,Windows应用程序大多数都有一个窗口,要编写一个带窗口的基本程序必须要经过以下几步: 定义窗口过程函数 注册窗口类 创建窗口 显示并更新窗口 进入消息循环,Windows高级编程 20072008 学年 第一学期 绪论 - 20,Wi

11、ndows、主函数、窗口函数之间的关系,Windows高级编程 20072008 学年 第一学期 绪论 - 21,窗口过程函数,一个Windows应用程序的主要代码部分就集中在窗口过程函数中。在MSDN中可以查到窗口过程函数的声明形式,如下所示: LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter );

12、窗口过程函数的名字可以随便取,如WinSunProc,但函数定义的形式必须和上述声明的形式相同。,Windows高级编程 20072008 学年 第一学期 绪论 - 22,窗口过程函数实例,LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /处理感兴趣的消息 switch (message) case WM_DESTROY: /当用户关闭窗口,窗口销毁,程序需结束, /发退出消息,以退出消息循环 PostQuitMessage (0) ; return 0 ; /其他消息交给由系统提供

13、的缺省处理函数 return :DefWindowProc (hwnd, message, wParam, lParam) ; ,Windows高级编程 20072008 学年 第一学期 绪论 - 23,定制窗口类结构,WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; /关联消息处理函数 wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ;

14、 /实例句柄 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;/图标 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; /光标 wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);/画刷 wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName;/类名称,Windows高级编程 20072008 学年 第一学期 绪论 - 24,注册窗口类,if

15、(!RegisterClass ( ,Windows高级编程 20072008 学年 第一学期 绪论 - 25,建立窗口,HWND hwnd ; hwnd = CreateWindow (szAppName, /窗口类名称 TEXT (The Hello Program), /窗口标题 WS_OVERLAPPEDWINDOW, /窗口风格 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,/实例句柄 NULL);,Windows高级编程 20072008 学年 第一学期 绪论 -

16、26,显示、更新窗口,ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ;,Windows高级编程 20072008 学年 第一学期 绪论 - 27,消息循环,MSG msg ; while (GetMessage (,Windows高级编程 20072008 学年 第一学期 绪论 - 28,Windows消息循环机制,Windows高级编程 20072008 学年 第一学期 绪论 - 29,Windows消息处理机制,(1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。 (2)应用程序在消息循环中调用GetMessag

17、e函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。 (3)应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。 (4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。,Windows高级编程 20072008 学年 第一学期 绪论 - 30,消

18、息队列,每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。 例如,当我们按下鼠标左键的时候,将会产生WM_LBUTTONDOWN消息,系统会将这个消息放到窗口所属的应用程序的消息队列中,等待应用程序的处理。 Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断地从消息队列中取出消息,并进行响应。这种消息机制,就是Windows程序运行的机制。,Windows高级编程 20072008 学年 第一学期 绪论 - 31,消息的获取,从消息队列中获取消息还可以调用PeekMessage函数,该函数的原型声明

19、如下所示: BOOL PeekMessage( LPMSG lpMsg, / message information HWND hWnd, / handle to window UINT wMsgFilterMin, / first message UINT wMsgFilterMax, / last message UINT wRemoveMsg / removal options); 前4个参数和GetMessage函数的4个参数的作用相同。最后1个参数指定消息获取的方式,如果设为M_NOREMOVE,那么消息将不会从消息队列中被移除;如果设为PM_REMOVE,那么消息将从消息队列中被移

20、除(与GetMessage函数的行为一致)。关于PeekMessage函数的更多信息,请参见MSDN。,Windows高级编程 20072008 学年 第一学期 绪论 - 32,消息的发送,发送消息可以使用SendMessage和PostMessage函数。 SendMessage将消息直接发送给窗口,并调用该窗口的窗口过程进行处理。在窗口过程对消息处理完毕后,该函数才返回(SendMessage发送的消息为不进队消息)。 PostMessage函数将消息放入与创建窗口的线程相关联的消息队列后立即返回。,Windows高级编程 20072008 学年 第一学期 绪论 - 33,主要内容,21 基本概念 22 程序结构 23 程序实例,介绍Windows窗口程序开发过程。,Windows高级编程 20072008 学年 第一学期 绪论 - 34,在VC中建立工程,Windows高级编程 20072008 学年 第一

温馨提示

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

评论

0/150

提交评论