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

下载本文档

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

文档简介

信息系统技术根底-2授课老师:王志宏;王长军实验老师:王长军.ContactInformationName:王长军Office:721Tel:62378372(O)M)Email:cjwang@PersonalInformation2007-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-DOSIBM-PC有限的I/O函数1981OS硬件MS1.0~3.016bitHWAPI函数1983图形环境NT~XP16/32bitHWAPI函数1993图形环境Vista32/64bitHWAPI函数20063D图形环境过程驱动消息驱动.1.3Windows相关

NT~XP32bitHWAPI函数1993图形环境Vista32/64bitHWAPI函数20063D图形环境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.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES.3.事件与消息系统3.1.事件和事件驱动3.2.消息系统3.3.一个具体的窗口程序.3.1事件和事件驱动Windows程序为消息而“生〞,因消息而“死〞那么,消息从何而来?Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。那么,事件又从何而来?通过输入设备,如键盘和鼠标通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件来自Windows内部.基于事件驱动的程序模型3.1事件和事件驱动.Windows消息系统的组成消息队列消息循环窗口过程3.2消息系统.消息的数据结构消息的数据结构MSG的定义如下: typedefstructtagMSG{HWNDhwnd;//用以检索消息的窗口句柄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(&Msg,

NULL,

0,

0)

>

0){

TranslateMessage(&Msg);

DispatchMessage(&Msg);}

.3.2消息系统Windows消息处理示意图Windows系统应用程序队列A应用程序队列B系统队列事件输入WinMain函数消息循环窗口函数1窗口函数2WinMain函数消息循环窗口函数1窗口函数2应用程序A应用程序B消息循环.WinMain〔〕{初始化;while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}系统消息队列WndProc(msg){switch(msg){caseMSG1:caseMSG2:}}应用程序消息队列mousedriverkeyboarddriverSendMessage()USERModulemessagefromOtherwindowPostMessage()system3.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(&msg)){TranslateMessage();DispatchMessage();}}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(&wc);4.2.详解-窗口.CreateWindow()ShowWindow()UpdateWindow()4.2.详解-窗口HWNDCreateWindow(LPCTSTR lpClassName,//已注册的窗口类名LPCTSTR lpWindowName,//窗口标题DWORD dwStyle, //窗口风格int x, //窗口的水平位置int y, //窗口的垂直位置int nWidth, //窗口宽度int nHeight, //窗口高度HWND hWndParent,//父窗口句柄HMENU hMenu, //菜单句柄或控件标识HINSTANCEhInstance,//应用程序实例句柄LPVOID lpParam) //其他窗口创立时的参数数据.消息本身是一个无符号整型变量类型有WM_COMMAND:系统命令类,菜单项选择择,按钮等WM_PAINT:对窗口作图WM_DESTORY:关闭窗口WM_USER:用户可自定义一些消息在某个特定类型之下,更有许多事件,一般通过wParam通知4.2.详解-消息.while(GetMessage(&msg…)){TranslateMessage(&msg);//消息转换DispatchMessage(&msg);}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.详解-消息处理思考:怎样根据功能要求生成消息,并把这个消息传递给窗口函数?窗口程序的可能结构Windows系统显示产生消息在窗口中显示.4.3.Windows数据类型Windows数据类型对应的基本数据类型(C语言)说明BOOLbool布尔值BSTRunsignedshort*32位字符指针BYTEunsignedchar8位无符号整数COLORREFunsignedlong用作颜色值的32位值DWORDunsignedlong32位无符号整数,段地址和相关的偏移地址LONGlong32位带符号整数LPARAMlong作为参数传递给窗口过程或回调函数的32位值LPCSTRconstchar*指向字符串常量的32位指针LPSTRchar*指向字符串的32位指针LPVOIDvoid*指向未定义类型的32位指针LRESULTlong来自窗口过程或回调函数的32位返回值UINTunsignedint32位无符号整数WORDunsignedshort16位无符号整数WPARAMunsignedint当作参数传递给窗口过程或回调函数的32位值.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_CREATEGetMessage()DispatchMessage(WM_CREATE)WndProc(WM_CREATE)用户程序初始化启动4.4.Windows程序的“生〞WinMain(){初始化;CreateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WndProc(msg){switch(msg){caseWM_CREATE: 用户程序初始化caseWM_DESTORY: PostQuitMessage()default:

DefWindowProc()}}.使用者按下关闭按钮WM_CLOSEGetMessage()DispatchMessage(WM_CLOSE)WndProc(WM_CLOSE)DefWindowProc(WM_CLOSE)关闭WinMain(){初始化;CreateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WndProc(msg){switch(msg){caseWM_CREATE: 用户程序初始化caseWM_DESTORY: PostQuitMessage()default:

DefWindowProc()}}DestoryWindow()WM_DESTORYGetMessage()DispatchMessage(WM_DESTORY)WndProc(WM_DESTORY)PostQuitMessage()WM_QIUTGetMessage()返回为0,while结束WinMain结束,整个程序结束4.4.Windows程序的“死〞.下面介绍建立基于API的应用程序框架的步骤。(1)在File下拉菜单中选择New选项,以建立工程文件。(2)在弹出的New对话框中,选择Projects选项卡,并选择其中的Win32Application项,在ProjectName编辑框中填人所要创立的工程文件名Myapi,然后单击OK按钮。(3)此时弹出如后图所示的界面,选择其中的Anemptyproject选项,说明是创立一个空的工程文件。5.实验:利用API开发Win32程序实例.Win32Application–Step1of1对话框5.利用API开发Win32程序实例.NewProjectInformation对话框5.利用API开发Win32程序实例.空的Win32应用程序框架界面

5.利用API开发Win32程序实例.InsertFilesintoProject对话框

5.利用API开发Win32程序实例.Windows窗口程序的运行结果

5.利用API开发Win32程序实例.源程序代码如下: #include<windows.h> //窗口函数说明 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(NULL,IDC_ARROW);//窗口采用箭头光标wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色 wndclass.lpszMenuName=NULL; //窗口中无菜单 wndclass.lpszClassName=lpszClassName;//窗口类名为“窗口例如〞//窗口类注册 if(!RegisterClass(&wndclass)) //如果注册失败,那么发出警告声音 { MessageBeep(0); returnFALSE; }5.利用API开发Win32程序实例. //创立窗口 hwnd=CreateWindow(lpszClassName,//窗口类名 lpszTitle, //窗口实例的标题名 WS_OV

温馨提示

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

评论

0/150

提交评论