版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络软件设计消息第一页,共四十二页,编辑于2023年,星期三2窗口窗口窗口的类型和要素窗口背后的计算第二页,共四十二页,编辑于2023年,星期三3窗口窗口与人交互的场所图形化窗口与应用程序配置参数不断交互结果显示窗口与进程一一对应一个进程打开多个窗口一个窗口对应多个进程 (多个进程通过一个窗口与人交互)第三页,共四十二页,编辑于2023年,星期三4窗口类型与要素窗口类型Console文字类型Window菜单+用户区域DialogMessageBox窗口要素框架菜单按钮滚动条第四页,共四十二页,编辑于2023年,星期三5窗口背后的计算窗口程序各不相同本质区别是任务不同,计算不同窗口的每个要件都有相应的程序支撑任务的计算程序在哪里?计算程序如何将窗口各部分统筹起来?窗口+计算的程序框架将是怎样的?第五页,共四十二页,编辑于2023年,星期三6Win32程序开发流程.DLG.BMP.ICO.CUR.FON.RC.H.C.OBJ.LIBCruntimeDLLImport.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES开始之前第六页,共四十二页,编辑于2023年,星期三7库函数库函数的作用用户不必关心窗口要件的代码动态链接库在执行时,才进行链接增加程序的可移植性节约内存Windows常用的库函数CRuntimes--C库函数LIBC.LIBMSVCRT.LIBWindowsAPIGDI32.DLLUSER32.DLLKERNEL32.DLL其它开始之前注意:在运行程序时会遇到一些库缺失的错误,只需将这些库找到放到windows系统目录下第七页,共四十二页,编辑于2023年,星期三8头文件windows.hstdafx.h其它开始之前注意:当编译时出现找不到函数体错误时,需要包含正确的头文件。如果不知道该包含哪一个时,1、可以在VC的include目录下查找2、注意头文件的包含顺序第八页,共四十二页,编辑于2023年,星期三9Windows程序结构以消息(事件)为基础,以消息(事件)驱动 (messagebased,eventdriven)为什么窗口程序是事件驱动的窗口程序的主要任务是人机交互除非人主动结束任务。人不断进行各种输入,计算机不断响应 程序以while循环为主体框架形成“输入”-“响应”的程序结构窗口程序是怎样进行消息驱动的各种类型的“输入”,以消息格式存在GetMessage()取走一个消息需要响应消息和事件 对事件的响应,即事件驱动DispatchMessage()处理消息第九页,共四十二页,编辑于2023年,星期三10Windows程序结构程序基本结构(算法)main(){while(GetMessage(&msg)){ProcessMessage(&msg);}}主函数消息处理函数ProcessMessage(msg){switch(msg){caseMSG1:caseMSG2:}}事件第十页,共四十二页,编辑于2023年,星期三对比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);第十一页,共四十二页,编辑于2023年,星期三12一个具体的窗口程序WinMain(){
初始化;
while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}系统消息队列WndProc(msg){switch(msg){caseMSG1:caseMSG2:}}应用程序消息队列mousedriverkeyboarddriverSendMessage()USERModulemessagefromOtherwindowPostMessage()system第十二页,共四十二页,编辑于2023年,星期三13程序入口点WinMainWinMainWinMain(){
初始化;
创建和显示窗口;建立基于消息的事件驱动机制}WinMain(){
RegisterClass();
CreateWindow();ShowWindow();UpdateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}第十三页,共四十二页,编辑于2023年,星期三14Windows程序的主要构成WinMain()--程序入口点注册窗口RegisterClass()生成并显示窗口CreateWindow()ShowWindow()进入消息处理循环——简称消息循环WndProc()--窗口函数(功能实现)区分消息switch根据消息触发相应处理调用DefWindowProc() 不处理的消息、和需要系统进一步处理的消息 如WM_CLOSE,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作思考:怎样根据功能要求生成消息,并把这个消息传递给窗口函数?第十四页,共四十二页,编辑于2023年,星期三15注册窗口类RegisterClass(…)
在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnWndProc参数WNDCLASSwc;wc.stvle=…;wc.lpfnWndProc=(WNDPROC)WndProc;提示系统收到消息后,调该函数处理消息wc.hIcon=…wc.Cursor=…wc.hbrBackground=…第十五页,共四十二页,编辑于2023年,星期三16窗口程序的可能结构Windows系统消息的处理产生消息显示在窗口中显示第十六页,共四十二页,编辑于2023年,星期三17窗口产生CreateWindow()ShowWindow()UpdateWindow()第十七页,共四十二页,编辑于2023年,星期三18消息循环while(GetMessage(&msg…)){TranslateMessage(&msg);//消息转换DispatchMessage(&msg);}GetMessage具有阻塞机制当消息队列中没有消息时,程序非忙等,而是让权等待DispatchMessage不是直接调用消息处理函数(WndProc)通过USER模块协助,才将消息传递到WndProcWndProc的调用指示在注册窗口类时,已向系统指明 为什么不直接调用?方便系统抓取消息第十八页,共四十二页,编辑于2023年,星期三19窗口函数WndProc(…)WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)HWNDhWnd:窗口句柄,在与窗口有关的控制中使用UINTmessage:消息(类型)WPARAMwParam:传递的参数LPARAMlParam:传递的参数在基于消息的机制中,仅有消息是不够的产生消息的同时,传递什么样的参数要视具体的消息而定第十九页,共四十二页,编辑于2023年,星期三20窗口函数消息本身是一个unsignedint变量类型有WM_COMMAND:系统命令类,菜单选择,按钮等WM_PAINT:对窗口作图WM_DESTORY:关闭窗口WM_USER:用户可自定义一些消息在某个特定类型之下,更有许多事件,一般通过wParam或lParam通知第二十页,共四十二页,编辑于2023年,星期三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);第二十一页,共四十二页,编辑于2023年,星期三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的循环结束了,整个应用程序也结束了第二十二页,共四十二页,编辑于2023年,星期三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)用户程序初始化启动第二十三页,共四十二页,编辑于2023年,星期三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结束,整个程序结束第二十四页,共四十二页,编辑于2023年,星期三25一个简单的Windows程序三种方式生成窗口程序建立空白工程,empty完全是空文件建立简单工程,simple仅有WinMain建立典型应用工程,HelloWorld具备完整的结构生成一个典型应用观察具备哪些要件单步调试感受WinMain的流程在WndProc中设置断点,感受消息抓取过程winuser.h中定义了系统消息第二十五页,共四十二页,编辑于2023年,星期三26结合socket与windows需要考虑的一些重要问题窗口功能设计使用者点击哪些按钮,会获得什么样的功能如何在菜单中触发消息在菜单中的选项都将产生WM_COMMAND,不同的是在wParam中id号不同(即事件不同)添加消息处理函数在窗口处理函数(WndProc)中针对前一步产生的消息和事件进行处理在窗口中显示数据用MessageBox方式在窗口中打印第二十六页,共四十二页,编辑于2023年,星期三27结合socket流程与windows流程服务器WinMain(){
初始化;
CreateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}WndProc(msg){switch(msg){caseWM_CREATE:
用户程序初始化caseWM_DESTORY: PostQuitMessage()}s=socket();bind(s);listen(s,5);while(1){ns=accept(s);recv(ns);send(ns);closesocket(ns);}closesocket(s);初始化通信结束什么时候触发各环节default:DefWindowProc()}caseWM_START:StartServer()第二十七页,共四十二页,编辑于2023年,星期三28结合socket与windows1、生成一个典型应用工程2、添加头文件和库--winsock.hwsock32.lib3、添加初始化和结束部分4、设计:用户在菜单中选择了start项,服务器就启动起来5、在资源编辑器中选择Menu6、在菜单中增加一个选项7、更改该菜单选项属性,ID号为IDM_START,和标题(caption)为Start8、在WndProc中添加IDM_START,及处理函数StartServer()9、在窗口关闭时,即对WM_DESTORY的处理中,加入关闭连接的过程第二十八页,共四十二页,编辑于2023年,星期三29结合socket与windows观察程序执行结果问题1:当启动服务器服务后,窗口停止了响应原因:程序在执行recv后阻塞,也阻塞了抓取程序的过程。解决方法?问题2:如果在通信部分使用非阻塞的select机制,服务器窗口仍然停止响应原因:程序陷于select的循环中,无法回到GetMessage取得窗口消息解决办法?第二十九页,共四十二页,编辑于2023年,星期三30学好Windows编程勿在浮沙筑高台 但愿管中窥全豹学好Windows编程应掌握的相关知识C++操作系统原理,Windows系统原理大量的系统库函数及功能通过本课程能得到什么虽然不要求大家掌握C++,课程也不介绍C++,但通过实际编写程序的过程,感受C++的一些特性。可以了解Windows程序的一般结构,体会消息驱动的原理,减轻编写Windows程序的畏惧感。接触并使用一些常用的调用第三十页,共四十二页,编辑于2023年,星期三31Console第三十一页,共四十二页,编辑于2023年,星期三32Window第三十二页,共四十二页,编辑于2023年,星期三33Dialog第三十三页,共四十二页,编辑于2023年,星期三34MessageBox第三十四页,共四十二页,编辑于2023年,星期三35TextEditor开始之前第三十五页,共四十二页,编辑于2023年,星期三36DialogEditor第三十六页,共四十二页,编辑于2023年,星期三37ImageEditor第三十七页,共四十二页,编辑于2023年,星期三38MessageBoxMessageBox()弹出的信息窗口intWINAPIMessageBox(HWNDhWnd,LPCSTRlpText,LPCSTRlpCaption,UINTuTy
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机房维护合同范本
- 二零二五年度安徽电信合同履行全程监控合同2篇
- 2025至2030年中国硅钙锰合金产品数据监测研究报告
- 2025至2030年中国环保塑胶色母料数据监测研究报告
- 2025至2030年中国汽车装饰霓虹灯数据监测研究报告
- 2025年度餐饮企业厨师与服务员派遣服务合同3篇
- 2024版装修工程合作合同
- 二零二五年度货车承包司机运营服务合同3篇
- 外保温合同范本
- 2025年度二零二五餐饮业消防安全管理合同范本3篇
- JJG 633-2024气体容积式流量计
- 电机制造行业的竞争对手分析
- 广西失败企业案例分析报告
- 湖南建设工程施工阶段监理服务费计费规则
- 【基层版】中国房颤中心认证标准
- 磨工技能试卷及答案
- 稀土铝合金电缆项目可行性研究报告
- 会展行业的薪资分析
- GB/T 16886.23-2023医疗器械生物学评价第23部分:刺激试验
- 司法鉴定业务管理制度
- 升压站设备基础施工方案
评论
0/150
提交评论