网络软件设计7——windows消息

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

网络软件设计异步响应机制引入——窗口程序设计中的事件驱动Win32程序基本概念制作主讲段景山段景山2窗口窗口窗口的类型和要素窗口背后的计算段景山3窗口窗口与人交互的场所图形化窗口与应用程序配置参数不断交互结果显示窗口与进程一一对应一个进程打开多个窗口一个窗口对应多个进程(多个进程通过一个窗口与人交互)段景山4窗口类型与要素窗口类型Console文字类型Window菜单+用户区域DialogMessageBox窗口要素框架菜单按钮滚动条段景山5窗口背后的计算窗口程序各不相同本质区别是任务不同,计算不同窗口的每个要件都有相应的程序支撑任务的计算程序在哪里?计算程序如何将窗口各部分统筹起来?窗口+计算的程序框架将是怎样的?段景山6Win32程序开发流程.DLG.BMP.ICO.CUR.FON.RC.H.C.OBJ.LIBCruntimeDLLImport.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES开始之前段景山7库函数库函数的作用用户不必关心窗口要件的代码动态链接库在执行时,才进行链接增加程序的可移植性??节约内存??Windows常用的库函数CRuntimes--C库函数LIBC.LIBMSVCRT.LIBWindowsAPIGDI32.DLLUSER32.DLLKERNEL32.DLL其它开始之前注意:在运行程序时会遇到一些库缺失的错误,只需将这些库找到放到windows系统目录下段景山8头文件windows.hstdafx.h其它开始之前注意:当编译时出现找不到函数体错误时,需要包含正确的头文件。如果不知道该包含哪一个时,1、可以在VC的include目录下查找2、注意头文件的包含顺序??段景山9Windows程序结构以消息(事件)为基础,以消息(事件)驱动(messagebased,eventdriven)为什么窗口程序是事件驱动的窗口程序的主要任务是人机交互除非人主动结束任务。人不断进行各种输入,计算机不断响应程序以while循环为主体框架形成“输入”-“响应”的程序结构窗口程序是怎样进行消息驱动的各种类型的“输入”,以消息格式存在GetMessage()取走一个消息需要响应消息和事件对事件的响应,即事件驱动DispatchMessage()处理消息段景山10Windows程序结构程序基本结构(算法)main(){while(GetMessage(&msg)){ProcessMessage(&msg);}}主函数消息处理函数ProcessMessage(msg){switch(msg){caseMSG1:caseMSG2:}}事件段景山对比Windows消息驱动框架与select框架两个框架都具备相同的事件驱动的基本架构11main(){while(GetMessage(&msg)){ProcessMessage(&msg);}}ProcessMessage(msg){switch(msg){caseMSG1:caseMSG2:}}send(…);processbuf1;preparebuf2;}while(recv(…)0){}FD_SET(s,&readfds);while(select(0,……)=0){if(FD_ISSET(s,&readfds)){}FD_SET(ss,&readfds);FD_SET(s,&readfds);FD_SET(ss,&readfds);段景山12一个具体的窗口程序WinMain(){初始化;while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}系统消息队列WndProc(msg){switch(msg){caseMSG1:caseMSG2:}}应用程序消息队列mousedriverkeyboarddriverSendMessage()USERModulemessagefromOtherwindowPostMessage()system段景山13程序入口点WinMainWinMainWinMain(){初始化;创建和显示窗口;建立基于消息的事件驱动机制}WinMain(){RegisterClass();CreateWindow();ShowWindow();UpdateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}段景山14Windows程序的主要构成WinMain()--程序入口点注册窗口RegisterClass()生成并显示窗口CreateWindow()ShowWindow()进入消息处理循环——简称消息循环WndProc()--窗口函数(功能实现)区分消息switch根据消息触发相应处理调用DefWindowProc()不处理的消息、和需要系统进一步处理的消息如WM_CLOSE,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作思考:怎样根据功能要求生成消息,并把这个消息传递给窗口函数?段景山15注册窗口类RegisterClass(…)在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnWndProc参数WNDCLASSwc;wc.stvle=…;wc.lpfnWndProc=(WNDPROC)WndProc;提示系统收到消息后,调该函数处理消息wc.hIcon=…wc.Cursor=…wc.hbrBackground=…段景山16窗口程序的可能结构Windows系统消息的处理产生消息显示在窗口中显示段景山17窗口产生CreateWindow()ShowWindow()UpdateWindow()段景山18消息循环while(GetMessage(&msg…)){TranslateMessage(&msg);//消息转换DispatchMessage(&msg);}GetMessage具有阻塞机制当消息队列中没有消息时,程序非忙等,而是让权等待DispatchMessage不是直接调用消息处理函数(WndProc)通过USER模块协助,才将消息传递到WndProcWndProc的调用指示在注册窗口类时,已向系统指明为什么不直接调用?方便系统抓取消息段景山19窗口函数WndProc(…)WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)HWNDhWnd:窗口句柄,在与窗口有关的控制中使用UINTmessage:消息(类型)WPARAMwParam:传递的参数LPARAMlParam:传递的参数在基于消息的机制中,仅有消息是不够的产生消息的同时,传递什么样的参数要视具体的消息而定段景山20窗口函数消息本身是一个unsignedint变量类型有WM_COMMAND:系统命令类,菜单选择,按钮等WM_PAINT:对窗口作图WM_DESTORY:关闭窗口WM_USER:用户可自定义一些消息在某个特定类型之下,更有许多事件,一般通过wParam或lParam通知段景山21窗口函数基本框架WndProc(hWnd,message,wParam,lParam){}switch(message){caseWM_COMMAND:id=LOWORD(wParam);switch(id){caseIDM_OPEN:break;菜单中的open选项}……caseWM_PAINT:在视窗作图;break;default:DefWindowProc(hWnd,message,wParam,lParam);段景山22Windows程序的生与死程序初始化过程中调用CreateWindow,为程序创建了一个窗口,CreateWindow送出WM_CREATE直接给窗口函数,后者可以在此时做些初始化操作在程序运行过程中,不断以GetMessage从消息队列中取得消息。如果这个消息是WM_QUIT,GetMessage会得到0的返回值而结束循环,进而结束整个程序DispatchMessage通过系统USER模块的协助与监督,把消息分派至窗口函数,消息将被处理程序不断循环当使用者按下系统菜单中的Close命令时,系统送出WM_CLOSE,通常窗口程序不处理它,由DefWindowProc处理DefWindowProc处理WM_CLOSE,调用DestoryWindow把窗口清除,送出WM_DESTORY窗口程序对WM_DESTORY的处理是调用PostQuitMessagePostQuitMessage送出WM_QUIT,于是WinMain的循环结束了,整个应用程序也结束了段景山23Windows程序的生与死WinMain(){初始化;CreateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WndProc(msg){switch(msg){caseWM_CREATE:用户程序初始化caseWM_DESTORY:PostQuitMessage()default:DefWindowProc()}}CreateWindow()WM_CREATEGetMessage()DispatchMessage(WM_CREATE)WndProc(WM_CREATE)用户程序初始化启动段景山24Windows程序的生与死使用者按下关闭按钮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结束,整个程序结束段景山25一个简单的Windows程序三种方式生成窗口程序建立空白工程,empty完全是空文件建立简单工程,simple仅有WinMain建立典型应用工程,HelloWorld具备完整的结构生成一个典型应用观察具备哪些要件单步调试感受WinMain的流程在WndProc中设置断点,感受消息抓取过程winuser.h中定义了系统消息段景山26结合socket与windows需要考虑的一些重要问题窗口功能设计使用者点击哪些按钮,会获得什么样的功能如何在菜单中触发消息在菜单中的选项都将产生WM_COMMAND,不同的是在wParam中id号不同(即事件不同)添加消息处理函数在窗口处理函数(WndProc)中针对前一步产生的消息和事件进行处理在窗口中显示数据用MessageBox方式在窗口中打印段景山27结合socket流程与windows流程服务器WinMain(){初始化;CreateWindow();while(GetMessage(&msg)){TranslateMessage();Dispat

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功