信息系统201-Windows消息机制_第1页
信息系统201-Windows消息机制_第2页
信息系统201-Windows消息机制_第3页
信息系统201-Windows消息机制_第4页
信息系统201-Windows消息机制_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、信息系统技术基础-2,授课老师: ; 实验老师:,contact information,name: 王长军 office: 721 tel: 62378372(o);m) email: personal information 2007-present 物流系, dhu 2005-2006 computer system division, sec 2002-2005 sjtu,课程概要,企业信息化、政府信息化和社会信息化孕育着巨大的软件市场 新技术(ipv6、3g、移动ip、wibro、蓝牙、rfid)驱动软件市场 新商业模式(e-commerce、m-comme

2、rce)拉动软件市场,软件是it的核心与灵魂,课程概要,王志宏 操作系统相关 王长军 软件项目开发基础 windows api编程基础(消息机制;进程/线程;图形接口) 软件项目实施基础,windows消息机制,王长军 2007年7月,讲授内容,1. 课程背景 2. windows程序的特点 3. 事件与消息系统 4. windows程序的基本结构 5. 实验:利用api 开发windows程序实例,1.1 预备知识,windows操作系统:用过吧! 一门编程语言:c/vb,学过吧!(c#, java, delphi) 一个适合windows程序设计的编译器和开发环境:microsoft vi

3、sual c+ 6.0/ visual basic 6.0,1.2 课程目标,不是编程 api (application programming interface)而不是mfc (microsoft foundation class) 消化”消息”,1.3 windows相关,api 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,api 由一个或多个提供某种特殊功能的 dll 组成 每个 windows 应用程序都直接或间接地使用了 windows api 随着 windows 操作系统的发展,windows api的内容也在不断扩充之中,1.3 w

4、indows相关,ms-dos,ibm-pc,有限的i/o函数,1981,os,硬件,ms1.03.0,16bit hw,api函数,1983,图形环境,ntxp,16/32bit hw,api函数,1993,图形环境,vista,32/64bit hw,api函数,2006,3d图形环境,过程驱动,消息驱动,1.3 windows相关,ntxp,32bit hw,api函数,1993,图形环境,vista,32/64bit hw,api函数,2006,3d图形环境,mfc (microsoft foundation class library ),wpf (windows presentat

5、ion foundation ) wcf (windows communication foundation) wwf (windows workflow foundation),1.3 windows相关,dos与windows驱动机制的区别 dos是过程驱动 在等待用户输入过程中,所有输入设备(资源)都被“等待”过程抢占了。 windows是消息(事件)驱动,2. windows程序的特点,2.1图文 2.2消息 2.3整合,2.1 图文,1不仅是黑底白字 2. 而是 框架菜单按钮滚动条 称为窗口要素 3. 窗口类型 console 文字类型 window 菜单+用户区域 dialog m

6、essage box 4. 实现途径gdi(图形设备接口,gdi32.dll),2.2 消息,不再是循规蹈矩 而是message based, event driven 窗口程序的主要任务是人机交互 除非人主动结束任务,程序以while循环为主体框架 人不断进行各种输入,计算机不断响应,形成“输入”“响应”的程序结构,2.2 消息,各种类型的“输入”,以消息格式存在 getmessage()取走一个消息 对事件的响应,即事件驱动 dispatchmessage()处理消息 实现途径user32.dll,2.3 整合,ms windows结构 os系统服务(kernel):内存管理、程序加载(包

7、括dll)、任务调度、文件管理 用户接口(user):窗口和消息管理,以及菜单、控制、对话框、定时器等 图形设备接口(gdi, graphic device interface):管理显示器,为user与应用程序提供与硬件设备独立的接口 对应的,api函数也分为三类: 系统服务;管理和图形设备函数,2.3 整合,.dlg,.bmp,.ico,.cur,.fon,.rc,.h,.c,.obj,.lib dll import,.def,rc compiler,text editor,dialog editor,image editor,font editor,c compiler,linker,.

8、exe,.res,3. 事件与消息系统,3.1事件和事件驱动 3.2消息系统 3.3一个具体的窗口程序,3.1 事件和事件驱动,windows程序为消息而“生”,因消息而“死” 那么,消息从何而来? windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(events)产生的消息(message)。 那么,事件又从何而来? 通过输入设备,如键盘和鼠标 通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件 来自windows内部,基于事件驱动的程序模型,3.1 事件和事件驱动,windows消息系统的组成 消息队列 消息循环 窗口过程,3.2 消息系统,

9、消息的数据结构 消息的数据结构msg的定义如下: typedef struct tagmsg hwnd hwnd; /用以检索消息的窗口句柄 uint message;/消息值 wparam wparam;/包含有关消息的附加信息 lparam lparam; /随不同的消息而有所不同 dword time;/消息送到队列的时间 point pt; /消息发送时,屏幕光标的位置 msg;,3.2 消息系统,windows常用消息 wm_lbuttondown:单击鼠标左键时产生的消息; wm_lbuttonup:放开鼠标左键时产生的消息; wm_rbuttondown:单击鼠标右键时产生的消息

10、; wm_rbuttonup:放开鼠标右键时产生的消息; wm_lbuttondblclk:双击鼠标左键时产生的消息; wm_rbuttondblclk:双击鼠标右键时产生的消息; wm_create:createwindows()函数产生的消息; wm_close:关闭窗口时产生的消息; wm_quit:退出应用程序时由postquitmessage()发出的消息; wm_paint:windows系统需要重绘时产生的消息。 ,3.2 消息系统,3.2 消息系统,消息队列 消息队列是系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程 在16位的系统中系统中只有一个消息队列 32位

11、的系统中每一运行的程序都会有一个消息队列,支持队列特征的消息驱动模型,3.2 消息系统,消息队列,3.2 消息系统,什么是消息循环 while(getmessage( ,3.2 消息系统,windows消息处理示意图,windows系统,应用 程序 队列a,应用 程序 队列b,系统队列,winmain函数 消息循环,窗口 函数1,窗口 函数2,winmain函数 消息循环,窗口 函数1,窗口 函数2,应用程序a,应用程序b,消息循环,winmain() 初始化; while(getmessage( ,系统 消息 队列,wndproc(msg) ,switch(msg) case msg1: c

12、ase msg2: ,应用 程序 消息 队列,mouse driver,keyboard driver,sendmessage(),user module,message from other window,postmessage(),system,3.3 一个具体的窗口程序,4. win32程序的基本结构,4.1. windows程序组成 4.2. 详解入口,窗口,消息 4.3. windows数据类型 4.4. windows程序的“生生死死”,winmain()程序入口点 注册窗口 registerclass() 生成并显示窗口 createwindow() showwindow() 消

13、息循环 wndproc()窗口函数(功能实现) 区分消息 switch 根据消息触发相应处理 调用defwindowproc() 不处理的消息、和需要系统进一步处理的消息 如wm_close,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作,4.1. windows程序组成,winmain() 初始化; 创建、显示、更新窗口; 建立基于消息的 事件驱动机制 ,winmain() registerclass( ); createwindow( ); showwindow( ); updatewindow( ); while(getmessage( ,

14、winmain()程序入口点,4.2. 详解入口,4.2. 详解入口,winmain函数的原型如下: int winapi winmain ( hinstance hinstance, / 当前实例句柄 hinstance hprevinstance, / 以前的实例句柄 lpstr lpcmdline, / 指向命令行参数的指针 int ncmdshow ) / 窗口的显示状态,初始化包括 定义窗口 注册窗口 创建窗口 显示窗口 需要注意的是,在显示窗口showwindow函数后,需调用updatewindow()函数更新并绘制用户区,并发出wm_paint消息。,4.2. 详解窗口,注册窗

15、口registerclass( ) 在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnwndproc参数,wndclass wc; wc.stvle = ; wc.lpfnwndproc (wndproc)wndproc;,提示系统收到消息后,调该函数处理消息,wc.hicon = ,wc.cursor = ,wc.hbrbackground = ,registerclass(,4.2. 详解窗口,createwindow() showwindow() updatewindow(),4.2. 详解窗口,hwnd createwindow( lpctstr lpclas

16、sname, / 已注册的窗口类名 lpctstr lpwindowname, / 窗口标题 dword dwstyle, / 窗口风格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nwidth, / 窗口宽度 int nheight, / 窗口高度 hwnd hwndparent, / 父窗口句柄 hmenu hmenu, / 菜单句柄或控件标识 hinstance hinstance, / 应用程序实例句柄 lpvoid lpparam ) / 其他窗口创建时的参数数据,消息 本身是一个无符号整型变量 类型有 wm_command:系统命令类,菜单选择,按钮

17、等 wm_paint: 对窗口作图 wm_destory: 关闭窗口 wm_user: 用户可自定义一些消息 在某个特定类型之下,更有许多事件,一般通过wparam通知,4.2. 详解消息,while(getmessage( getmessage具有阻塞机制 当消息队列中没有消息时,程序非忙等,而是让权等待 当收到wm_quit时,getmessage返回false,循环停止,同时应用程序终止。 dispatchmessage 通过user模块协助,将消息传递到wndproc wndproc的调用指示在注册窗口类时,已向系统指明,4.2. 详解消息采集,wndproc( hwnd hwnd,

18、uint message, wparam wparam, lparam lparam),hwnd hwnd: 窗口句柄,在与窗口有关的控制中使用,uint message:消息(类型),wparam wparam:传递的参数,lparam lparam: 传递的参数,1-在基于消息的机制中,有时仅有消息是不够的 2-产生消息的同时,传递什么样的参数要视具体 的消息而定,4.2. 详解消息处理,消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。,wndproc( hwnd, message, wparam, lparam),switch(message),case

19、 wm_command:,id = loword(wparam);,switch(id) ,case idm_open:,break;,菜单中的open选项,case wm_paint:,在视窗作图;,break;,default:,defwindowproc();,4.2. 详解消息处理,4.2. 详解消息处理,思考:怎样根据功能要求 生成消息,并把这个消息 传递给窗口函数?,窗口程序的可能结构,在窗口中显示,4.3. windows数据类型,windows将使用的所有类型定义在windows.h文件和其相关的文件中。 一些常用的类型有句柄(handle)、窗口句柄(hwnd)、字符(byt

20、e)、短整数(word)、布尔型(bool)、字符串指针(lpstr)以及常量字符串指针(lpcstr)等。 handle是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以h开头。 凡是数据类型的前缀是p或lp,则表示该类型是一个指针或长指针数据类型。若前缀是u,则表示无符号数据类型,等等。,4.3. windows数据类型,程序初始化过程中调用createwindow,为程序创建了一个窗口,createwindow送出wm_create直接给窗口函数,后者可以在此时做些初始化操作; 在程序运行过程中,不断以getmessage从消息队列中取得消息。如果这个消息是wm

21、_quit,getmessage会得到false的返回值而结束循环,进而结束整个程序; dispatchmessage通过系统user模块的协助与监督,把消息分派至窗口函数,消息将被处理; 程序不断循环; 当使用者按下系统菜单中的close命令时,系统送出wm_close,通常窗口程序不处理它,由defwindowproc处理; defwindowproc处理wm_close,调用destorywindow把窗口清除,送出wm_destory; 窗口程序对wm_destory的处理是调用postquitmessage; postquitmessage送出wm_quit,于是winmain的循环

22、结束了,整个应用程序也结束了。,4.4. windows程序的“生生死死”,createwindow(),wm_create,getmessage(),dispatchmessage(wm_create),wndproc(wm_create),用户程序初始化,启动,4.4. windows程序的“生”,winmain() 初始化; createwindow(); while(getmessage( ,wndproc(msg) ,switch(msg) case wm_create: 用户程序初始化 case wm_destory: postquitmessage() default: defw

23、indowproc() ,使用者按下关闭按钮,wm_close,getmessage(),dispatchmessage( wm_close),wndproc(wm_close),defwindowproc(wm_close),关闭,winmain() 初始化; createwindow(); while(getmessage( ,wndproc(msg) ,switch(msg) case wm_create: 用户程序初始化 case wm_destory: postquitmessage() default: defwindowproc() ,destorywindow( ),wm_de

24、story,getmessage(),dispatchmessage( wm_destory),wndproc(wm_destory),postquitmessage(),wm_qiut,getmessage()返回为0,while结束 winmain结束,整个程序结束,4.4. windows程序的“死”,下面介绍建立基于api的应用程序框架的步骤。 (1) 在file下拉菜单中选择new选项,以建立项目文件。 (2) 在弹出的new对话框中,选择projects选项卡,并选择其中的win32 application项,在project name编辑框中填人所要创建的项目文件名myapi,然

25、后单击ok按钮。 (3) 此时弹出如后图所示的界面,选择其中的an empty project选项,说明是创建一个空的项目文件。,5. 实验:利用api开发win32程序实例,win32 application step 1 of 1对话框,5. 利用api开发win32程序实例,new project information对话框,5. 利用api开发win32程序实例,空的win32应用程序框架界面,5. 利用api开发win32程序实例,insert files into project对话框,5. 利用api开发win32程序实例,windows窗口程序的运行结果,5. 利用api开发

26、win32程序实例,源程序代码如下: #include /窗口函数说明 lresult callback wndproc(hwnd,uint,wparam,lparam); /初始化窗口类 /winmain函数说明 int winapi winmain(hinstance hinstance,hinstance hprevinst, lpstr lpszcmdline, int ncmdshow) hwnd hwnd ; msg msg ; wndclass wndclass ; char lpszclassname = “窗口”;/窗口类名 char lpsztitle= my_window

27、s; /窗口标题名,5. 利用api开发win32程序实例,wndclass.style = 0; /窗口类型为缺省类型 wndclass.lpfnwndproc = wndproc ;/窗口处理函数为wndproc wndclass.cbclsextra= 0 ; /窗口类无扩展 wndclass.cbwndextra= 0 ;/窗口实例无扩展 wndclass.hinstance = hinstance ; /当前实例句柄 wndclass.hicon = loadicon( null, idi_application) ; /窗口的最小化图标为缺省 wndclass.hcursor = loadcursor( null, idc_arrow) ;

温馨提示

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

评论

0/150

提交评论