windows編程復習綱要課件

Fundamentals of Computers,*,*,制作:劉曉翔,JINAN University,暨南大學電氣信息學院,Windows,編程,Fundamentals of Computers,制作:劉曉翔,JINAN University,暨南大學電氣信息學院,Windows,編程,*,*,Fundamentals of Computers,暨南大學電氣信息學院,Windows,編程,*,制作:劉曉翔,2024/11/14,1,前言,什么是,Windows API,?,有過編程經驗的讀者都應該知道,在傳統(tǒng)應用程序中要完成某個功能,都是以,函數(shù)調用,的形式實現(xiàn)的,同樣,,Windows,應用程序也是以函數(shù)調用的方式來通知操作系統(tǒng)執(zhí)行相應的功能的操作系統(tǒng)所能夠完成的每一個特殊功能通常都有一個函數(shù)與其對應,也就是說,操作系統(tǒng)把它所能夠完成的功能以函數(shù)的形式提供給應用程序使用,應用程序對這些函數(shù)的調用就叫做系統(tǒng)調用,這些函數(shù)的集合就是,Windows,操作系統(tǒng)提供給應用程序編程的接口,(Application Programming Interface),,簡稱,Windows API,。
如,CreateWindow,就是一個,API,函數(shù),應用程序中調用這個函數(shù),操作系統(tǒng)就會按照該函數(shù)提供的參數(shù)信息產生一個相應的窗口這些,API,函數(shù)都在,windows.h,中聲明2023/9/211前言 什么是 Windows API?,2024/11/14,2,什么是,MFC,?,MFC,英文全稱為,Microsoft Foundation Classes,(微軟基礎類庫),是把,Windows API,進行封裝的類庫,它是一個類的集合,通過覆蓋,Windows API,,為編程提供了一個,面向對象,的界面MFC,使,Windows,程序員能夠利用,C+,面象對象的特性進行編程前言,2023/9/212什么是 MFC?MFC,2024/11/14,3,為什么要使用,MFC,?,可重用性,封裝后使方法和屬性更緊密的捆綁,常用的功能自動化,減少編寫代碼的數(shù)量,提供應用程序的框架結構,框架結構提供了抽象功能,它遠遠超出了,Windows API,的功能例如:,MFC,的文檔,/,視圖體系結構在,API,上建造了一個功能強大的基礎結構,它把程序中數(shù)據(jù)的圖形表示(或成為視圖)與數(shù)據(jù)本身分開。
這種抽象對,API,而言完全是陌生的,而且在,MFC,框架結構之外或類似的類庫中也不存在前言,2023/9/213為什么要使用MFC?可重用性前言,2024/11/14,4,Windows,程序內部運行機制,Windows,編程模型,事件驅動編程模型,以消息為基礎,事件驅動之,WM_PAINT,WM_KEYDOWN,WM_LBUTTONDOWN,消息響應,消息響應,消息響應,DefWindowProc,來源于操作系統(tǒng)的消,息,消,息隊列,WinMain,消息循環(huán),發(fā)送消息,窗口過程,未處理的消息,應用程序,窗口,2023/9/214Windows 程序內部運行機制Wind,2024/11/14,5,Windows,程序內部運行機制,小小知識點,“,句柄”,句柄(,HANDLE,),資源的標識操作系統(tǒng)要管理和操作這些資源,都是通過句柄來找到對應的資源按資源的類型,又可將句柄細分成圖標句柄(,HICON,),光標句柄(,HCURSOR,),窗口句柄(,HWND,),應用程序實例句柄(,HINSTANCE,)等等各種類型的句柄操作系統(tǒng)給每一個窗口指定的一個唯一的標識號即窗口句柄2023/9/215Windows 程序內部運行機制小小知識,2024/11/14,6,Windows,程序內部運行機制,編寫,Windows,應用程序的要素,消息響應,消息響應,消息響應,DefWindowProc,WinMain,消息循環(huán),發(fā)送消息,窗口過程,未處理的消息,應用程序,1,入口函數(shù),WinMain,2,創(chuàng)建窗口,3,發(fā)送消息與消息循環(huán),4,窗口過程與消息響應,消息,窗口,2023/9/216Windows 程序內部運行機制編寫Wi,2024/11/14,7,窗口類第二個成員變量,lpfnWndProc,指定了這一類型窗口的過程函數(shù),也稱,回調函數(shù),。
回調函數(shù)的原理是這樣的,當應用程序收到給某一窗口的消息時(還記得前面講過的消息通常與窗口相關的嗎?),就應該調用某一函數(shù)來處理這條消息這一,調用過程不用應用程序自己來實施,而由操作系統(tǒng)來完成,,但是,回調函數(shù)本身的代碼必須由應用程序自己完成對于一條消息,操作系統(tǒng)到底調用應用程序中的哪個函數(shù)(回調函數(shù))來處理呢?操作系統(tǒng)調用的就是接受消息的窗口所屬的類型中的,lpfnWndProc,成員指定的函數(shù)每一種不同類型的窗口都有自己專用的回調函數(shù),該函數(shù)就是通過,lpfnWndProc,成員指定的Windows,程序內部運行機制,窗口過程函數(shù),2023/9/217 窗口類第二個成員變量lpfnWn,2024/11/14,8,Windows,程序內部運行機制,創(chuàng)建窗口,創(chuàng)建一個完整的窗口需要經過下面四個操作步驟:,Step1:,設計一個窗口類;,Step2:,注冊窗口類;,Step3:,創(chuàng)建窗口;,Step4:,顯示及更新窗口2023/9/218Windows 程序內部運行機制創(chuàng)建窗口,2024/11/14,9,Windows,程序內部運行機制,WM_PAINT,Windows,把一個最小的需要重繪的正方形區(qū)域叫做,“無效區(qū)域”,。
當,Windows,發(fā)現(xiàn)了一個“無效區(qū)域“后,它就會向該應用程序發(fā)送一個,WM_PAINT,消息,通知應用程序重新繪制窗口當窗口從無到有、改變尺寸、最小化后再恢復、被其他窗口遮蓋后再顯示時,窗口的客戶區(qū)都將變?yōu)闊o效那么,應用程序是如何通知操作系統(tǒng)執(zhí)行某個功能的呢?,2023/9/219Windows 程序內部運行機制WM_P,2024/11/14,10,Windows,程序內部運行機制,自行發(fā)送消息的兩種方式,發(fā)送消息可以使用,SendMessage,和,PostMessage,函數(shù)SendMessage,將消息,直接發(fā)送給窗口,,并,調用該窗口過程,進行處理在窗口過程對消息處理完畢后,該函數(shù)才返回PostMessage,函數(shù),將消息放入,與創(chuàng)建窗口的線程相關聯(lián)的,消息隊列,后立即返回2023/9/2110Windows 程序內部運行機制自行發(fā),2024/11/14,11,虛函數(shù)與多態(tài)性,當,C+,編譯器在編譯的時候,發(fā)現(xiàn)基類的函數(shù)是虛函數(shù),這個時候,C+,就會采用遲綁定(,late binding,)的技術,在運行時,依據(jù)對象的類型(在示例程序中,我們傳遞的派生類對象的地址)來確認調用的哪一個函數(shù),這種能力就做,C+,的,多態(tài)性,。
在基類的函數(shù)前加上,virtual,關鍵字,該函數(shù)則為,虛函數(shù),虛函數(shù)派生下去仍為虛函數(shù),而且可以省略,virtual,關鍵字在派生類中重寫該函數(shù),,運行時將會根據(jù)指針實際所指的對象的類型來調用相應的函數(shù),如果對象類型是派生類,就調用派生類的函數(shù);如果對象類型是基類,就調用基類的函數(shù)掌握,C+,2023/9/2111虛函數(shù)與多態(tài)性 當C+編,2024/11/14,12,純虛函數(shù)與抽象類,純虛函數(shù),是指被標明為不具體實現(xiàn)的虛函數(shù)純虛函數(shù)可以讓類先具有一個操作名稱,而沒有操作內容,讓派生類在繼承時再去具體地給出定義凡是含有純虛函數(shù)的類叫做,抽象類,這種可不能實例化對象,只能作為基類為派生類服務注意:,派生類中必須實現(xiàn)基類的純虛函數(shù),否則,派生類也變成了抽象類,不能實例化對象純虛函數(shù)多用在一些方法行為的實際上在設計基類時,不太好確定或將來的行為多種多樣,而此行為又是必需的,我們就可以在基類的設計中,以純虛函數(shù)來聲明次中行為,而不具體實現(xiàn)它掌握,C+,2023/9/2112純虛函數(shù)與抽象類 純虛函數(shù),2024/11/14,13,const,的使用方法,const,成員函數(shù),任何不會修改數(shù)據(jù)成員的函數(shù)都應該聲明為,const,類型,。
如果在編寫,const,成員函數(shù)時,不慎修改了數(shù)據(jù)成員,或者調用了其它非,const,成員函數(shù),編譯器將指出錯誤,這無疑會提高程序的健壯性2023/9/2113const的使用方法const成員函數(shù),2024/11/14,14,類中的,Static,成員變量與函數(shù),靜態(tài)成員函數(shù)與變量的特性,靜態(tài)成員函數(shù)和靜態(tài)成員變量屬于類本身,在類加載的時候(編譯階段),即為它們分配了空間,因此可以通過,類名,:,函數(shù)名,或,類名,:,變量名,來訪問而非靜態(tài)函數(shù)和非靜態(tài)成員屬于對象的方法和數(shù)據(jù),也就是應該首先產生類的對象,然后通過類的對象去引用靜態(tài)函數(shù)不屬于某個具體的對象,也就是說,在還沒有產生類的任何一個具體對象時,靜態(tài)函數(shù)就已經存在于程序的代碼區(qū)了但這是類的非靜態(tài)成員還沒有分配內存空間,這樣,在靜態(tài)成員函數(shù)中是沒有辦法對類非靜態(tài)成員進行操作的因此,,在靜態(tài)成員函數(shù)中只能訪問靜態(tài)成員變量,不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)成員變量,非靜態(tài)成員函數(shù)中可以調用靜態(tài)成員函數(shù)2023/9/2114類中的Static成員變量與函數(shù)靜態(tài)成,2024/11/14,15,MFC,框架程序剖析,MFC,單文檔界面程序初探(簡答題),test,.h,、,test.cpp,應用程序類:,CTestApp,(由,CWinApp,繼承而來),每一個,MFC,程序有且僅有一個主應用程序類對象,theApp,,它代表一個程序本體,用于管理和維護主應用程序,MainFrm,.h,、,MainFrm,.cpp,主框架類,C,MainFrame,(由,CWnd,繼承而來),主框架是應用程序的主體窗口,其他的窗口(如視類窗口、工具條、狀態(tài)條)都依附于主框架窗口(覆蓋在它上面)。
2023/9/2115MFC框架程序剖析MFC單文檔界面程序,2024/11/14,16,MFC,框架程序剖析,MFC,單文檔界面程序初探(續(xù)),testView.,h,、,testView.cpp,視圖類:,CTestView,(由,CWnd,繼承而來),負責管理和維護圖形顯示操作testDoc,.h,、,testDoc,.cpp,文檔類:,CTestDoc,(由,CDocumet,繼承而來),負責顯示數(shù)據(jù)的后臺管理和維護2023/9/2116MFC框架程序剖析MFC單文檔界面程序,2024/11/14,17,MFC,框架程序剖析,MFC,中的全局對象,theApp,初始化,CTestAPP,對象,應用程序內存獲得配置,調用基類,CWinApp,構造函數(shù)(在,MFC,源碼目錄的文件中,AppCore.cpp,),初始化完成程序運行時的一些初始化工作注意:,由于,theApp,是個全局對象,,所以,CWinApp,構造函數(shù)會在入口函數(shù),WinMain,之前運行,2023/9/2117MFC框架程序剖析MFC中的全局對象t,2024/11/14,18,圖形操作,設備描述表,DC,在,Windows,平臺下,窗口的所有圖形操作都是利用,DC,來完成的。
如果使用,GetDC,來得到,DC,的句柄,在完成圖形操作后,必須調用,ReleaseDC,來釋放,DC,所占用的資源,以避免內存泄漏利用計算機作圖,窗口相當于畫布,因此,在獲取,DC,的句柄時,總是和一個指定的窗口相關聯(lián)2023/9/2118圖形操作設備描述表DC在Windows,2024/11/14,19,簡單繪圖,利用,CClientDC,、,CWindowDC,類繪圖(簡答題),CClientDC,派生于,CDC,類,并且在構造時調用,GetDC,函數(shù),在析構時調用,ReleaseDC,函數(shù)它與,CDC,一樣,都是實現(xiàn)在窗口的,客戶區(qū),繪圖CWindowDC,派生于,CDC,類,并且在構造時調用,GetWin。