




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、2022/10/111自我介紹!Email: 姓名: 劉曉翔QQ: 13134954性別: 男年齡: xxx籍貫: 湖北聯(lián)系方式:手機: 135438945892022/10/11Windows編程主講:劉曉翔2022/10/113前言什么是Windows編程?1. 你編寫的程序是否遵循了Windows的編程模型?2.是否調(diào)用了Windows操作系統(tǒng)的應(yīng)用程序編程接口函數(shù)API,或者對其封裝后的基礎(chǔ)類庫(如MFC)。2022/10/114前言關(guān)于Windows編程的三個問題1. 什么是Windows API? 2. 什么是MFC?3. 為什么要使用MFC?2022/10/115前言1. 什么是
2、 Windows API? 從Windows應(yīng)用程序,操作系統(tǒng),計算機硬件之間的相互關(guān)系開始說起 應(yīng)用程序的機能就是:通知操作系統(tǒng)控制計算機硬件,執(zhí)行某個具體的動作,完成特定的功能。 例如:操作系統(tǒng)能夠控制聲卡發(fā)出聲音,但它并不知道應(yīng)該何時發(fā)出何種聲音,需要應(yīng)用程序告訴操作系統(tǒng)該發(fā)出什么樣的聲音。那么,應(yīng)用程序是如何通知操作系統(tǒng)執(zhí)行某個功能的呢?2022/10/116前言1. 什么是 Windows API?(續(xù)) 有過編程經(jīng)驗的同學(xué)都應(yīng)該知道,在傳統(tǒng)應(yīng)用程序中要完成某個功能,都是以函數(shù)調(diào)用的形式實現(xiàn)的,同樣,Windows應(yīng)用程序也是以函數(shù)調(diào)用的方式來通知操作系統(tǒng)執(zhí)行相應(yīng)的功能的。 操作系統(tǒng)
3、所能夠完成的每一個特殊功能通常都有一個函數(shù)與其對應(yīng),也就是說,操作系統(tǒng)把它所能夠完成的功能以函數(shù)的形式提供給應(yīng)用程序使用,應(yīng)用程序?qū)@些函數(shù)的調(diào)用就叫做系統(tǒng)調(diào)用,這些函數(shù)的集合就是Windows應(yīng)用程序編程接口(Application Programming Interface),簡稱Windows API。 如CreateWindow就是一個API函數(shù),應(yīng)用程序中調(diào)用這個函數(shù),操作系統(tǒng)就會按照該函數(shù)提供的參數(shù)信息產(chǎn)生一個相應(yīng)的窗口。2022/10/117前言1. 什么是 Windows API?(續(xù)) Windows編程的本質(zhì): 利用Windows API 函數(shù)編寫應(yīng)用程序,讓操作系統(tǒng)完成某
4、種特定的功能 。Windows/System32/Kernel32.dll、 USER32.dll、GDI32.dllWindows API 函數(shù)在哪里?怎樣使用Windows API?C和Windows SDK開發(fā)包( API函數(shù)是用純C寫的,都在windows.h中有聲明)然而如今,C+取代了C,成為專業(yè)Windows程序員首選的語言,所以MFC橫空出世了2022/10/118前言2. 什么是 MFC? MFC英文全稱為Microsoft Foundation Classes (微軟基礎(chǔ)類庫),是把Windows API進行封裝的類庫,它是一個類的集合,通過覆蓋Windows API,為編
5、程提供了一個面向?qū)ο蟮慕缑妗?MFC使Windows程序員能夠利用C+面象對象的特性進行編程。2022/10/119前言3. 為什么要使用MFC?可重用性封裝后使方法和屬性更緊密的捆綁常用的功能自動化,減少編寫代碼的數(shù)量提供應(yīng)用程序的框架結(jié)構(gòu) 框架結(jié)構(gòu)提供了抽象功能,它遠遠超出了Windows API的功能。例如:MFC的文檔/視圖體系結(jié)構(gòu)在API上建造了一個功能強大的基礎(chǔ)結(jié)構(gòu),它把程序中數(shù)據(jù)的圖形表示(或稱為視圖)與數(shù)據(jù)本身分開。這種抽象對API而言完全是陌生的,而且在MFC框架結(jié)構(gòu)之外或類似的類庫中也不存在。2022/10/1110關(guān)于教材參考書籍(Windows 編程四大法寶)VC深入詳
6、解孫鑫著 電子工業(yè)出版社深入淺出MFC(第二版)侯俊杰著 華中科技大學(xué)出版社Windows程序設(shè)計(第五版)Charles Petzold著 北京大學(xué)出版社( Microsoft Press )VisualC+技術(shù)內(nèi)幕(第四版)DavidJ.Kruglinski著 清華大學(xué)出版社( Microsoft Press )2022/10/1111內(nèi)容安排Windows程序內(nèi)部運行機制 (API)C+ 進階MFC框架程序 (“文檔/視圖”體系結(jié)構(gòu)程序)在窗口中繪圖在窗口中編輯文本菜單編程對話框界面設(shè)計(外觀、工具欄、狀態(tài)欄)動態(tài)鏈接庫多線程應(yīng)用程序2022/10/11第一講Windows程序內(nèi)部運行原
7、理2022/10/1113Windows 程序內(nèi)部運行機制Windows編程模型事件驅(qū)動編程模型以消息為基礎(chǔ),事件驅(qū)動之WM_PAINTWM_KEYDOWNWM_LBUTTONDOWN消息響應(yīng)消息響應(yīng)消息響應(yīng)DefWindowProc來源于操作系統(tǒng)的消息消息隊列WinMain消息循環(huán)發(fā)送消息窗口過程未處理的消息應(yīng)用程序窗口交還給操作系統(tǒng)操作系統(tǒng)實現(xiàn)特定功能2022/10/1114Windows 程序內(nèi)部運行機制消息、消息隊列、消息循環(huán) 應(yīng)用程序開始執(zhí)行后,系統(tǒng)都會為該程序創(chuàng)建一個消息隊列,這個消息隊列用來存放該程序創(chuàng)建的窗口的消息(消息通常與窗口相關(guān))。 例如,當我們按下鼠標左鍵的時候,將會產(chǎn)
8、生消息,系統(tǒng)會將這個消息放到窗口所屬的應(yīng)用程序的消息隊列中,等待應(yīng)用程序的處理。產(chǎn)生的消息都會依次放到消息隊列中,而應(yīng)用程序則通過一個消息循環(huán)不斷地從消息隊列中取出消息,并進行響應(yīng)。2022/10/1115Windows 程序內(nèi)部運行機制消息響應(yīng)與窗口過程 如用戶在某個程序活動時按了一下鍵盤,操作系統(tǒng)馬上能夠感知到這一事件,并且能夠知道用戶按下的是哪一個鍵,操作系統(tǒng)并不決定對這一事件如何作出反應(yīng),而是將這一事件轉(zhuǎn)交給應(yīng)用程序,由應(yīng)用程序決定如何對這一事件作出反應(yīng)。對事件作出反應(yīng)的過程就是消息響應(yīng),各種消息響應(yīng)放在一起組成了窗口過程。 2022/10/1116Windows 程序內(nèi)部運行機制Wi
9、ndows API 中消息的定義 操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序的呢?這是通過消息機制(Message)來實現(xiàn)的。操作系統(tǒng)將每個事件都包裝成一個稱為消息的結(jié)構(gòu)體MSG來傳遞給應(yīng)用程序,參看MSDN。MSG結(jié)構(gòu)定義如下: typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG; 2022/10/1117Windows 程序內(nèi)部運行機制小小知識點“句柄” 句柄(HANDLE),資源的標識。 操作系統(tǒng)要管理和操作各種各樣的資源,都是通過句柄
10、來找到對應(yīng)的資源。按資源的類型,又可將句柄細分成圖標句柄(HICON),光標句柄(HCURSOR),窗口句柄(HWND),應(yīng)用程序?qū)嵗浔℉INSTANCE)等等各種類型的句柄。 操作系統(tǒng)給每一個窗口指定的一個唯一的標識號即窗口句柄。 2022/10/1118Windows 程序內(nèi)部運行機制小小知識點API中對數(shù)據(jù)類型的宏定義好處:讓數(shù)據(jù)類型具備語義信息,從變量的類型就可以區(qū)分變量的用途!int x, y;x = 30;y = 30;/x和y既可以用來表示坐標點,也可以用來表示寬度和高度,還可以用來表示身高和體重。typedef int WIDTHtypedef int HEIGHTWIDT
11、H x;HEIGHT y;/我們從變量的類型上就可以知道x和y是用來表示寬度和高度。2022/10/1119Windows 程序內(nèi)部運行機制編寫Windows應(yīng)用程序的要素消息響應(yīng)消息響應(yīng)消息響應(yīng)DefWindowProcWinMain消息循環(huán)發(fā)送消息窗口過程未處理的消息應(yīng)用程序1 入口函數(shù)WinMain2 創(chuàng)建窗口3 消息循環(huán)與發(fā)送消息4 窗口過程與消息響應(yīng)消息窗口2022/10/1120Windows 程序內(nèi)部運行機制1.入口函數(shù)WinMainint WINAPI WinMain( HINSTANCE hInstance, / 當前應(yīng)用程序?qū)嵗浔?HINSTANCE hPrevInsta
12、nce, / 永遠為NULL LPSTR lpCmdLine, / 命令行參數(shù) int nCmdShow / 窗口顯示時的狀態(tài));2022/10/1121Windows 程序內(nèi)部運行機制2. 創(chuàng)建窗口 創(chuàng)建一個完整的窗口需要經(jīng)過下面四個操作步驟: Step1: 設(shè)計一個窗口類; Step2: 注冊窗口類; Step3: 創(chuàng)建窗口; Step4: 顯示及更新窗口。2022/10/1122Windows 程序內(nèi)部運行機制設(shè)計窗口類typedef struct _WNDCLASS UINT style; /窗口類樣式 WNDPROClpfnWndProc; /窗口過程函數(shù)指針 int cbClsEx
13、tra; /窗口類附加內(nèi)存字節(jié)數(shù),通常為0 int cbWndExtra; /窗口附加內(nèi)存字節(jié)數(shù),通常為0 HANDLE hInstance; /應(yīng)用程序?qū)嵗浔?HICON hIcon; /標題欄圖標 HCURSOR hCursor; /光標 HBRUSH hbrBackground; /窗口背景顏色 LPCTSTR lpszMenuName; /菜單資源名稱 LPCTSTR lpszClassName; /窗口類名稱 WNDCLASS; 2022/10/1123Windows 程序內(nèi)部運行機制創(chuàng)建窗口HWND CreateWindow( LPCTSTR lpClassName, / 已注冊
14、的窗口類名稱 LPCTSTR lpWindowName, / 窗口標題欄中顯示的文本 DWORD dwStyle, / 窗口樣式 int x, / 水平坐標 int y, / 垂直坐標 int nWidth, / 寬度 int nHeight, / 高度 HWND hWndParent, / 父窗口句柄 HMENU hMenu, / 菜單句柄 HINSTANCE hInstance, / 應(yīng)用程序?qū)嵗浔?LPVOID lpParam / 用于多文檔程序的附加參數(shù),單文檔為NULL ); 2022/10/1124Windows 程序內(nèi)部運行機制3. 消息循環(huán)與發(fā)送消息MSG msg;while
15、 (GetMessage(&msg,NULL,0,0) /從消息隊列獲取消息TranslateMessage(&msg); /消息解釋DispatchMessage(&msg); /將消息發(fā)送到“窗口過程”2022/10/1125Windows 程序內(nèi)部運行機制GetMessageBOOL GetMessage( LPMSG lpMsg, / 消息結(jié)構(gòu)體指針,返回消息信息 HWND hWnd, / 窗口句柄 ,通常設(shè)為NULL UINT wMsgFilterMin, / 消息過濾最小值 UINT wMsgFilterMax / 消息過濾最大值 ); GetMessage從線程的消息隊列中取出消
16、息,取出的消息保存在事先定義好的消息的結(jié)構(gòu)體對象中。 GetMessage函數(shù)取到除WM_QUIT外的消息均返回非零值,只有在接收到WM_QUIT消息時,才返回0。 什么時候才會收到WM_QUIT呢?(見窗口過程)2022/10/1126Windows 程序內(nèi)部運行機制TranslateMessage TranslateMessage函數(shù)用于將虛擬鍵消息轉(zhuǎn)換為字符消息。當我們敲擊鍵盤上的某個字符鍵時,系統(tǒng)將產(chǎn)生WM_KEYDOWN和WM_KEYUP消息。這兩個消息的附加參數(shù)(wParam和lParam)包含的是虛擬鍵代碼和掃描碼等信息,而我們在程序中往往需要得到某個字符的ASCII碼,Tran
17、slateMessage這個函數(shù)就可以將WM_KEYDOWN和WM_KEYUP消息的組合轉(zhuǎn)換為一條WM_CHAR消息,該消息的WParam附加參數(shù)包含了字符的ASCII碼),并將轉(zhuǎn)換后的新消息投遞到調(diào)用線程的消息隊列中。注意,Translate函數(shù)并不會修改原有的信息,他只是產(chǎn)生新的消息并投遞到消息隊列中。2022/10/1127Windows 程序內(nèi)部運行機制DispatchMessage DispatchMessage分派一個消息到窗口過程。由窗口過程函數(shù)對消息進行處理。 DispatchMessage實際上是將消息回傳給操作系統(tǒng),再由操作系統(tǒng)調(diào)用窗口過程函數(shù)對消息進行處理。2022/10
18、/1128 對于一條消息,操作系統(tǒng)到底調(diào)用應(yīng)用程序中的哪個函數(shù)來處理呢? 操作系統(tǒng)調(diào)用的就是接受消息的窗口所屬的類型中的lpfnWndProc成員(還記得窗口類的第二個成員嗎?)指定的函數(shù)。每一種不同類型的窗口都有自己專用的回調(diào)函數(shù),該函數(shù)就是通過lpfnWndProc成員指定的,也稱回調(diào)函數(shù)。 回調(diào)函數(shù)的原理是這樣的,當應(yīng)用程序收到給某一窗口的消息時,就應(yīng)該調(diào)用某一函數(shù)來處理這條消息。這一調(diào)用過程不用應(yīng)用程序自己來實施,而由操作系統(tǒng)來完成,但是,回調(diào)函數(shù)本身的代碼必須由應(yīng)用程序自己完成。 Windows 程序內(nèi)部運行機制窗口過程函數(shù)2022/10/1129Windows 程序內(nèi)部運行機制5.
19、 窗口過程與響應(yīng)消息LRESULT CALLBACK MyWndProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter) switch (uMsg) case WM_PAINT: /響應(yīng)消息 case WM_KEYDOWN: /響應(yīng)消息 case WM_LBUTTONDOWN: /響應(yīng)消息 default: return DefWindowProc(hw
20、nd,uMsg,wParam,lParam); return 0;2022/10/1130Windows 程序內(nèi)部運行機制回調(diào)函數(shù) 凡是由你設(shè)計而卻由Windows系統(tǒng)調(diào)用的函數(shù),統(tǒng)稱為Callback函數(shù)。這些函數(shù)都有一定的類型,以配合Windows的調(diào)用操作。 除了窗口過程函數(shù),Windows API還有一些其它的回調(diào)函數(shù),例如SetTimer、LineDDA、EnumObject。這種函數(shù)會在進行某種行為之后或滿足某種狀態(tài)之時,操作系統(tǒng)自動調(diào)用該函數(shù)。2022/10/1131Windows 程序內(nèi)部運行機制小小知識:函數(shù)的三種調(diào)用方式_cdecl 是C/C+和MFC程序默認使用的調(diào)用約定
21、,也可以在函數(shù)聲明時加上_cdecl關(guān)鍵字來手工指定。采用_cdecl約定時,函數(shù)參數(shù)按照從右到左的順序入棧,并且由調(diào)用函數(shù)者把參數(shù)彈出棧以清理堆棧。因此,實現(xiàn)可變參數(shù)的函數(shù)只能使用該調(diào)用約定。由于每一個使用_cdecl約定的函數(shù)都要包含清理堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會比較大。_stdcall 調(diào)用約定用于調(diào)用Win32 API函數(shù)。采用_stdcall約定時,函數(shù)參數(shù)按照從右到左的順序入棧,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的棧,函數(shù)參數(shù)個數(shù)固定。由于函數(shù)體本身知道傳進來的參數(shù)個數(shù),因此被調(diào)用的函數(shù)可以在返回前用一條ret n指令直接清理傳遞參數(shù)的堆棧。_fastcall 約定用于對
22、性能要求非常高的場合。_fastcall約定將函數(shù)的從左邊開始的兩個大小不大于4個字節(jié)(DWORD)的參數(shù)分別放在ECX和EDX寄存器,其余的參數(shù)仍舊自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的堆棧。_fastcall可以寫成_fastcall。 2022/10/1132Windows 程序內(nèi)部運行機制三種調(diào)用方式的特別說明在默認情況下,VC采用_cdecl方式,因此可以省略.WINAPI一般用于修飾動態(tài)鏈接庫中導(dǎo)出函數(shù) CALLBACK僅用于修飾回調(diào)函數(shù) 2022/10/1133Windows 程序內(nèi)部運行機制DefWindowProc 我們的程序無論多大都不可能將所有的消息都處理,
23、所以我們必須有一個機制讓不感興趣的、不需要我們處理的消息,交還給Windows操作系統(tǒng)為我們處理,這個過程就是由DefWindowProc函數(shù)來實現(xiàn)的,也是每個程序所必備的。2022/10/1134Windows 程序內(nèi)部運行機制WM_DESTROY 當窗口被銷毀時會產(chǎn)生這個消息(通常也是準備退出應(yīng)用程序的時候),對于這個消息的響應(yīng)是每個程序所必備的。怎樣響應(yīng)呢? 響應(yīng)方式就是調(diào)用PostQuitMessage函數(shù),該函數(shù)會在消息隊列中添加一個WM_QUIT消息,準備讓由消息循環(huán)中的GetMessage取得。當消息循環(huán)中的收到WM_QUIT消息時,GetMessage會傳回0,從而結(jié)束消息循環(huán),進而結(jié)束整個程序。 2022/10/1135Windows 程序內(nèi)部運行機制WM_QUIT & PostQuitMessage PostQuitMessage會發(fā)送WM_QUIT給消息隊列。注意,WM_QUIT永遠不會到達窗口過程,因為GetMessage得到WM_QUIT后就會返回0,從而結(jié)束消息循環(huán),程序退出。 強烈建議PostQuitMessage放在WM_DESTROY消息響應(yīng)里面調(diào)用,讓程序正常有序的結(jié)束,因為通常銷毀窗口是程序運行的最后一步。 當然,PostQuitMe
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自行車騎行與城市青年創(chuàng)業(yè)機遇考核試卷
- 玉石產(chǎn)業(yè)的政策支持與財稅優(yōu)惠政策考核試卷
- 玻璃保溫容器生產(chǎn)計劃與生產(chǎn)組織優(yōu)化方法實踐探索經(jīng)驗考核試卷
- 海洋生態(tài)系統(tǒng)恢復(fù)考核試卷
- 摩托車頭盔內(nèi)部吸汗墊清洗考核試卷
- 玻璃加工過程中的智能化檢測技術(shù)考核試卷
- 篷布遮陽篷在商業(yè)建筑的節(jié)能貢獻與景觀設(shè)計效果分析考核試卷
- 抖音短視頻內(nèi)容創(chuàng)作者內(nèi)部晉升及權(quán)益分配協(xié)議
- 精裝現(xiàn)房交付標準及室內(nèi)外裝飾設(shè)計合同
- 智慧城市項目合作與商業(yè)秘密保密協(xié)議
- 2024年7月27日內(nèi)蒙古阿拉善盟直機關(guān)遴選筆試真題及解析
- 《長期主義 關(guān)注短期業(yè)績 更要投資長期增長》讀書筆記思維導(dǎo)圖PPT模板下載
- 故宮博物院筆試試題
- 思政教育融入小學(xué)語文教學(xué)的策略研究
- 供方準入申請表
- DDI領(lǐng)導(dǎo)力-高績效輔導(dǎo)課件
- 《煙酒有危害》公開課教案
- 高三生物一輪復(fù)習(xí)課件:生物變異類型的判斷與實驗探究
- 先簡支后連續(xù)T梁橋設(shè)計計算書
- (完整word版)樁位偏差驗收記錄表
- 電流滯環(huán)跟蹤PWM(CHBPWM)控制技術(shù)的仿真
評論
0/150
提交評論