C的Windows編程基礎(chǔ).ppt_第1頁(yè)
C的Windows編程基礎(chǔ).ppt_第2頁(yè)
C的Windows編程基礎(chǔ).ppt_第3頁(yè)
C的Windows編程基礎(chǔ).ppt_第4頁(yè)
C的Windows編程基礎(chǔ).ppt_第5頁(yè)
已閱讀5頁(yè),還剩101頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Windows編程基礎(chǔ),基本概念 Windows程序運(yùn)行機(jī)制 VC6.0下三種編程方式 命名規(guī)則匈牙利命名法(自學(xué)) Windows程序結(jié)構(gòu) 簡(jiǎn)單的Windows編程(API) MFC編程基礎(chǔ),窗口和程序,窗口是Windows本身以及Windows 環(huán)境下的應(yīng)用程序的基本界面單位。 很多人都誤以為只有具有標(biāo)題欄、狀態(tài)欄、最大化、最小化按鈕這樣標(biāo)準(zhǔn)的方框才叫窗口。 其實(shí)窗口的概念很廣,例如按鈕和對(duì)話(huà)框等也是窗口,只不過(guò)是一種特殊的窗口。,窗口,窗口 (Window) 由句柄唯一標(biāo)識(shí)。 Windows程序的基本操作單元。 系統(tǒng)管理應(yīng)用程序的基本單位。 應(yīng)用程序與用戶(hù)交互的接口環(huán)境。 應(yīng)用程序的運(yùn)行

2、就是窗口內(nèi)部、窗口之間、窗口與系統(tǒng)之間數(shù)據(jù)處理與交換的過(guò)程。 一個(gè)Windows程序至少有一個(gè)窗口。,窗口的組成,應(yīng)用程序的主窗口,窗口,窗口,窗口,窗口,窗口,窗口的組成,窗口是屏幕上的一個(gè)矩形區(qū)域 應(yīng)用程序在該區(qū)域中顯示數(shù)據(jù)并等待鼠標(biāo)點(diǎn)擊 Windows應(yīng)用系統(tǒng)的用戶(hù)界面可以包含許多窗口 每個(gè)窗口都有不同的特點(diǎn),但都是互相聯(lián)系的,三種類(lèi)型的窗口,在這么多窗口中,基本類(lèi)型只有三種: 重疊( Overlapped ) 窗口 彈出( Popup ) 窗口 子( Child ) 窗口 在它們之間并沒(méi)有太多內(nèi)在的差異,但是使用不同的窗口風(fēng)格,它們的外觀是不同的,三種類(lèi)型的窗口,重疊窗口通常用于建立應(yīng)

3、用程序主窗口。事實(shí)上,有時(shí)也叫做“主”窗口或者“框架”窗口 彈出窗口通常以對(duì)話(huà)框和消息框的形式與用戶(hù)對(duì)話(huà) 子窗口通常用在視圖( View )中,如在文本編輯器中的文本顯示,也用在控件中,如在對(duì)話(huà)框中的OK按鈕 而對(duì)那些看起來(lái)像按鈕或控件的子窗口,也稱(chēng)為“控件”窗口,三種窗口組成的應(yīng)用程序,屬于桌面的重疊窗口,也稱(chēng)主窗口,主窗口的子窗口,主窗口的子窗口,主窗口的彈出窗口,彈出窗口的子窗口,三種類(lèi)型的窗口,主要區(qū)別 重疊窗口和彈出窗口 彈出窗口出現(xiàn)時(shí)可以沒(méi)有標(biāo)題(也稱(chēng)為標(biāo)題欄) 子窗口與重疊窗口、彈出窗口 子窗口只能出現(xiàn)在另一個(gè)窗口中,并且子窗口的任何多余部分都被該窗口移去或剪切掉 另外,子窗口是

4、唯一不能有菜單條的窗口,程序,通常說(shuō)的程序都是指一個(gè)能讓計(jì)算機(jī)識(shí)別的文件。 接觸得最多的是以exe或者com作為擴(kuò)展名的文件。,進(jìn)程與線(xiàn)程,進(jìn)程就是應(yīng)用程序的執(zhí)行實(shí)例(或稱(chēng)一個(gè)執(zhí)行程序),進(jìn)程是程序動(dòng)態(tài)的描述。 一個(gè)以exe作為擴(kuò)展名的文件,在沒(méi)有被執(zhí)行的時(shí)候稱(chēng)之為應(yīng)用程序,當(dāng)用鼠標(biāo)雙擊執(zhí)行以后,就被操作系統(tǒng)作為一個(gè)進(jìn)程執(zhí)行了。 當(dāng)關(guān)機(jī)或者在任務(wù)欄的圖標(biāo)上單擊鼠標(biāo)右鍵選“退出”時(shí),進(jìn)程便消亡,徹底結(jié)束了生命。 進(jìn)程經(jīng)歷了由“創(chuàng)建”到“消亡”的生命期,而程序自始至終存在于你的硬盤(pán)上,不管計(jì)算機(jī)是否啟動(dòng)。,Windows任務(wù)管理器進(jìn)程,線(xiàn)程,線(xiàn)程是進(jìn)程的一個(gè)執(zhí)行單元。 同一個(gè)進(jìn)程中的各個(gè)線(xiàn)程對(duì)應(yīng)于

5、一組CPU指令、一組CPU寄存器以及一個(gè)堆棧。 進(jìn)程本來(lái)就具有動(dòng)態(tài)的含義,是通過(guò)線(xiàn)程來(lái)體現(xiàn)的。,Windows應(yīng)用程序,操作系統(tǒng),計(jì)算機(jī)硬件之間的相互關(guān)系,向下的箭頭1表示操作系統(tǒng)能夠操縱輸出設(shè)備,以執(zhí)行特定的功能,如讓聲卡發(fā)出聲音,讓顯卡畫(huà)出圖形。向上的箭頭2表示操作系統(tǒng)能夠感知輸入設(shè)備狀態(tài)的變化,如鼠標(biāo)移動(dòng),鍵盤(pán)按下,并且能夠知道鼠標(biāo)移動(dòng)的具體位置,鍵盤(pán)按下的哪個(gè)字符。這就是操作系統(tǒng)和計(jì)算機(jī)硬件之間的交互關(guān)系,應(yīng)用程序開(kāi)發(fā)者通常不需知道其具體實(shí)現(xiàn)細(xì)節(jié)。,API與SDK,API是英文Application Programming Interface 的縮寫(xiě),意思是“應(yīng)用程序接口”,泛指系統(tǒng)為

6、應(yīng)用程序提供的一系列函數(shù)接口 在編程時(shí)可以直接調(diào)用,而不必知道其內(nèi)部實(shí)現(xiàn)的過(guò)程,只知道它的原型和返回值就可以了 SDK是英文Software Development Kit的縮寫(xiě),意思是“軟件開(kāi)發(fā)工具包” 微軟提供了許多專(zhuān)門(mén)的SDK開(kāi)發(fā)包,比如DirectX開(kāi)發(fā)包和語(yǔ)音識(shí)別開(kāi)發(fā)包等,關(guān)于API,向下的箭頭表示應(yīng)用程序可以通知操作系統(tǒng)執(zhí)行某個(gè)具體的動(dòng)作。 如操作系統(tǒng)能夠控制聲卡發(fā)出聲音,但它并不知道應(yīng)該何時(shí)發(fā)出何種聲音,需要應(yīng)用程序告訴操作系統(tǒng)該發(fā)出什么樣的聲音。,關(guān)于API,應(yīng)用程序是如何通知操作系統(tǒng)執(zhí)行某個(gè)功能的呢? 在應(yīng)用程序中要完成某個(gè)功能,都是以函數(shù)調(diào)用的形式實(shí)現(xiàn)的,同樣,應(yīng)用程序也是

7、以函數(shù)調(diào)用的方式來(lái)通知操作系統(tǒng)執(zhí)行相應(yīng)的功能的。操作系統(tǒng)所能夠完成的每一個(gè)特殊功能通常都有一個(gè)函數(shù)與其對(duì)應(yīng),也就是說(shuō),操作系統(tǒng)把它所能夠完成的功能以函數(shù)的形式提供給應(yīng)用程序使用,應(yīng)用程序?qū)@些函數(shù)的調(diào)用就叫做系統(tǒng)調(diào)用,這些函數(shù)的集合就是Windows操作系統(tǒng)提供給應(yīng)用程序編程的接口Windows API。如CreateWindow就是一個(gè)API函數(shù),應(yīng)用程序中調(diào)用這個(gè)函數(shù),操作系統(tǒng)就會(huì)按照該函數(shù)提供的參數(shù)信息產(chǎn)生一個(gè)相應(yīng)的窗口。,事件及消息,事件(Event)是對(duì)計(jì)算機(jī)操作的動(dòng)作。每個(gè)事件對(duì)應(yīng)一個(gè)消息,即每個(gè)事件發(fā)生的效果是產(chǎn)生消息。 消息(Message)是描述事件發(fā)生的信息。 比如:按鍵事

8、件按下鍵的消息、字符消息和鍵彈起的消息 程序執(zhí)行的順序取決于事件發(fā)生的順序,但是消息的產(chǎn)生并不要求有次序之分。,消息(Message),向上的箭頭表示操作系統(tǒng)能夠?qū)⑤斎朐O(shè)備的變化上傳給應(yīng)用程序。 如用戶(hù)在某個(gè)程序活動(dòng)時(shí)按了一下鍵盤(pán),操作系統(tǒng)馬上能夠感知到這一事件,并且能夠知道用戶(hù)按下的是哪一個(gè)鍵,操作系統(tǒng)并不決定對(duì)這一事件如何作出反應(yīng),而是將這一事件轉(zhuǎn)交給應(yīng)用程序,由應(yīng)用程序決定如何對(duì)這一事件作出反應(yīng)。好比有個(gè)蚊子叮了我們一口,我們的神經(jīng)末梢(相當(dāng)于操作系統(tǒng))馬上感知到這一事件,并傳遞給了我們的大腦(相當(dāng)于應(yīng)用程序),我們的大腦最終決定如何對(duì)這一事件作出反應(yīng),如將蚊子趕走,或是將蚊子拍死。對(duì)事

9、件作出反應(yīng)的過(guò)程就是消息響應(yīng)。,消息(Message),消息是應(yīng)用程序和計(jì)算機(jī)交互的途徑,在計(jì)算機(jī)上幾乎做每一個(gè)動(dòng)作都會(huì)產(chǎn)生一個(gè)消息。 鼠標(biāo)被移動(dòng)會(huì)產(chǎn)生WM_MOUSEMOVE消息; 鼠標(biāo)左鍵被按下會(huì)產(chǎn)生WM_LBUTTONDOWN的消息; 鼠標(biāo)右鍵按下便產(chǎn)生WM_RBUTTONDOWN消息等。,消息的功能,功能 幫助Windows實(shí)現(xiàn)多任務(wù)。 通知應(yīng)用程序某一事件已經(jīng)發(fā)生,各應(yīng)用程序給予響應(yīng)。,消息的組成,操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序呢?這是通過(guò)消息機(jī)制(Message)來(lái)實(shí)現(xiàn)的。 操作系統(tǒng)將每個(gè)事件都包裝成一個(gè)稱(chēng)為消息的結(jié)構(gòu)體MSG來(lái)傳遞給應(yīng)用程序,參看MSDN。 消息的組成

10、: 消息號(hào)字參數(shù)長(zhǎng)字參數(shù) 消息號(hào)事先定義好。 字參數(shù)(wParam)長(zhǎng)字參數(shù)(lParam)提供附加信息,含義和具體消息號(hào)相關(guān)。,典型的消息結(jié)構(gòu),typedef struct tagMSG HWND hwnd; / 接收窗口 UINT message; / 消息標(biāo)識(shí) WPARAM wParam; / 附加信息 LPARAM lParam; / 附加信息 DWORD time; / 發(fā)送時(shí)間 POINT pt; / 鼠標(biāo)位置 MSG , *PMSG; /vcincludewtypes.h,句柄 (HANDLE),句柄(HANDLE):資源的標(biāo)識(shí)。 操作系統(tǒng)要管理和操作這些資源,都是通過(guò)句柄來(lái)找到

11、對(duì)應(yīng)的資源。 按資源的類(lèi)型,又可將句柄細(xì)分成圖標(biāo)句柄(HICON),光標(biāo)句柄(HCURSOR),窗口句柄(HWND),應(yīng)用程序?qū)嵗浔℉INSTANCE)等等各種類(lèi)型的句柄。操作系統(tǒng)給每一個(gè)窗口指定的一個(gè)唯一的標(biāo)識(shí)號(hào)即窗口句柄。,句柄,句柄是一個(gè)指針 通過(guò)句柄就可以控制該句柄指向的對(duì)象 編寫(xiě)程序總是要和各種句柄打交道的 句柄(handle)是一個(gè)4字節(jié)長(zhǎng)的整數(shù)值 是系統(tǒng)用于表示應(yīng)用程序中不同的對(duì)象和同類(lèi)對(duì)象中不同的實(shí)例。 如一個(gè)窗口、按鈕、圖標(biāo)、菜單等 這些東西在系統(tǒng)中被視為不同類(lèi)型的對(duì)象,用不同的句柄將他們區(qū)分開(kāi)來(lái)。,常用的句柄,從變量的類(lèi)型區(qū)分變量的用途,int x,y; x=30; y

12、=30; /x和y既可以用來(lái)表示坐標(biāo)點(diǎn),也可以用來(lái)表示寬度和高度,還可以用來(lái)表示身高和體重。 typedef int WIDTH typedef int HEIGHT WIDTH x; HEIGHT y; /好處:我們從變量的類(lèi)型上就可以知道x和y是用來(lái)表示寬度和高度。,消息驅(qū)動(dòng)機(jī)制,DOS程序是通過(guò)調(diào)用系統(tǒng)的函數(shù)來(lái)獲得用戶(hù)輸入。 Windows程序則是通過(guò)操作系統(tǒng)發(fā)送的消息來(lái)處理用戶(hù)輸入 在Windows操作系統(tǒng)環(huán)境內(nèi) 系統(tǒng)產(chǎn)生的動(dòng)作 用戶(hù)運(yùn)行應(yīng)用程序產(chǎn)生的動(dòng)作,事件產(chǎn)生的消息,消息驅(qū)動(dòng)機(jī)制,Windows程序 接收消息 分發(fā)消息 處理消息,與用戶(hù)進(jìn)行交互,消息的分類(lèi),窗口管理消息、初始化消

13、息、輸入消息、系統(tǒng)消息等。 VC定義不同的前綴用于消息宏定義識(shí)別消息類(lèi)型。 BM 按鈕消息 CB組合框消息 DM下壓按鈕控制消息 EM編輯框消息 LB列表框消息 WM窗口消息,不同消息類(lèi)型的取值范圍,Windows應(yīng)用程序常用消息,WM_LBUTTONDOWN WM_KEYDOWN WM_CREAT WM_CLOSE WM_DISTORY WM_QUIT WM_PAINT WM_CHAR WM_COMMAND,Windows應(yīng)用程序常用消息,窗口管理消息 初始化消息 輸入消息 系統(tǒng)消息 剪貼板消息 控制處理消息,控制通知消息 滾動(dòng)條通知消息 非用戶(hù)區(qū)消息 MDI消息 DDE消息 應(yīng)用程序自定義

14、的消息,消息的傳遞,Windows系統(tǒng)有一個(gè)存放消息的隊(duì)列。 每個(gè)應(yīng)用程序也有一個(gè)消息隊(duì)列。 Windows系統(tǒng)先將收到的消息存放在系統(tǒng)隊(duì)列中。 然后再分發(fā)到相應(yīng)的應(yīng)用程序隊(duì)列中。 應(yīng)用程序則從自身的隊(duì)列中獲取消息并進(jìn)行處理。,消息的傳遞,事件,事件,事件,系統(tǒng)消息隊(duì)列,應(yīng)用程序隊(duì)列,應(yīng)用程序隊(duì)列,應(yīng)用程序隊(duì)列,應(yīng)用程序,應(yīng)用程序,應(yīng)用程序,一個(gè)應(yīng)用程序隊(duì)列,Windows,Input Message,System Queue,Application Queue,WinMain (),Message Loop,Windows Function,兩個(gè)應(yīng)用程序隊(duì)列,Windows,Input Me

15、ssage,System Queue,Application Queue,Application Queue,WinMain (),Mesaage Loop,Windows Function,WinMain (),Mesaage Loop,Windows Function,結(jié)束一個(gè)應(yīng)用程序,WM_DESTROY,Windows,WM_QUIT,Application Queue,Windows Function,Application,WinMain(),Message Loop,創(chuàng)建消息循環(huán),Windows程序至少包含兩個(gè)函數(shù): WinMain ( ) : 必有且僅有一個(gè) 窗口函數(shù) : 每個(gè)

16、窗口對(duì)應(yīng)一個(gè)窗口函數(shù),以響應(yīng)該窗口的消息 通常每個(gè)Windows 應(yīng)用程序至少對(duì)應(yīng)一個(gè)窗口,每個(gè)窗口都要有一個(gè)窗口函數(shù)負(fù)責(zé)處理該窗口內(nèi)所發(fā)生的事件,創(chuàng)建消息循環(huán),While (GetMessage( / 將消息發(fā)送給窗口過(guò)程, 例程中指WndProc 何時(shí)退出 ? / 當(dāng)從應(yīng)用程序消息隊(duì)列中檢取的消息是 / WM_QUIT時(shí),則退出循環(huán),投遞和發(fā)送消息,PostMessage和SendMessage PostMessage只把消息放入隊(duì)列,不管其他程序是否處理都返回,然后繼續(xù)執(zhí)行 這是個(gè)異步消息投放函數(shù),會(huì)造成消息的滯后性 SendMessage必須等待其他程序處理消息完了之后才返回,繼續(xù)執(zhí)行

17、 這是個(gè)同步消息投放函數(shù),不會(huì)造成消息的滯后性 但如果消息處理失敗,則會(huì)造成程序停止 PostMessage的返回值表示PostMessage函數(shù)執(zhí)行是否正確 SendMessage的返回值表示其他程序處理消息后的返回值,投遞和發(fā)送消息圖示,Windows,System Queue,Application Queue,WinMain (),Mesaage Loop,Windows Function,PostMessage( ),SendMessage( ),Application,投遞和發(fā)送消息示例,PostQuitMessage(nExitCode) 功能: 發(fā)送WM_QUIT消息給系統(tǒng),

18、以通知系統(tǒng)應(yīng)用程序要結(jié)束。 WM_QUIT消息只能用PostMessage,因?yàn)樵撓?dǎo)致應(yīng)用程序釋放消息環(huán),也就無(wú)法返回結(jié)果 。 SendDlgItemMessage( ) 功能: 向?qū)υ?huà)框控件發(fā)送消息 相當(dāng)于先用GetDlgItem()得到控件句柄,再 SendMessage(),是一種組合的方便方式。,VC6.0下三種編程方式,控制臺(tái)編程(DOS編程) Win32 Console Application Windows API編程: Win32 Application MFC編程: MFC AppWizard(exe),Visual C+開(kāi)發(fā)環(huán)境,標(biāo)題欄,菜單欄,工具欄,項(xiàng)目工作區(qū)窗口

19、,文檔窗口,工具欄,輸出窗口,輸出窗口標(biāo)簽,狀態(tài)欄,開(kāi)發(fā)環(huán)境的菜單功能,File菜單中的命令主要用來(lái)對(duì)文件和項(xiàng)目進(jìn)行操作 Edit菜單中的命令是用來(lái)使用戶(hù)便捷地編輯文件內(nèi)容 View菜單中的命令主要用來(lái)改變窗口和工具欄的顯示方式,激活調(diào)試時(shí)所用的各個(gè)窗口等 Insert菜單中的命令主要用于項(xiàng)目及資源的創(chuàng)建和添加,開(kāi)發(fā)環(huán)境的菜單功能,Project菜單中的命令主要用于項(xiàng)目的一些操作 Build菜單中的命令主要用來(lái)應(yīng)用程序的編譯、連接、調(diào)試、運(yùn)行 Tools菜單中的命令主要用于選擇或定制開(kāi)發(fā)環(huán)境中的一些實(shí)用工具 Windows菜單中的命令主要用于文檔窗口的操作 Visual C+ 提供了大量詳細(xì)的

20、幫助信息,MFC,API,控制臺(tái)(DOS),File菜單,VC6.0可以創(chuàng)建的項(xiàng)目類(lèi)型,開(kāi)發(fā)環(huán)境的工具欄,標(biāo)準(zhǔn)工具欄 類(lèi)向?qū)Чぞ邫?小型編譯連接工具欄 工具欄的顯示與隱藏、浮動(dòng)與停泊 “Customize”對(duì)話(huà)框方式(Tools-Customize) 快捷菜單方式(任何工具欄處右擊鼠標(biāo)),2.1 Windows程序結(jié)構(gòu),1,2.1.1 簡(jiǎn)單的Windows應(yīng)用程序,實(shí)例創(chuàng)建(演示) 用AppWizard創(chuàng)建 理解程序框架 添加程序代碼 編譯運(yùn)行,2.1.1 簡(jiǎn)單的Windows應(yīng)用程序,例Ex_HelloMsg:一個(gè)最簡(jiǎn)單的Windows應(yīng)用程序。 #include int WINAPI Wi

21、nMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) MessageBox (NULL, 你好,我的Visual C+世界!, 問(wèn)候, 0) ; return 0 ; ,2.1.1 簡(jiǎn)單的Windows應(yīng)用程序,Windows程序的入口函數(shù)WinMain函數(shù)的原型如下: int WINAPI WinMain ( HINSTANCE hInstance, / 當(dāng)前實(shí)例句柄 HINSTANCE hPrevInstance, / 以前的實(shí)例句柄 LPSTR lpCmdLine, / 指向命

22、令行參數(shù)的指針 int nCmdS ) / 窗口的顯示狀態(tài),每一個(gè)Win32應(yīng)用程序都需要Windows.h頭文件,包含了一些Windows頭文件。 程序中,MessageBox是一個(gè)Win32 API函數(shù),用來(lái)彈出一個(gè)對(duì)話(huà)框窗口,顯示短信息。,窗口的創(chuàng)建,創(chuàng)建一個(gè)完整的窗口需要經(jīng)過(guò)下面四個(gè)操作步驟: 設(shè)計(jì)一個(gè)窗口類(lèi); 注冊(cè)窗口類(lèi); 創(chuàng)建窗口; 顯示及更新窗口。,設(shè)計(jì)窗口類(lèi),typedef struct _WNDCLASS UINT style; /窗口類(lèi)的類(lèi)型 WNDPROClpfnWndProc; /過(guò)程函數(shù) int cbClsExtra; int cbWndExtra; HANDLE h

23、Instance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS;,窗口類(lèi)的類(lèi)型,在我們的程序中經(jīng)常要用到一類(lèi)變量,這個(gè)變量里的每一位都對(duì)應(yīng)某一種特性。當(dāng)該變量的某位為1時(shí),表示有該位對(duì)應(yīng)的那種特性,當(dāng)該位為0時(shí),即沒(méi)有該位所對(duì)應(yīng)的特性。當(dāng)變量中的某幾位同時(shí)為1時(shí),就表示同時(shí)具有幾種特性的組合。 一個(gè)變量中的哪一位代表哪種意義,不容易記憶,所以我們經(jīng)常根據(jù)特征的英文拼寫(xiě)的大寫(xiě)去定義一些宏,該宏所對(duì)應(yīng)的數(shù)值中僅有與該特征相對(duì)應(yīng)的那一

24、位(bit)為1,其余的bit都為0。,我們使用goto definition就能發(fā)現(xiàn) CS_VREDRAW=0 x0001,CS_HREDRAW=0 x0002, CS_DBLCLKS =0 x0008,CS_NOCLOSE =0 x0200。 他們的共同點(diǎn)就是只有一位為1,其余位都為0。 如果我們希望某一變量的數(shù)值既有CS_VREDRAW特性,又有CS_HREDRAW特性?我們只需使用二進(jìn)制OR(|)操作符將他們進(jìn)行或運(yùn)算相組合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我們希望在某一變量原有的幾個(gè)特征上去掉其中一個(gè)特征,用取反()之后再進(jìn)

25、行與( WinMain函數(shù)通常要完成以下幾步工作: 定義并調(diào)用API函數(shù)RegisterClass注冊(cè)應(yīng)用程序的窗口類(lèi)。 調(diào)用相關(guān)API函數(shù)創(chuàng)建和顯示窗口,并進(jìn)行必要的初始化處理。其中,函數(shù)CreateWindow用來(lái)創(chuàng)建已注冊(cè)窗口類(lèi)的窗口。,CreateWindow函數(shù)的原型:,HWND CreateWindow( LPCTSTR lpClassName, / 已注冊(cè)的窗口類(lèi)名 LPCTSTR lpWindowName, / 窗口標(biāo)題 DWORD dwStyle, / 窗口風(fēng)格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nWidth, / 窗口寬度 int

26、nHeight, / 窗口高度 HWND hWndParent, / 父窗口句柄 HMENU hMenu, / 菜單句柄或控件標(biāo)識(shí) HINSTANCE hInstance, / 應(yīng)用程序?qū)嵗浔?LPVOID lpParam / 其他窗口創(chuàng)建時(shí)的參數(shù)數(shù)據(jù));,2.1.1 簡(jiǎn)單的Windows應(yīng)用程序,創(chuàng)建和啟動(dòng)應(yīng)用程序的消息循環(huán)。Windows應(yīng)用程序接受各種不同的消息,Windows系統(tǒng)首先將消息放入消息隊(duì)列中,應(yīng)用程序的消息循環(huán)就是從應(yīng)用程序的消息隊(duì)列中消息,并將消息發(fā)送相應(yīng)的客串過(guò)程函數(shù)中作進(jìn)一步處理。API函數(shù)GetMessage 和DispatchMessage就是起到這樣的作用。

27、如果接收到WM_QUIT消息,則退出應(yīng)用程序。,Windows應(yīng)用程序的基本流程:,2.1.2 Windows編程特點(diǎn),一個(gè)完整的Windows應(yīng)用程序除了WinMain函數(shù)外,還包含用于處理用戶(hù)動(dòng)作和窗口消息的窗口函數(shù)。 Windows應(yīng)用程序具有的一些特性:,消息驅(qū)動(dòng)機(jī)制 圖形設(shè)備接口(GDI) 基于資源的程序設(shè)計(jì) 動(dòng)態(tài)鏈接庫(kù),1. 消息驅(qū)動(dòng)機(jī)制 Windows程序和控制臺(tái)應(yīng)用程序之間一個(gè)最根本區(qū)別,在于控制臺(tái)應(yīng)用程序是通過(guò)調(diào)用系統(tǒng)函數(shù)來(lái)獲得用戶(hù)輸入,而Windows程序則是通過(guò)系統(tǒng)發(fā)送的消息來(lái)處理用戶(hù)輸入。 2. 圖形設(shè)備接口(GDI) Windows提供了一個(gè)抽象的接口,稱(chēng)為圖形設(shè)備接

28、口(Graphical Device Interface,GDI),使得用戶(hù)直接利用系統(tǒng)的GDI函數(shù)就能方便實(shí)現(xiàn)圖形和文本的輸出,而不必關(guān)心與系統(tǒng)相連的外部設(shè)備的類(lèi)型。,2.1.2 Windows編程特點(diǎn),2.1.2 Windows編程特點(diǎn),3. 基于資源的程序設(shè)計(jì) Windows應(yīng)用程序包含眾多圖形元素,如光標(biāo)、菜單、工具欄、位圖、對(duì)話(huà)框等,每一個(gè)這樣的資源都用相應(yīng)的標(biāo)識(shí)符來(lái)區(qū)分,而且Windows內(nèi)部也有預(yù)定義的資源。在Windows環(huán)境下,每一個(gè)資源元素都作為一種可以裝入應(yīng)用程序的資源來(lái)存放,這些資源可以被編輯、修改,也可以被其他應(yīng)用程序所共享。 4. 動(dòng)態(tài)鏈接庫(kù) 動(dòng)態(tài)鏈接庫(kù)提供了一些特

29、定結(jié)構(gòu)的函數(shù),能被應(yīng)用程序在運(yùn)行過(guò)程中裝入和連接。多個(gè)程序可以共享同一個(gè)動(dòng)態(tài)鏈接庫(kù),動(dòng)態(tài)鏈接庫(kù)可以提高程序模塊的靈活性。,Windows提供了豐富的應(yīng)用程序可調(diào)用的函數(shù),大多數(shù)用于實(shí)現(xiàn)其用戶(hù)界面和在屏幕顯示的文本和圖形,都是通過(guò)動(dòng)態(tài)鏈接庫(kù)來(lái)實(shí)現(xiàn)的。 在Windows操作系統(tǒng)中,最主要的DLL有KERNEL32.DLL、GDI32.DLL和USER32.DLL。 KERNEL32.DLL用來(lái)處理存儲(chǔ)器低層功能、任務(wù)和資源管理等Windows核心服務(wù);GDI32.DLL提供圖形設(shè)備接口,管理用戶(hù)界面和圖形繪制,包括Windows元文件、位圖、設(shè)備描述表和字體等; USER32.DLL負(fù)責(zé)窗口的管理

30、,包括消息、菜單、光標(biāo)、計(jì)時(shí)器及其它與控制窗口顯示相關(guān)的一些功能。,2.1.2 Windows編程特點(diǎn),2.1.3 Windows常用的基本數(shù)據(jù)類(lèi)型,2.1.3 Windows基本數(shù)據(jù)類(lèi)型,說(shuō)明: 這些基本數(shù)據(jù)類(lèi)型都是用大寫(xiě)字符來(lái)表示,以與一般C+基本數(shù)據(jù)類(lèi)型相區(qū)別。 數(shù)據(jù)類(lèi)型的前綴是P或LP,表示是一個(gè)指針或長(zhǎng)指針數(shù)據(jù)類(lèi)型。前綴是U,表示無(wú)符號(hào)數(shù)據(jù)類(lèi)型,等等。 Windows還提供一些宏來(lái)處理上述基本數(shù)據(jù)類(lèi)型。,2.2 Windows簡(jiǎn)單編程,2,2.2.1 繪制文本,Windows窗口通常有標(biāo)題欄和邊框,其中默認(rèn)背景色為白色區(qū)域稱(chēng)為窗口的客戶(hù)區(qū)。當(dāng)客戶(hù)區(qū)內(nèi)容發(fā)生變化時(shí),此時(shí)客戶(hù)區(qū)變成了“無(wú)

31、效區(qū)域”或“更新區(qū)域”,Windows就會(huì)將WM_PAINT消息放在應(yīng)用程序的消息隊(duì)列中,通過(guò)在窗口過(guò)程函數(shù)中對(duì)WM_PAINT消息的判斷處理,就可對(duì)客戶(hù)區(qū)進(jìn)行圖形和文本的繪制。,例Ex_WinText 文本繪制,2.2.1 繪制文本,TextOut函數(shù)是用來(lái)顯示文本的最常用的GDI函數(shù),有下列原型:,case WM_PAINT: hdc = BeginPaint(hwnd, 繪制文本時(shí)需要先調(diào)用BeginPaint函數(shù),用來(lái)返回指定窗口句柄的設(shè)備描述表句柄,設(shè)備描述表用來(lái)將程序與計(jì)算機(jī)外部輸出設(shè)備連接起來(lái)。 hdc定義的是句柄HDC變量,TextOut等GDI函數(shù)都要通過(guò)這樣的HDC句柄來(lái)繪

32、制圖形和文本。 EndPaint用來(lái)釋放設(shè)備描述表句柄,并使先前無(wú)效區(qū)域變?yōu)橛行?,從而使Windows不再發(fā)送WM_PAINT消息。,2.2.1 繪制文本,PAINTSTRUCT是“繪圖信息結(jié)構(gòu)”,BeginPaint和EndPaint函數(shù)都需要PAINTSTRUCT結(jié)構(gòu)變量作為自己的參數(shù)。 BeginPaint和EndPaint函數(shù)必須成對(duì)出現(xiàn),所有GDI函數(shù)的調(diào)用也應(yīng)在這兩個(gè)函數(shù)之間進(jìn)行。 TextOut函數(shù)是用來(lái)顯示文本的最常用的GDI函數(shù),原型如下: BOOL TextOut( HDC hdc, / 設(shè)備描述表句柄 int nXStart, / 文本顯示的水平起始位置 int nYSt

33、art, / 文本顯示的垂直起始位置 LPCTSTR lpString, / 要顯示的文本 int cbString / 要顯示的文本長(zhǎng)度,2.2.2 使用控件,控件是在系統(tǒng)內(nèi)部定義的用于和用戶(hù)交互的基本單元,它常用于對(duì)話(huà)框中。在Win32應(yīng)用程序中,可在窗口基礎(chǔ)上通過(guò)CreateWindow函數(shù)來(lái)創(chuàng)建一個(gè)控件窗口。,例Ex_WinControl 控件的使用 (P38),2.3 MFC編程基礎(chǔ),3,2.3.1 MFC概述,為了幫助用戶(hù)處理那些經(jīng)常使用且復(fù)雜繁瑣的各種Windows操作,Visual C+設(shè)計(jì)了一套基礎(chǔ)類(lèi)庫(kù)MFC(Microsoft Foundation Library)。MFC

34、把傳統(tǒng)的Windows編程規(guī)范中的大多數(shù)內(nèi)容封裝成為各種類(lèi),提高了編程和代碼效率。,MFC類(lèi)的基本層次結(jié)構(gòu),2.3.2 設(shè)計(jì)一個(gè)MFC程序,例Ex_HelloMFC 一個(gè)MFC應(yīng)用程序。 (1) 創(chuàng)建一個(gè)“An empty project”類(lèi)型的Win32 Application(Win32 應(yīng)用程序)項(xiàng)目Ex_HelloMFC。 (2) 選擇“文件”“新建”。 (3)建立C+ Source File文件,并輸入代碼 。,(4) 選擇“工程”“設(shè)置”菜單命令,在出現(xiàn)的對(duì)話(huà)框中選擇“General”標(biāo)簽。然后在“Microsoft Foundation Classes”組合框中,選擇“Use M

35、FC in a Shared DLL”。單擊OK按鈕。 (5) 程序運(yùn)行后,單擊鼠標(biāo)左鍵,就會(huì)彈出一個(gè)對(duì)話(huà)框,結(jié)果同Ex_HelloWin。,2.3.3 理解程序代碼,1. 程序運(yùn)行機(jī)制 MFC是使用afxwin.h來(lái)代替頭文件windows.h,在Ex_HelloMFC程序中看不到Windows應(yīng)用程序所必須的程序入口函數(shù)WinMain,因?yàn)镸FC將它隱藏在應(yīng)用程序框架內(nèi)部了。當(dāng)用戶(hù)運(yùn)行應(yīng)用程序時(shí),Windows會(huì)自動(dòng)調(diào)用應(yīng)用程序框架內(nèi)部的WinMain函數(shù),并自動(dòng)查找該應(yīng)用程序類(lèi)CHelloApp的全局變量theApp,然后自動(dòng)調(diào)用CHelloApp的虛函數(shù)InitInstance,該函數(shù)

36、會(huì)進(jìn)一步調(diào)用相應(yīng)的函數(shù)來(lái)完成主窗口的構(gòu)造和顯示工作。,首先執(zhí)行的是: m_pMainWnd = new CMainFrame(); 該語(yǔ)句用來(lái)創(chuàng)建從CFrameWnd類(lèi)派生而來(lái)的用戶(hù)框架窗口CMainFrame類(lèi)對(duì)象,繼而調(diào)用該類(lèi)的構(gòu)造函數(shù),使得Create函數(shù)被調(diào)用,完成窗口的創(chuàng)建工作。 然后執(zhí)行后面兩句,用作窗口的顯示和更新。 m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); 最后返回TRUE,表示窗口創(chuàng)建成功。,InitInstance的執(zhí)行過(guò)程:,2.3.3 理解程序代碼,應(yīng)用程序類(lèi)CWinApp是用來(lái)調(diào)用Win

37、Main以及進(jìn)行實(shí)例的初始化,在每個(gè)MFC應(yīng)用程序中有且只能有一個(gè)這樣的應(yīng)用程序類(lèi),且需要一個(gè)全局的對(duì)象實(shí)例,如theApp。 InitInstance完成初始化工作后,接下來(lái)調(diào)用基類(lèi)CWinApp的成員函數(shù)Run,執(zhí)行應(yīng)用程序的消息循環(huán),即重復(fù)執(zhí)行接收消息并轉(zhuǎn)發(fā)消息的工作。當(dāng)Run檢查到消息隊(duì)列為空時(shí),將調(diào)用基類(lèi)CWinApp的成員函數(shù)OnIdle進(jìn)行空閑時(shí)的后臺(tái)處理工作。若消息隊(duì)列為空且又沒(méi)有后臺(tái)工作要處理時(shí),則應(yīng)用程序一直處理等待狀態(tài),一直等到有消息為止。當(dāng)程序結(jié)束時(shí),調(diào)用基類(lèi)CWinApp的成員函數(shù)ExitInstance,完成終止應(yīng)用程序的收尾工作。,2.3.3 理解程序代碼,2.

38、消息映射(Message Map) 在MFC中,一個(gè)消息的處理往往是通過(guò)獨(dú)特的MFC映射機(jī)制來(lái)進(jìn)行的。 消息映射機(jī)制指MFC類(lèi)中將消息與消息處理函數(shù)聯(lián)系起來(lái),一一對(duì)應(yīng)的機(jī)制。這種機(jī)制使得應(yīng)用程序處理消息變得更方便、更直接、更緊湊。在MFC中,任何一個(gè)從CCmdTarget類(lèi)派生的類(lèi)理論上均可處理消息,且都有相應(yīng)的消息映射函數(shù)。,2.3.3 理解程序代碼,映射一個(gè)消息的過(guò)程是由三個(gè)部分組成的: (1) 在處理消息的類(lèi)中,使用消息宏DECLARE_MESSAGE_MAP() 聲明對(duì)消息映射的支持,并在該宏之前聲明消息處理函數(shù)。 如: protected: Afx_msg void OnLButto

39、nDown(UINT nFlags,CPoint point); DECLARE_MESSAGE_MAP(),(2) 使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在類(lèi)聲明之后的地方定義該類(lèi)支持的消息映射入口點(diǎn),所有消息映射宏都添加在這里,當(dāng)然不同的消息MFC都會(huì)有不同的消息映射宏。如: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP,2.3.3 理解程序代碼,(3) 定義消息處理函數(shù)。例如: void CMainFrame:OnLButtonDown(UINT nFlags, CPoint point

40、) MessageBox (你好,我的Visual C+世界!, 問(wèn)候, 0) ; CFrameWnd:OnLButtonDown(nFlags, point); 注:為了使消息能被其他對(duì)象接收并處理,在函數(shù)中常常需要調(diào)用基類(lèi)中的相關(guān)消息處理函數(shù)。,2.3.3 理解程序代碼,2.3.4 使用MFC AppWizard,表2.2 MFC AppWizard創(chuàng)建的應(yīng)用程序類(lèi)型,MFC AppWinzard(exe)應(yīng)用程序類(lèi)型,單文檔應(yīng)用程序:類(lèi)似于Windows記事本的程序,功能比較簡(jiǎn)單,復(fù)雜程序適中,每次只能打開(kāi)和處理一個(gè)文檔。大多數(shù)應(yīng)用程序的編制都是從單文檔程序框架開(kāi)始的。 對(duì)話(huà)框應(yīng)用程序:

41、最簡(jiǎn)單、最緊湊,沒(méi)有菜單、工具欄和狀態(tài)欄,也不能處理文檔,但速度快,代碼少。 多文檔應(yīng)用程序:能允許同時(shí)打開(kāi)和處理多個(gè)文檔,相對(duì)于單文檔,增加了許多功能,因而也需要大量額外的編程工作,如不僅需要跟蹤所有打開(kāi)文檔的路徑,還需要管理各文檔窗口的顯示和更新等。,其它,項(xiàng)目和項(xiàng)目工作區(qū)目錄結(jié)構(gòu),在VC中,項(xiàng)目中所有的源文件都是采用文件夾的方式進(jìn)行管理的 將項(xiàng)目名作為文件夾名,在此文件夾下包含源程序代碼文件(.cpp,.h)、項(xiàng)目文件(.dsp)以及項(xiàng)目工作區(qū)文件(.dsw)等 下面列出了其他一些文件類(lèi)型的的含義: .opt 關(guān)于開(kāi)發(fā)環(huán)境的參數(shù)文件如工具條位置等信息 .aps(AppStudio Fil

42、e) 資源輔助文件,二進(jìn)制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudio Project) 項(xiàng)目文件 .plg 編譯信息文件 .hpj(Help Project)幫助文件項(xiàng)目,項(xiàng)目和項(xiàng)目工作區(qū)目錄結(jié)構(gòu),.mdp(Microsoft DevStudio Project)舊版本的項(xiàng)目文件 .bsc 用于瀏覽項(xiàng)目信息 .map 執(zhí)行文件的映像信息紀(jì)錄文件 .pch(Pre-Compiled File)預(yù)編譯文件,可以加快編譯速度,但是文件非常大 .pdb(Program Database)記錄程序有關(guān)的一些數(shù)據(jù)和調(diào)試信息 .exp 記錄DLL文件中的一些信息

43、,只有在編譯DLL才會(huì)生成 .ncb 無(wú)編譯瀏覽文件(no compile browser),項(xiàng)目和項(xiàng)目工作區(qū)目錄結(jié)構(gòu),還有相應(yīng)的Debug或Release、Res等子文件夾 VC應(yīng)用程序向?qū)?chuàng)建項(xiàng)目時(shí),系統(tǒng)會(huì)自動(dòng)為項(xiàng)目創(chuàng)建Win32 Debug的運(yùn)行程序,并使用相應(yīng)的缺省配置 Win32 Release版本的區(qū)別在于 Debug版本的運(yùn)行程序有相應(yīng)的調(diào)試信息碼 Release版本的運(yùn)行程序沒(méi)有 Release版本的運(yùn)行程序經(jīng)過(guò)代碼的優(yōu)化,其程序的運(yùn)行速度被最大加速,項(xiàng)目和項(xiàng)目工作區(qū),在開(kāi)發(fā)環(huán)境中,VC是通過(guò)左邊的項(xiàng)目工作區(qū)窗口來(lái)對(duì)項(xiàng)目進(jìn)行各種管理 項(xiàng)目工作區(qū)窗口包含三個(gè)頁(yè)面 ClassVie

44、w頁(yè) ResourceView頁(yè) FileView頁(yè),項(xiàng)目和項(xiàng)目工作區(qū),ClassView頁(yè) 用以顯示項(xiàng)目中的所有的類(lèi)信息 假設(shè)打開(kāi)的項(xiàng)目名為Ex_Sdi,單擊項(xiàng)目區(qū)窗口底部的ClassView,則顯示出“Ex_Sdi classes”的樹(shù)狀結(jié)點(diǎn)。 在它的前面是一個(gè)圖標(biāo)和一個(gè)套在方框中的符號(hào)“+”,單擊符號(hào)“+”或雙擊圖標(biāo),Ex_Sdi中的所有類(lèi)名將被顯示。 如CMainFrame、CEx_SdiApp、CEx_SdiDoc、CEx_SdiView等,項(xiàng)目和項(xiàng)目工作區(qū),ResourceView頁(yè) 包含了項(xiàng)目中所有資源的層次列表。每一種資源都有自己使用的圖標(biāo) 。 FileView頁(yè) FileView可將項(xiàng)目中的所有文件分類(lèi)顯示。 每一類(lèi)文件在FileView頁(yè)面中都有自己的目錄項(xiàng)(節(jié)點(diǎn))。可以在目錄項(xiàng)中移動(dòng)文件,還可以創(chuàng)建新的目錄項(xiàng)以及將一些特殊類(lèi)型的文件放在該目錄項(xiàng)中。 創(chuàng)建一個(gè)新目錄項(xiàng),可在添加目錄項(xiàng)的地方右擊,選擇“New Folder”,輸入目錄項(xiàng)名稱(chēng)和相關(guān)的文件擴(kuò)展名,單擊“OK

溫馨提示

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

評(píng)論

0/150

提交評(píng)論