您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 网络软件设计7——windows消息
网络软件设计异步响应机制引入——窗口程序设计中的事件驱动Win32程序基本概念制作主讲段景山段景山2窗口窗口窗口的类型和要素窗口背后的计算段景山3窗口窗口与人交互的场所图形化窗口与应用程序配置参数不断交互结果显示窗口与进程一一对应一个进程打开多个窗口一个窗口对应多个进程(多个进程通过一个窗口与人交互)段景山4窗口类型与要素窗口类型Console文字类型Window菜单+用户区域DialogMessageBox窗口要素框架菜单按钮滚动条段景山5窗口背后的计算窗口程序各不相同本质区别是任务不同,计算不同窗口的每个要件都有相应的程序支撑任务的计算程序在哪里?计算程序如何将窗口各部分统筹起来?窗口+计算的程序框架将是怎样的?段景山6Win32程序开发流程.DLG.BMP.ICO.CUR.FON.RC.H.C.OBJ.LIBCruntimeDLLImport.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES开始之前段景山7库函数库函数的作用用户不必关心窗口要件的代码动态链接库在执行时,才进行链接增加程序的可移植性??节约内存??Windows常用的库函数CRuntimes--C库函数LIBC.LIBMSVCRT.LIBWindowsAPIGDI32.DLLUSER32.DLLKERNEL32.DLL其它开始之前注意:在运行程序时会遇到一些库缺失的错误,只需将这些库找到放到windows系统目录下段景山8头文件windows.hstdafx.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程序入口点WinMainWinMainWinMain(){初始化;创建和显示窗口;建立基于消息的事件驱动机制}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模块协助,才将消息传递到WndProcWndProc的调用指示在注册窗口类时,已向系统指明为什么不直接调用?方便系统抓取消息段景山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的处理是调用PostQuitMessagePostQuitMessage送出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
本文标题:网络软件设计7——windows消息
链接地址:https://www.777doc.com/doc-4800730 .html