




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
網(wǎng)絡軟件設計消息第一頁,共四十二頁,編輯于2023年,星期三2窗口窗口窗口的類型和要素窗口背后的計算第二頁,共四十二頁,編輯于2023年,星期三3窗口窗口與人交互的場所圖形化窗口與應用程序配置參數(shù)不斷交互結(jié)果顯示窗口與進程一一對應一個進程打開多個窗口一個窗口對應多個進程 (多個進程通過一個窗口與人交互)第三頁,共四十二頁,編輯于2023年,星期三4窗口類型與要素窗口類型Console文字類型Window菜單+用戶區(qū)域DialogMessageBox窗口要素框架菜單按鈕滾動條第四頁,共四十二頁,編輯于2023年,星期三5窗口背后的計算窗口程序各不相同本質(zhì)區(qū)別是任務不同,計算不同窗口的每個要件都有相應的程序支撐任務的計算程序在哪里?計算程序如何將窗口各部分統(tǒng)籌起來?窗口+計算的程序框架將是怎樣的?第五頁,共四十二頁,編輯于2023年,星期三6Win32程序開發(fā)流程.DLG.BMP.ICO.CUR.FON.RC.H.C.OBJ.LIBCruntimeDLLImport.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES開始之前第六頁,共四十二頁,編輯于2023年,星期三7庫函數(shù)庫函數(shù)的作用用戶不必關(guān)心窗口要件的代碼動態(tài)鏈接庫在執(zhí)行時,才進行鏈接增加程序的可移植性節(jié)約內(nèi)存Windows常用的庫函數(shù)CRuntimes--C庫函數(shù)LIBC.LIBMSVCRT.LIBWindowsAPIGDI32.DLLUSER32.DLLKERNEL32.DLL其它開始之前注意:在運行程序時會遇到一些庫缺失的錯誤,只需將這些庫找到放到windows系統(tǒng)目錄下第七頁,共四十二頁,編輯于2023年,星期三8頭文件windows.hstdafx.h其它開始之前注意:當編譯時出現(xiàn)找不到函數(shù)體錯誤時,需要包含正確的頭文件。如果不知道該包含哪一個時,1、可以在VC的include目錄下查找2、注意頭文件的包含順序第八頁,共四十二頁,編輯于2023年,星期三9Windows程序結(jié)構(gòu)以消息(事件)為基礎,以消息(事件)驅(qū)動 (messagebased,eventdriven)為什么窗口程序是事件驅(qū)動的窗口程序的主要任務是人機交互除非人主動結(jié)束任務。人不斷進行各種輸入,計算機不斷響應 程序以while循環(huán)為主體框架形成“輸入”-“響應”的程序結(jié)構(gòu)窗口程序是怎樣進行消息驅(qū)動的各種類型的“輸入”,以消息格式存在GetMessage()取走一個消息需要響應消息和事件 對事件的響應,即事件驅(qū)動DispatchMessage()處理消息第九頁,共四十二頁,編輯于2023年,星期三10Windows程序結(jié)構(gòu)程序基本結(jié)構(gòu)(算法)main(){while(GetMessage(&msg)){ProcessMessage(&msg);}}主函數(shù)消息處理函數(shù)ProcessMessage(msg){switch(msg){caseMSG1:caseMSG2:}}事件第十頁,共四十二頁,編輯于2023年,星期三對比Windows消息驅(qū)動框架與select框架兩個框架都具備相同的事件驅(qū)動的基本架構(gòu)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();}}系統(tǒng)消息隊列WndProc(msg){switch(msg){caseMSG1:caseMSG2:}}應用程序消息隊列mousedriverkeyboarddriverSendMessage()USERModulemessagefromOtherwindowPostMessage()system第十二頁,共四十二頁,編輯于2023年,星期三13程序入口點WinMainWinMainWinMain(){
初始化;
創(chuàng)建和顯示窗口;建立基于消息的事件驅(qū)動機制}WinMain(){
RegisterClass();
CreateWindow();ShowWindow();UpdateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}第十三頁,共四十二頁,編輯于2023年,星期三14Windows程序的主要構(gòu)成WinMain()--程序入口點注冊窗口RegisterClass()生成并顯示窗口CreateWindow()ShowWindow()進入消息處理循環(huán)——簡稱消息循環(huán)WndProc()--窗口函數(shù)(功能實現(xiàn))區(qū)分消息switch根據(jù)消息觸發(fā)相應處理調(diào)用DefWindowProc() 不處理的消息、和需要系統(tǒng)進一步處理的消息 如WM_CLOSE,使用者關(guān)閉了窗口。應用程序獲得這個消息后,釋放了自己的資源,然后讓系統(tǒng)進一步執(zhí)行關(guān)閉窗口的動作思考:怎樣根據(jù)功能要求生成消息,并把這個消息傳遞給窗口函數(shù)?第十四頁,共四十二頁,編輯于2023年,星期三15注冊窗口類RegisterClass(…)
在注冊之前可以設置窗口屬性,系統(tǒng)會給出一些缺省值,我們重點關(guān)心其中的lpfnWndProc參數(shù)WNDCLASSwc;wc.stvle=…;wc.lpfnWndProc=(WNDPROC)WndProc;提示系統(tǒng)收到消息后,調(diào)該函數(shù)處理消息wc.hIcon=…wc.Cursor=…wc.hbrBackground=…第十五頁,共四十二頁,編輯于2023年,星期三16窗口程序的可能結(jié)構(gòu)Windows系統(tǒng)消息的處理產(chǎn)生消息顯示在窗口中顯示第十六頁,共四十二頁,編輯于2023年,星期三17窗口產(chǎn)生CreateWindow()ShowWindow()UpdateWindow()第十七頁,共四十二頁,編輯于2023年,星期三18消息循環(huán)while(GetMessage(&msg…)){TranslateMessage(&msg);//消息轉(zhuǎn)換DispatchMessage(&msg);}GetMessage具有阻塞機制當消息隊列中沒有消息時,程序非忙等,而是讓權(quán)等待DispatchMessage不是直接調(diào)用消息處理函數(shù)(WndProc)通過USER模塊協(xié)助,才將消息傳遞到WndProcWndProc的調(diào)用指示在注冊窗口類時,已向系統(tǒng)指明 為什么不直接調(diào)用?方便系統(tǒng)抓取消息第十八頁,共四十二頁,編輯于2023年,星期三19窗口函數(shù)WndProc(…)WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)HWNDhWnd:窗口句柄,在與窗口有關(guān)的控制中使用UINTmessage:消息(類型)WPARAMwParam:傳遞的參數(shù)LPARAMlParam:傳遞的參數(shù)在基于消息的機制中,僅有消息是不夠的產(chǎn)生消息的同時,傳遞什么樣的參數(shù)要視具體的消息而定第十九頁,共四十二頁,編輯于2023年,星期三20窗口函數(shù)消息本身是一個unsignedint變量類型有WM_COMMAND:系統(tǒng)命令類,菜單選擇,按鈕等WM_PAINT:對窗口作圖WM_DESTORY:關(guān)閉窗口WM_USER:用戶可自定義一些消息在某個特定類型之下,更有許多事件,一般通過wParam或lParam通知第二十頁,共四十二頁,編輯于2023年,星期三21窗口函數(shù)基本框架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程序的生與死程序初始化過程中調(diào)用CreateWindow,為程序創(chuàng)建了一個窗口,CreateWindow送出WM_CREATE直接給窗口函數(shù),后者可以在此時做些初始化操作在程序運行過程中,不斷以GetMessage從消息隊列中取得消息。如果這個消息是WM_QUIT,GetMessage會得到0的返回值而結(jié)束循環(huán),進而結(jié)束整個程序DispatchMessage通過系統(tǒng)USER模塊的協(xié)助與監(jiān)督,把消息分派至窗口函數(shù),消息將被處理程序不斷循環(huán)當使用者按下系統(tǒng)菜單中的Close命令時,系統(tǒng)送出WM_CLOSE,通常窗口程序不處理它,由DefWindowProc處理DefWindowProc處理WM_CLOSE,調(diào)用DestoryWindow把窗口清除,送出WM_DESTORY窗口程序?qū)M_DESTORY的處理是調(diào)用PostQuitMessagePostQuitMessage送出WM_QUIT,于是WinMain的循環(huán)結(jié)束了,整個應用程序也結(jié)束了第二十二頁,共四十二頁,編輯于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程序的生與死使用者按下關(guān)閉按鈕WM_CLOSEGetMessage()DispatchMessage(WM_CLOSE)WndProc(WM_CLOSE)DefWindowProc(WM_CLOSE)關(guān)閉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結(jié)束WinMain結(jié)束,整個程序結(jié)束第二十四頁,共四十二頁,編輯于2023年,星期三25一個簡單的Windows程序三種方式生成窗口程序建立空白工程,empty完全是空文件建立簡單工程,simple僅有WinMain建立典型應用工程,HelloWorld具備完整的結(jié)構(gòu)生成一個典型應用觀察具備哪些要件單步調(diào)試感受WinMain的流程在WndProc中設置斷點,感受消息抓取過程winuser.h中定義了系統(tǒng)消息第二十五頁,共四十二頁,編輯于2023年,星期三26結(jié)合socket與windows需要考慮的一些重要問題窗口功能設計使用者點擊哪些按鈕,會獲得什么樣的功能如何在菜單中觸發(fā)消息在菜單中的選項都將產(chǎn)生WM_COMMAND,不同的是在wParam中id號不同(即事件不同)添加消息處理函數(shù)在窗口處理函數(shù)(WndProc)中針對前一步產(chǎn)生的消息和事件進行處理在窗口中顯示數(shù)據(jù)用MessageBox方式在窗口中打印第二十六頁,共四十二頁,編輯于2023年,星期三27結(jié)合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);初始化通信結(jié)束什么時候觸發(fā)各環(huán)節(jié)default:DefWindowProc()}caseWM_START:StartServer()第二十七頁,共四十二頁,編輯于2023年,星期三28結(jié)合socket與windows1、生成一個典型應用工程2、添加頭文件和庫--winsock.hwsock32.lib3、添加初始化和結(jié)束部分4、設計:用戶在菜單中選擇了start項,服務器就啟動起來5、在資源編輯器中選擇Menu6、在菜單中增加一個選項7、更改該菜單選項屬性,ID號為IDM_START,和標題(caption)為Start8、在WndProc中添加IDM_START,及處理函數(shù)StartServer()9、在窗口關(guān)閉時,即對WM_DESTORY的處理中,加入關(guān)閉連接的過程第二十八頁,共四十二頁,編輯于2023年,星期三29結(jié)合socket與windows觀察程序執(zhí)行結(jié)果問題1:當啟動服務器服務后,窗口停止了響應原因:程序在執(zhí)行recv后阻塞,也阻塞了抓取程序的過程。解決方法?問題2:如果在通信部分使用非阻塞的select機制,服務器窗口仍然停止響應原因:程序陷于select的循環(huán)中,無法回到GetMessage取得窗口消息解決辦法?第二十九頁,共四十二頁,編輯于2023年,星期三30學好Windows編程勿在浮沙筑高臺 但愿管中窺全豹學好Windows編程應掌握的相關(guān)知識C++操作系統(tǒng)原理,Windows系統(tǒng)原理大量的系統(tǒng)庫函數(shù)及功能通過本課程能得到什么雖然不要求大家掌握C++,課程也不介紹C++,但通過實際編寫程序的過程,感受C++的一些特性??梢粤私釽indows程序的一般結(jié)構(gòu),體會消息驅(qū)動的原理,減輕編寫Windows程序的畏懼感。接觸并使用一些常用的調(diào)用第三十頁,共四十二頁,編輯于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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024六年級英語上冊教學設計
- 2025年中國旅游代理與合作伙伴間的合作合同
- 邵陽高三地理試卷及答案
- 三中高一試卷及答案
- 2025停車場租賃合同模板
- 經(jīng)濟型酒店品牌危機應對策略考核試卷
- 稻谷加工與糧食質(zhì)量標準制定考核試卷
- 照明工程的電氣設備選型與應用考核試卷
- 電子傳感器與檢測技術(shù)考核試卷
- 2025住宅設計與裝修合同示范文本
- 2025年全國會展策劃師崗位職業(yè)技能資格知識考試題庫與答案
- 貴州省考試院2025年4月高三年級適應性考試歷史試題及答案
- 兒童暴發(fā)性心肌炎診治專家建議(2025)解讀課件
- GB/T 320-2025工業(yè)用合成鹽酸
- 企業(yè)危險源辨識與風險評估降低風險措施清單
- 天鵝藝術(shù)漆施工方案
- 腦卒中患者口腔健康素養(yǎng)的研究進展
- 廣東省廣州市白云區(qū)2024-2025學年高三下學期2月統(tǒng)測英語試卷(含答案)
- 2025至2030年中國煤氣渣數(shù)據(jù)監(jiān)測研究報告
- 小學STEM教育中的創(chuàng)新實驗室建設
- 月嫂資格證考試單選題100道及答案
評論
0/150
提交評論