網(wǎng)絡(luò)軟件設(shè)計消息_第1頁
網(wǎng)絡(luò)軟件設(shè)計消息_第2頁
網(wǎng)絡(luò)軟件設(shè)計消息_第3頁
網(wǎng)絡(luò)軟件設(shè)計消息_第4頁
網(wǎng)絡(luò)軟件設(shè)計消息_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

網(wǎng)絡(luò)軟件設(shè)計消息第一頁,共四十二頁,2022年,8月28日2窗口窗口窗口的類型和要素窗口背后的計算第二頁,共四十二頁,2022年,8月28日3窗口窗口與人交互的場所圖形化窗口與應(yīng)用程序配置參數(shù)不斷交互結(jié)果顯示窗口與進(jìn)程一一對應(yīng)一個進(jìn)程打開多個窗口一個窗口對應(yīng)多個進(jìn)程 (多個進(jìn)程通過一個窗口與人交互)第三頁,共四十二頁,2022年,8月28日4窗口類型與要素窗口類型Console文字類型Window菜單+用戶區(qū)域DialogMessageBox窗口要素框架菜單按鈕滾動條第四頁,共四十二頁,2022年,8月28日5窗口背后的計算窗口程序各不相同本質(zhì)區(qū)別是任務(wù)不同,計算不同窗口的每個要件都有相應(yīng)的程序支撐任務(wù)的計算程序在哪里?計算程序如何將窗口各部分統(tǒng)籌起來?窗口+計算的程序框架將是怎樣的?第五頁,共四十二頁,2022年,8月28日6Win32程序開發(fā)流程.DLG.BMP.ICO.CUR.FON.RC.H.C.OBJ.LIBCruntimeDLLImport.DEFRCcompilerTextEditorDialogEditorImageEditorFontEditorCCompilerLINKER.EXE.RES開始之前第六頁,共四十二頁,2022年,8月28日7庫函數(shù)庫函數(shù)的作用用戶不必關(guān)心窗口要件的代碼動態(tài)鏈接庫在執(zhí)行時,才進(jìn)行鏈接增加程序的可移植性節(jié)約內(nèi)存Windows常用的庫函數(shù)CRuntimes--C庫函數(shù)LIBC.LIBMSVCRT.LIBWindowsAPIGDI32.DLLUSER32.DLLKERNEL32.DLL其它開始之前注意:在運行程序時會遇到一些庫缺失的錯誤,只需將這些庫找到放到windows系統(tǒng)目錄下第七頁,共四十二頁,2022年,8月28日8頭文件windows.hstdafx.h其它開始之前注意:當(dāng)編譯時出現(xiàn)找不到函數(shù)體錯誤時,需要包含正確的頭文件。如果不知道該包含哪一個時,1、可以在VC的include目錄下查找2、注意頭文件的包含順序第八頁,共四十二頁,2022年,8月28日9Windows程序結(jié)構(gòu)以消息(事件)為基礎(chǔ),以消息(事件)驅(qū)動 (messagebased,eventdriven)為什么窗口程序是事件驅(qū)動的窗口程序的主要任務(wù)是人機(jī)交互除非人主動結(jié)束任務(wù)。人不斷進(jìn)行各種輸入,計算機(jī)不斷響應(yīng) 程序以while循環(huán)為主體框架形成“輸入”-“響應(yīng)”的程序結(jié)構(gòu)窗口程序是怎樣進(jìn)行消息驅(qū)動的各種類型的“輸入”,以消息格式存在GetMessage()取走一個消息需要響應(yīng)消息和事件 對事件的響應(yīng),即事件驅(qū)動DispatchMessage()處理消息第九頁,共四十二頁,2022年,8月28日10Windows程序結(jié)構(gòu)程序基本結(jié)構(gòu)(算法)main(){while(GetMessage(&msg)){ProcessMessage(&msg);}}主函數(shù)消息處理函數(shù)ProcessMessage(msg){switch(msg){caseMSG1:caseMSG2:}}事件第十頁,共四十二頁,2022年,8月28日對比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);第十一頁,共四十二頁,2022年,8月28日12一個具體的窗口程序WinMain(){

初始化;

while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}系統(tǒng)消息隊列WndProc(msg){switch(msg){caseMSG1:caseMSG2:}}應(yīng)用程序消息隊列mousedriverkeyboarddriverSendMessage()USERModulemessagefromOtherwindowPostMessage()system第十二頁,共四十二頁,2022年,8月28日13程序入口點WinMainWinMainWinMain(){

初始化;

創(chuàng)建和顯示窗口;建立基于消息的事件驅(qū)動機(jī)制}WinMain(){

RegisterClass();

CreateWindow();ShowWindow();UpdateWindow();while(GetMessage(&msg)){TranslateMessage();DispatchMessage();}}第十三頁,共四十二頁,2022年,8月28日14Windows程序的主要構(gòu)成WinMain()--程序入口點注冊窗口RegisterClass()生成并顯示窗口CreateWindow()ShowWindow()進(jìn)入消息處理循環(huán)——簡稱消息循環(huán)WndProc()--窗口函數(shù)(功能實現(xiàn))區(qū)分消息switch根據(jù)消息觸發(fā)相應(yīng)處理調(diào)用DefWindowProc() 不處理的消息、和需要系統(tǒng)進(jìn)一步處理的消息 如WM_CLOSE,使用者關(guān)閉了窗口。應(yīng)用程序獲得這個消息后,釋放了自己的資源,然后讓系統(tǒng)進(jìn)一步執(zhí)行關(guān)閉窗口的動作思考:怎樣根據(jù)功能要求生成消息,并把這個消息傳遞給窗口函數(shù)?第十四頁,共四十二頁,2022年,8月28日15注冊窗口類RegisterClass(…)

在注冊之前可以設(shè)置窗口屬性,系統(tǒng)會給出一些缺省值,我們重點關(guān)心其中的lpfnWndProc參數(shù)WNDCLASSwc;wc.stvle=…;wc.lpfnWndProc=(WNDPROC)WndProc;提示系統(tǒng)收到消息后,調(diào)該函數(shù)處理消息wc.hIcon=…wc.Cursor=…wc.hbrBackground=…第十五頁,共四十二頁,2022年,8月28日16窗口程序的可能結(jié)構(gòu)Windows系統(tǒng)消息的處理產(chǎn)生消息顯示在窗口中顯示第十六頁,共四十二頁,2022年,8月28日17窗口產(chǎn)生CreateWindow()ShowWindow()UpdateWindow()第十七頁,共四十二頁,2022年,8月28日18消息循環(huán)while(GetMessage(&msg…)){TranslateMessage(&msg);//消息轉(zhuǎn)換DispatchMessage(&msg);}GetMessage具有阻塞機(jī)制當(dāng)消息隊列中沒有消息時,程序非忙等,而是讓權(quán)等待DispatchMessage不是直接調(diào)用消息處理函數(shù)(WndProc)通過USER模塊協(xié)助,才將消息傳遞到WndProcWndProc的調(diào)用指示在注冊窗口類時,已向系統(tǒng)指明 為什么不直接調(diào)用?方便系統(tǒng)抓取消息第十八頁,共四十二頁,2022年,8月28日19窗口函數(shù)WndProc(…)WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)HWNDhWnd:窗口句柄,在與窗口有關(guān)的控制中使用UINTmessage:消息(類型)WPARAMwParam:傳遞的參數(shù)LPARAMlParam:傳遞的參數(shù)在基于消息的機(jī)制中,僅有消息是不夠的產(chǎn)生消息的同時,傳遞什么樣的參數(shù)要視具體的消息而定第十九頁,共四十二頁,2022年,8月28日20窗口函數(shù)消息本身是一個unsignedint變量類型有WM_COMMAND:系統(tǒng)命令類,菜單選擇,按鈕等WM_PAINT:對窗口作圖WM_DESTORY:關(guān)閉窗口WM_USER:用戶可自定義一些消息在某個特定類型之下,更有許多事件,一般通過wParam或lParam通知第二十頁,共四十二頁,2022年,8月28日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);第二十一頁,共四十二頁,2022年,8月28日22Windows程序的生與死程序初始化過程中調(diào)用CreateWindow,為程序創(chuàng)建了一個窗口,CreateWindow送出WM_CREATE直接給窗口函數(shù),后者可以在此時做些初始化操作在程序運行過程中,不斷以GetMessage從消息隊列中取得消息。如果這個消息是WM_QUIT,GetMessage會得到0的返回值而結(jié)束循環(huán),進(jìn)而結(jié)束整個程序DispatchMessage通過系統(tǒng)USER模塊的協(xié)助與監(jiān)督,把消息分派至窗口函數(shù),消息將被處理程序不斷循環(huán)當(dāng)使用者按下系統(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é)束了,整個應(yīng)用程序也結(jié)束了第二十二頁,共四十二頁,2022年,8月28日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)用戶程序初始化啟動第二十三頁,共四十二頁,2022年,8月28日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é)束第二十四頁,共四十二頁,2022年,8月28日25一個簡單的Windows程序三種方式生成窗口程序建立空白工程,empty完全是空文件建立簡單工程,simple僅有WinMain建立典型應(yīng)用工程,HelloWorld具備完整的結(jié)構(gòu)生成一個典型應(yīng)用觀察具備哪些要件單步調(diào)試感受WinMain的流程在WndProc中設(shè)置斷點,感受消息抓取過程winuser.h中定義了系統(tǒng)消息第二十五頁,共四十二頁,2022年,8月28日26結(jié)合socket與windows需要考慮的一些重要問題窗口功能設(shè)計使用者點擊哪些按鈕,會獲得什么樣的功能如何在菜單中觸發(fā)消息在菜單中的選項都將產(chǎn)生WM_COMMAND,不同的是在wParam中id號不同(即事件不同)添加消息處理函數(shù)在窗口處理函數(shù)(WndProc)中針對前一步產(chǎn)生的消息和事件進(jìn)行處理在窗口中顯示數(shù)據(jù)用MessageBox方式在窗口中打印第二十六頁,共四十二頁,2022年,8月28日27結(jié)合socket流程與windows流程服務(wù)器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()第二十七頁,共四十二頁,2022年,8月28日28結(jié)合socket與windows1、生成一個典型應(yīng)用工程2、添加頭文件和庫--winsock.hwsock32.lib3、添加初始化和結(jié)束部分4、設(shè)計:用戶在菜單中選擇了start項,服務(wù)器就啟動起來5、在資源編輯器中選擇Menu6、在菜單中增加一個選項7、更改該菜單選項屬性,ID號為IDM_START,和標(biāo)題(caption)為Start8、在WndProc中添加IDM_START,及處理函數(shù)StartServer()9、在窗口關(guān)閉時,即對WM_DESTORY的處理中,加入關(guān)閉連接的過程第二十八頁,共四十二頁,2022年,8月28日29結(jié)合socket與windows觀察程序執(zhí)行結(jié)果問題1:當(dāng)啟動服務(wù)器服務(wù)后,窗口停止了響應(yīng)原因:程序在執(zhí)行recv后阻塞,也阻塞了抓取程序的過程。解決方法?問題2:如果在通信部分使用非阻塞的select機(jī)制,服務(wù)器窗口仍然停止響應(yīng)原因:程序陷于select的循環(huán)中,無法回到GetMessage取得窗口消息解決辦法?第二十九頁,共四十二頁,2022年,8月28日30學(xué)好Windows編程勿在浮沙筑高臺 但愿管中窺全豹學(xué)好Windows編程應(yīng)掌握的相關(guān)知識C++操作系統(tǒng)原理,Windows系統(tǒng)原理大量的系統(tǒng)庫函數(shù)及功能通過本課程能得到什么雖然不要求大家掌握C++,課程也不介紹C++,但通過實際編寫程序的過程,感受C++的一些特性。可以了解Windows程序的一般結(jié)構(gòu),體會消息驅(qū)動的原理,減輕編寫Windows程序的畏懼感。接觸并使用一些常用的調(diào)用第三十頁,共四十二頁,2022年,8月28日31Console第三十一頁,共四十二頁,2022年,8月28日32Window第三十二頁,共四十二頁,2022年,8月28日33Dialog第三十三頁,共四十二頁,2022年,8月28日34MessageBox第三十四頁,共四十二頁,2022年,8月28日35TextEditor開始之前第三十五頁,共四十二頁,2022年,8月28日36DialogEditor第三十六頁,共四十二頁,2022年,8月28日37ImageEditor第三十七頁,共四十二頁,2022年,8月28日38MessageBoxMessageBox()彈出的信息窗口intWINAPIMessageBox(HWNDhWnd,LPCSTRlpText,LPCSTRlpCaption,UINTuT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論