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

下载本文档

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

文档简介

.,信息系统技术基础-2,授课老师:王志宏;王长军实验老师:王长军,.,ContactInformation,Name:王长军Office:721Tel:62378372(O)M)Email:cjwangPersonalInformation2007-Present物流系,DHU2005-2006ComputerSystemDivision,SEC2002-2005SJTU,.,课程概要,企业信息化、政府信息化和社会信息化孕育着巨大的软件市场新技术(IPV6、3G、移动IP、Wibro、蓝牙、RFID)驱动软件市场新商业模式(E-Commerce、M-Commerce)拉动软件市场,软件是IT的核心与灵魂,.,课程概要,王志宏操作系统相关王长军软件项目开发基础WindowsAPI编程基础(消息机制;进程/线程;图形接口)软件项目实施基础,.,Windows消息机制,王长军2007年7月,.,讲授内容,1.课程背景2.Windows程序的特点3.事件与消息系统4.Windows程序的基本结构5.实验:利用API开发Windows程序实例,.,1.1预备知识,Windows操作系统:用过吧!一门编程语言:C/VB,学过吧!(C#,Java,Delphi)一个适合Windows程序设计的编译器和开发环境:MicrosoftVisualC+6.0/VisualBasic6.0,.,1.2课程目标,不是编程API(ApplicationProgrammingInterface)而不是MFC(MicrosoftFoundationClass)消化”消息”,.,1.3Windows相关,API就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API由一个或多个提供某种特殊功能的DLL组成每个Windows应用程序都直接或间接地使用了WindowsAPI随着Windows操作系统的发展,WindowsAPI的内容也在不断扩充之中,.,1.3Windows相关,MS-DOS,IBM-PC,有限的I/O函数,1981,OS,硬件,MS1.03.0,16bitHW,API函数,1983,图形环境,NTXP,16/32bitHW,API函数,1993,图形环境,Vista,32/64bitHW,API函数,2006,3D图形环境,过程驱动,消息驱动,.,1.3Windows相关,NTXP,32bitHW,API函数,1993,图形环境,Vista,32/64bitHW,API函数,2006,3D图形环境,MFC(MicrosoftFoundationClassLibrary),WPF(WindowsPresentationFoundation)WCF(WindowsCommunicationFoundation)WWF(WindowsWorkflowFoundation),.,1.3Windows相关,DOS与Windows驱动机制的区别DOS是过程驱动在等待用户输入过程中,所有输入设备(资源)都被“等待”过程抢占了。Windows是消息(事件)驱动,.,2.Windows程序的特点,2.1图文2.2消息2.3整合,.,2.1图文,1不仅是黑底白字2.而是框架菜单按钮滚动条称为窗口要素3.窗口类型Console文字类型Window菜单+用户区域DialogMessageBox4.实现途径GDI(图形设备接口,GDI32.dll),.,2.2消息,不再是循规蹈矩而是Messagebased,eventdriven窗口程序的主要任务是人机交互除非人主动结束任务,程序以while循环为主体框架人不断进行各种输入,计算机不断响应,形成“输入”“响应”的程序结构,.,2.2消息,各种类型的“输入”,以消息格式存在GetMessage()取走一个消息对事件的响应,即事件驱动DispatchMessage()处理消息实现途径User32.dll,.,2.3整合,MSWindows结构OS系统服务(KERNEL):内存管理、程序加载(包括DLL)、任务调度、文件管理用户接口(USER):窗口和消息管理,以及菜单、控制、对话框、定时器等图形设备接口(GDI,GraphicDeviceInterface):管理显示器,为USER与应用程序提供与硬件设备独立的接口对应的,API函数也分为三类:系统服务;管理和图形设备函数,.,2.3整合,.DLG,.BMP,.ICO,.CUR,.FON,.RC,.H,.C,.OBJ,.LIBDLLImport,.DEF,RCcompiler,TextEditor,DialogEditor,ImageEditor,FontEditor,CCompiler,LINKER,.EXE,.RES,.,3.事件与消息系统,3.1事件和事件驱动3.2消息系统3.3一个具体的窗口程序,.,3.1事件和事件驱动,Windows程序为消息而“生”,因消息而“死”那么,消息从何而来?Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。那么,事件又从何而来?通过输入设备,如键盘和鼠标通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件来自Windows内部,.,基于事件驱动的程序模型,3.1事件和事件驱动,.,Windows消息系统的组成消息队列消息循环窗口过程,3.2消息系统,.,消息的数据结构消息的数据结构MSG的定义如下:typedefstructtagMSGHWNDhwnd;/用以检索消息的窗口句柄UINTmessage;/消息值WPARAMwParam;/包含有关消息的附加信息LPARAMlParam;/随不同的消息而有所不同DWORDtime;/消息送到队列的时间POINTpt;/消息发送时,屏幕光标的位置MSG;,3.2消息系统,.,Windows常用消息WM_LBUTTONDOWN:单击鼠标左键时产生的消息;WM_LBUTTONUP:放开鼠标左键时产生的消息;WM_RBUTTONDOWN:单击鼠标右键时产生的消息;WM_RBUTTONUP:放开鼠标右键时产生的消息;WM_LBUTTONDBLCLK:双击鼠标左键时产生的消息;WM_RBUTTONDBLCLK:双击鼠标右键时产生的消息;WM_CREATE:CreateWindows()函数产生的消息;WM_CLOSE:关闭窗口时产生的消息;WM_QUIT:退出应用程序时由PostQuitMessage()发出的消息;WM_PAINT:Windows系统需要重绘时产生的消息。,3.2消息系统,.,3.2消息系统,消息队列消息队列是系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程在16位的系统中系统中只有一个消息队列32位的系统中每一运行的程序都会有一个消息队列,.,支持队列特征的消息驱动模型,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)caseMSG1:caseMSG2:,应用程序消息队列,mousedriver,keyboarddriver,SendMessage(),USERModule,messagefromOtherwindow,PostMessage(),system,3.3一个具体的窗口程序,.,4.Win32程序的基本结构,4.1.Windows程序组成4.2.详解入口,窗口,消息4.3.Windows数据类型4.4.Windows程序的“生生死死”,.,WinMain()程序入口点注册窗口RegisterClass()生成并显示窗口CreateWindow()ShowWindow()消息循环WndProc()窗口函数(功能实现)区分消息switch根据消息触发相应处理调用DefWindowProc()不处理的消息、和需要系统进一步处理的消息如WM_CLOSE,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作,4.1.Windows程序组成,.,WinMain()初始化;创建、显示、更新窗口;建立基于消息的事件驱动机制,WinMain()RegisterClass();CreateWindow();ShowWindow();UpdateWindow();while(GetMessage(,WinMain()程序入口点,4.2.详解入口,.,4.2.详解入口,WinMain函数的原型如下:intWINAPIWinMain(HINSTANCEhInstance,/当前实例句柄HINSTANCEhPrevInstance,/以前的实例句柄LPSTRlpCmdLine,/指向命令行参数的指针intnCmdShow)/窗口的显示状态,.,初始化包括定义窗口注册窗口创建窗口显示窗口需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow()函数更新并绘制用户区,并发出WM_PAINT消息。,4.2.详解窗口,.,注册窗口RegisterClass()在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnWndProc参数,WNDCLASSwc;wc.stvle=;wc.lpfnWndProc(WNDPROC)WndProc;,提示系统收到消息后,调该函数处理消息,wc.hIcon=,wc.Cursor=,wc.hbrBackground=,RegisterClass(,4.2.详解窗口,.,CreateWindow()ShowWindow()UpdateWindow(),4.2.详解窗口,HWNDCreateWindow(LPCTSTRlpClassName,/已注册的窗口类名LPCTSTRlpWindowName,/窗口标题DWORDdwStyle,/窗口风格intx,/窗口的水平位置inty,/窗口的垂直位置intnWidth,/窗口宽度intnHeight,/窗口高度HWNDhWndParent,/父窗口句柄HMENUhMenu,/菜单句柄或控件标识HINSTANCEhInstance,/应用程序实例句柄LPVOIDlpParam)/其他窗口创建时的参数数据,.,消息本身是一个无符号整型变量类型有WM_COMMAND:系统命令类,菜单选择,按钮等WM_PAINT:对窗口作图WM_DESTORY:关闭窗口WM_USER:用户可自定义一些消息在某个特定类型之下,更有许多事件,一般通过wParam通知,4.2.详解消息,.,while(GetMessage(GetMessage具有阻塞机制当消息队列中没有消息时,程序非忙等,而是让权等待当收到WM_QUIT时,GetMessage返回false,循环停止,同时应用程序终止。DispatchMessage通过USER模块协助,将消息传递到WndProcWndProc的调用指示在注册窗口类时,已向系统指明,4.2.详解消息采集,.,WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam),HWNDhWnd:窗口句柄,在与窗口有关的控制中使用,UINTmessage:消息(类型),WPARAMwParam:传递的参数,LPARAMlParam:传递的参数,1-在基于消息的机制中,有时仅有消息是不够的2-产生消息的同时,传递什么样的参数要视具体的消息而定,4.2.详解消息处理,消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。,.,WndProc(hWnd,message,wParam,lParam),switch(message),caseWM_COMMAND:,id=LOWORD(wParam);,Switch(id),caseIDM_OPEN:,break;,菜单中的open选项,caseWM_PAINT:,在视窗作图;,break;,default:,DefWindowProc();,4.2.详解消息处理,.,4.2.详解消息处理,思考:怎样根据功能要求生成消息,并把这个消息传递给窗口函数?,窗口程序的可能结构,在窗口中显示,.,4.3.Windows数据类型,.,Windows将使用的所有类型定义在Windows.h文件和其相关的文件中。一些常用的类型有句柄(HANDLE)、窗口句柄(HWND)、字符(BYTE)、短整数(WORD)、布尔型(BOOL)、字符串指针(LPSTR)以及常量字符串指针(LPCSTR)等。HANDLE是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以H开头。凡是数据类型的前缀是P或LP,则表示该类型是一个指针或长指针数据类型。若前缀是U,则表示无符号数据类型,等等。,4.3.Windows数据类型,.,程序初始化过程中调用CreateWindow,为程序创建了一个窗口,CreateWindow送出WM_CREATE直接给窗口函数,后者可以在此时做些初始化操作;在程序运行过程中,不断以GetMessage从消息队列中取得消息。如果这个消息是WM_QUIT,GetMessage会得到false的返回值而结束循环,进而结束整个程序;DispatchMessage通过系统USER模块的协助与监督,把消息分派至窗口函数,消息将被处理;程序不断循环;当使用者按下系统菜单中的Close命令时,系统送出WM_CLOSE,通常窗口程序不处理它,由DefWindowProc处理;DefWindowProc处理WM_CLOSE,调用DestoryWindow把窗口清除,送出WM_DESTORY;窗口程序对WM_DESTORY的处理是调用PostQuitMessage;PostQuitMessage送出WM_QUIT,于是WinMain的循环结束了,整个应用程序也结束了。,4.4.Windows程序的“生生死死”,.,CreateWindow(),WM_CREATE,GetMessage(),DispatchMessage(WM_CREATE),WndProc(WM_CREATE),用户程序初始化,启动,4.4.Windows程序的“生”,WinMain()初始化;CreateWindow();while(GetMessage(,WndProc(msg),switch(msg)caseWM_CREATE:用户程序初始化caseWM_DESTORY:PostQuitMessage()default:DefWindowProc(),.,使用者按下关闭按钮,WM_CLOSE,GetMessage(),DispatchMessage(WM_CLOSE),WndProc(WM_CLOSE),DefWindowProc(WM_CLOSE),关闭,WinMain()初始化;CreateWindow();while(GetMessage(,WndProc(msg),switch(msg)caseWM_CREATE:用户程序初始化caseWM_DESTORY:PostQuitMessage()default:DefWindowProc(),DestoryWindow(),WM_DESTORY,GetMessage(),DispatchMessage(WM_DESTORY),WndProc(WM_DESTORY),PostQuitMessage(),WM_QIUT,GetMessage()返回为0,while结束WinMain结束,整个程序结束,4.4.Windows程序的“死”,.,下面介绍建立基于API的应用程序框架的步骤。(1)在File下拉菜单中选择New选项,以建立项目文件。(2)在弹出的New对话框中,选择Projects选项卡,并选择其中的Win32Application项,在ProjectName编辑框中填人所要创建的项目文件名Myapi,然后单击OK按钮。(3)此时弹出如后图所示的界面,选择其中的Anemptyproject选项,说明是创建一个空的项目文件。,5.实验:利用API开发Win32程序实例,.,Win32ApplicationStep1of1对话框,5.利用API开发Win32程序实例,.,NewProjectInformation对话框,5.利用API开发Win32程序实例,.,空的Win32应用程序框架界面,5.利用API开发Win32程序实例,.,InsertFilesintoProject对话框,5.利用API开发Win32程序实例,.,Windows窗口程序的运行结果,5.利用API开发Win32程序实例,.,源程序代码如下:#include/窗口函数说明LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/初始化窗口类/WinMain函数说明intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow)HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName=“窗口”;/窗口类名charlpszTitle=My_Windows;/窗口标题名,5.利用API开发Win32程序实例,.,wndclass.style=0;/窗口类型为缺省类型wndclass.lpfnWndProc=WndProc;/窗口处理函数为WndProcwndclass.cbClsExtra=0;/窗口类无扩展wndclass.cbWndExtra=0;/窗口实例无扩展wndclass.hInstance=hInstance;/当前实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/窗口的最小化图标为缺省wndclass.hCursor=LoadCursor(N

温馨提示

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

评论

0/150

提交评论