VisualC環(huán)境下Windows程序開(kāi)發(fā)概述課件_第1頁(yè)
VisualC環(huán)境下Windows程序開(kāi)發(fā)概述課件_第2頁(yè)
VisualC環(huán)境下Windows程序開(kāi)發(fā)概述課件_第3頁(yè)
VisualC環(huán)境下Windows程序開(kāi)發(fā)概述課件_第4頁(yè)
VisualC環(huán)境下Windows程序開(kāi)發(fā)概述課件_第5頁(yè)
已閱讀5頁(yè),還剩115頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第12章

VisualC++環(huán)境下Windows程序開(kāi)發(fā)概述12.1VisualC++可視化集成開(kāi)發(fā)環(huán)境12.2創(chuàng)建、組織文件、工程和工作區(qū)12.3Windows編程基礎(chǔ)12.4Win32開(kāi)發(fā)12.5MFC編程第12章VisualC++環(huán)境下Windows程序開(kāi)發(fā)112.1VisualC++可視化集成開(kāi)發(fā)環(huán)境12.1.1VisualC++簡(jiǎn)介12.1.2項(xiàng)目開(kāi)發(fā)過(guò)程12.1.3集成開(kāi)發(fā)環(huán)境DeveloperStudio12.1.4常用功能鍵及其意義返回首頁(yè)12.1VisualC++可視化集成開(kāi)發(fā)環(huán)境.1VisualC++簡(jiǎn)介1.VisualC++集成開(kāi)發(fā)環(huán)境(IDE)集成開(kāi)發(fā)環(huán)境(IDE)是一個(gè)將程序編輯器、編譯器、調(diào)試工具和其他建立應(yīng)用程序的工具集成在一起的用于開(kāi)發(fā)應(yīng)用程序的軟件系統(tǒng)。

2.向?qū)В╓izard)向?qū)且粋€(gè)通過(guò)一步步的幫助引導(dǎo)你工作的工具。DeveloperStudio中包含三個(gè)向?qū)А?/p>

3.MFC庫(kù)庫(kù)(library)是可以重復(fù)使用的源代碼和目標(biāo)代碼的集合。MFC(MicrosoftFundamentalClasses)是VisualC++開(kāi)發(fā)環(huán)境所帶的類庫(kù),在該類庫(kù)中提供了大量的類,可以幫助開(kāi)發(fā)人員快速建立應(yīng)用程序。

返回本節(jié)12.1.1VisualC++簡(jiǎn)介1.VisualC312.1.2項(xiàng)目開(kāi)發(fā)過(guò)程一個(gè)用C++開(kāi)發(fā)項(xiàng)目的通用開(kāi)發(fā)過(guò)程如圖12-1所示。12.1.2項(xiàng)目開(kāi)發(fā)過(guò)程一個(gè)用C++開(kāi)發(fā)項(xiàng)目的通用開(kāi)發(fā)過(guò)4建立一個(gè)項(xiàng)目的第一步是利用編輯器建立程序代碼文件,包括頭文件、代碼文件、資源文件等。然后,啟動(dòng)編譯程序,編譯程序首先調(diào)用預(yù)處理程序處理程序中的預(yù)處理命令(如#include,#define等),經(jīng)過(guò)預(yù)處理程序處理的代碼將作為編譯程序的輸入。編譯對(duì)用戶程序進(jìn)行詞法和語(yǔ)法分析,建立目標(biāo)文件,文件中包括機(jī)器代碼、連接指令、外部引用以及從該源文件中產(chǎn)生的函數(shù)和數(shù)據(jù)名。此后,連接程序?qū)⑺械哪繕?biāo)代碼和用到的靜態(tài)連接庫(kù)的代碼連接起來(lái),為所有的外部變量和函數(shù)找到其提供地點(diǎn),最后產(chǎn)生一個(gè)可執(zhí)行文件。一般有一個(gè)makefile文件來(lái)協(xié)調(diào)各個(gè)部分產(chǎn)生可執(zhí)行文件。返回本節(jié)建立一個(gè)項(xiàng)目的第一步是利用編輯器建立程序代碼文件,包括頭文件512.1.3集成開(kāi)發(fā)環(huán)境DeveloperStudio1.進(jìn)入DeveloperStudio2.DeveloperStudio的界面3.獲得幫助信息4.VisualC++的編輯器12.1.3集成開(kāi)發(fā)環(huán)境DeveloperStudio6圖12-2DeveloperStudio界面圖12-2DeveloperStudio界面7DeveloperStudio它具有以下特點(diǎn):

(1)自動(dòng)語(yǔ)法。

(2)自動(dòng)縮進(jìn)。

(3)參數(shù)幫助。

(4)集成的關(guān)鍵字幫助。

(5)拖放編輯。

(6)自動(dòng)錯(cuò)誤定位。

返回本節(jié)DeveloperStudio它具有以下特點(diǎn):(1)自動(dòng)812.1.4常用功能鍵及其意義表12-1常用功能鍵12.1.4常用功能鍵及其意義表12-1常用功能鍵9返回本節(jié)返回本節(jié)1012.2創(chuàng)建、組織文件、工程和工作區(qū)12.2.1新建工程12.2.2新建工作區(qū)12.2.3增加已有文件到工程中12.2.4打開(kāi)工作區(qū)12.2.5設(shè)置當(dāng)前工程返回首頁(yè)12.2創(chuàng)建、組織文件、工程和工作區(qū)12.2.1新建1112.2.1新建工程項(xiàng)目工作區(qū)是一個(gè)包含用戶的所有相關(guān)項(xiàng)目和配置的實(shí)體。工程定義為一個(gè)配置和一組文件,用以生成最終的程序或二進(jìn)制文件。一個(gè)項(xiàng)目工作區(qū)可以包含多個(gè)工程,這些工程既可以是同一類型的工程,也可以是不同類型的工程(如VisualC++和VisualJ++工程)。工作區(qū)現(xiàn)在以.dsw為后綴名(以前為.mdp),項(xiàng)目文件現(xiàn)在以.dsp(以前為.mak)為后綴名。項(xiàng)目工作區(qū)如圖12-3所示。12.2.1新建工程項(xiàng)目工作區(qū)是一個(gè)包含用戶的所有相關(guān)項(xiàng)12圖12-3項(xiàng)目工作區(qū)圖12-3項(xiàng)目工作區(qū)13要新建一個(gè)工程,可以:(1)在File菜單上,單擊New,選擇Projects標(biāo)簽。(2)從列表中選擇項(xiàng)目類型(3)單擊CreateNewWorkspace(新建工作區(qū))或AddtoCurrentWorkspace(加入到當(dāng)前工作區(qū)中)。(4)要使新工程為子工程,可以選擇Dependencyof檢查框,并從列表中選擇一個(gè)工程。要新建一個(gè)工程,可以:14(5)在ProjectName框中,輸入新工程名,確保該名字必須與工作區(qū)中的別的工程名字不重名。(6)在Location框中,指定工程存放的目錄:可以直接輸入路徑名,也可以單擊旁邊的Browse按鈕,瀏覽選擇一個(gè)路徑。(7)單擊Platform框中的相應(yīng)檢查框,指定工程的開(kāi)發(fā)平臺(tái)返回本節(jié)(5)在ProjectName框中,輸入新工程名,確保該名1512.2.2新建工作區(qū)要?jiǎng)?chuàng)建一個(gè)空的工作區(qū),可以:

(1)在File菜單上,單擊New。(2)在隨后彈出的對(duì)話框上,單擊Workspace標(biāo)簽。(3)從類型列表中選擇BlankWorkspace。(4)在WorkspaceName框中輸入名字,注意名字不能與它將要包含的工程同名。(5)在Location框中指定存放工作區(qū)文件的目錄。(6)單擊OK。返回本節(jié)12.2.2新建工作區(qū)要?jiǎng)?chuàng)建一個(gè)空的工作區(qū),可以:返回1612.2.3增加已有文件到工程中(1)打開(kāi)包含目標(biāo)工程的項(xiàng)目工作區(qū)文件。(2)在Project菜單上,單擊AddtoProject,然后單擊Files。(3)在InsertFilesintoProject對(duì)話框中,瀏覽并定位要加入到工程中的文件名,然后選擇它們。(4)從InsertInto中選擇工程名字,然后單擊OK。返回本節(jié)12.2.3增加已有文件到工程中(1)打開(kāi)包含目標(biāo)工程的1712.2.4打開(kāi)工作區(qū)選擇File-OpenWorkspace,指定要打開(kāi)的工作區(qū);或選擇File-RecentWorkspaces,從最近打開(kāi)過(guò)的工作區(qū)列表中選擇一個(gè)。返回本節(jié)12.2.4打開(kāi)工作區(qū)選擇File-OpenWorks1812.2.5設(shè)置當(dāng)前工程選擇ProjectSetting,可以為當(dāng)前工程設(shè)置編譯、鏈接和C/C++等各種選項(xiàng)。

返回本節(jié)12.2.5設(shè)置當(dāng)前工程選擇ProjectSettin1912.3Windows編程基礎(chǔ)12.3.1WindowsAPI12.3.2Windows基礎(chǔ)12.3.3Windows消息映射和處理返回首頁(yè)12.3Windows編程基礎(chǔ)12.3.1Windo2012.3.1WindowsAPI1.WindowsAPI的定義WindowsAPI是應(yīng)用程序編程接口(ApplicationProgrammingInterface)的英文縮寫(xiě)。它是大量函數(shù)加上數(shù)字常量、宏、結(jié)構(gòu)、類型以及其他相關(guān)項(xiàng)的集合。2.WindowsAPI函數(shù)的分類根據(jù)WindowsAPI函數(shù)的功能,可以將其分為三類:(1)窗口管理函數(shù)。用以實(shí)現(xiàn)窗口的創(chuàng)建、移動(dòng)和修改功能。(2)圖形設(shè)備(GUI)函數(shù)。用以實(shí)現(xiàn)與設(shè)備無(wú)關(guān)的圖形操作功能。(3)系統(tǒng)服務(wù)函數(shù)。用以實(shí)現(xiàn)與操作系統(tǒng)有關(guān)的多種功能。返回本節(jié)12.3.1WindowsAPI1.WindowsA2112.3.2Windows基礎(chǔ)1.事件

事件以如下三種方式產(chǎn)生:(1)通過(guò)輸入設(shè)備,如鍵盤(pán)和鼠標(biāo)。(2)通過(guò)屏幕上的可視對(duì)象,如菜單、工具欄按鈕、滾動(dòng)條和對(duì)話框上的控件。(3)來(lái)自Windows內(nèi)部。2.消息但Windows捕獲一個(gè)事件后,它會(huì)編寫(xiě)一條消息,并將相關(guān)信息放入一個(gè)數(shù)據(jù)結(jié)構(gòu)中,然后將包含此數(shù)據(jù)結(jié)構(gòu)的消息發(fā)送給需要此消息的程序。Windows消息是在Windows文件中用宏定義的常數(shù)。消息常數(shù)名通常以WM開(kāi)頭,格式為WM_XXX。12.3.2Windows基礎(chǔ)1.事件223.繪圖及設(shè)備環(huán)境Windows具有圖形用戶界面(GUI),它包括菜單、工具欄、滾動(dòng)條和對(duì)話框中的按鈕等元素。4.對(duì)象與句柄對(duì)設(shè)備環(huán)境的訪問(wèn)是通過(guò)Windows返回的句柄進(jìn)行的。

5.坐標(biāo)系要為繪制和其他任務(wù)指定位置,需要坐標(biāo)系統(tǒng)。Windows提供了8種不同的坐標(biāo)系。

返回本節(jié)3.繪圖及設(shè)備環(huán)境返回本節(jié)2312.3.3Windows消息映射和處理開(kāi)始執(zhí)行在Windows中,管理消息的方式通常是這樣的:當(dāng)發(fā)生某個(gè)消息后,該消息進(jìn)入消息隊(duì)列,操作系統(tǒng)根據(jù)消息提供的信息決定由哪個(gè)應(yīng)用程序來(lái)處理,該應(yīng)用程序依照一定的方式查找應(yīng)用程序各個(gè)類的消息映射(一組宏,這些宏用來(lái)確定某個(gè)消息及相應(yīng)的處理程序的對(duì)應(yīng)關(guān)系),找到處理程序,然后由處理程序執(zhí)行。圖12-4是Windows程序和Windows消息的基本流程。12.3.3Windows消息映射和處理開(kāi)始執(zhí)行24圖12-4Windows程序和Windows消息處理的基本流程圖12-4Windows程序和Windows消息處理的基25Windows程序要處理的消息種類如下:(1)Windows消息。該類消息以WM_開(kāi)頭(WM_COMMAND例外),通常由窗口和視圖來(lái)處理。

(2)由控件和其他子窗口發(fā)送給父窗口的WM_COMMAND消息。這些消息中包括EN_CHANGE通知碼。(3)來(lái)自于用戶界面對(duì)象的WM_COMMAND消息。這些用戶界面對(duì)象包括菜單、工具欄按鈕和快捷鍵。返回本節(jié)Windows程序要處理的消息種類如下:(1)Windows2612.4Win32開(kāi)發(fā)12.4.1搶先式多任務(wù)和多線程12.4.2連續(xù)的地址空間和先進(jìn)的內(nèi)存管理12.4.3內(nèi)存映射文件12.4.4Win32s:Windows3.x對(duì)Win32API的支持12.4.5Win32編程基礎(chǔ)返回首頁(yè)12.4Win32開(kāi)發(fā)12.4.1搶先式多任務(wù)和多線27Win32可以應(yīng)用于特定的操作系統(tǒng),這種系統(tǒng)可以直接控制和處理PC硬件資源,而不必象Win16API那樣依賴于MS-DOS系統(tǒng)服務(wù)。然而,Win32不是簡(jiǎn)單的由Win16從16位到32位的升級(jí),更重要的在于它支持:

(1)高性能的搶先式多任務(wù)和多線程;(2)連續(xù)的32位地址空間和先進(jìn)的內(nèi)存管理;(3)對(duì)所有的可為進(jìn)程共享的對(duì)象,解決了它的安全性問(wèn)題;(4)內(nèi)存映射文件;

Win32可以應(yīng)用于特定的操作系統(tǒng),這種系統(tǒng)可以直接控制和處2812.4.1搶先式多任務(wù)和多線程Windows是一個(gè)多任務(wù)操作系統(tǒng),它提供了一次運(yùn)行多個(gè)應(yīng)用程序的能力。

Windows3.x的多任務(wù)是一種由協(xié)作、軟件方式產(chǎn)生的有限的非搶先式的多任務(wù)。

Windows95的多任務(wù)是一種搶先式多任務(wù)。在搶先式多任務(wù)操作系統(tǒng)中,系統(tǒng)在運(yùn)行的所有進(jìn)程之間對(duì)CPU時(shí)間進(jìn)行共享,從而保證每個(gè)進(jìn)程都能頻繁的訪問(wèn)處理器,并且實(shí)現(xiàn)指令的連續(xù)執(zhí)行。這樣,每個(gè)Win32進(jìn)程都需要分配一個(gè)優(yōu)先級(jí),系統(tǒng)調(diào)度程序利用這種優(yōu)先級(jí)來(lái)決定哪一時(shí)刻。12.4.1搶先式多任務(wù)和多線程Windows是一個(gè)多任29一個(gè)線程處于以下三種狀態(tài)之一:正在執(zhí)行,掛起,準(zhǔn)備運(yùn)行。在單處理器環(huán)境下(如Windows95),同一時(shí)刻只能運(yùn)行一個(gè)線程。為了在Win32中支持多線程進(jìn)程結(jié)構(gòu),Win32在原來(lái)Win16基礎(chǔ)上增加了:(1)對(duì)進(jìn)程以及線程創(chuàng)建、操縱的支持;(2)對(duì)一個(gè)進(jìn)程內(nèi)線程之間的同步和同步對(duì)象的支持;(3)一個(gè)統(tǒng)一的共享機(jī)制。返回本節(jié)一個(gè)線程處于以下三種狀態(tài)之一:正在執(zhí)行,掛起,準(zhǔn)備運(yùn)行。在單3012.4.2連續(xù)的地址空間和先進(jìn)的內(nèi)存管理(1)申請(qǐng)一塊可移動(dòng)的內(nèi)存塊。

(2)鎖定該內(nèi)存塊。因?yàn)閃indows引入了虛擬內(nèi)存管理,可以把內(nèi)存塊移動(dòng)到硬盤(pán)交換文件中,所以在使用內(nèi)存塊之前,必須將它鎖定在真正的內(nèi)存RAM之中,也就是告訴操作系統(tǒng),現(xiàn)在這塊內(nèi)存暫時(shí)由應(yīng)用程序來(lái)管理。

(3)對(duì)該內(nèi)存塊進(jìn)行各種操作:如復(fù)制數(shù)據(jù)到內(nèi)存塊。

(4)解鎖內(nèi)存,應(yīng)用程序?qū)?duì)該內(nèi)存的控制交予Windows。

12.4.2連續(xù)的地址空間和先進(jìn)的內(nèi)存管理(1)申請(qǐng)一塊31下面給出一個(gè)程序片段,來(lái)說(shuō)明內(nèi)存管理函數(shù)的用法。HGLOBALmemHandle;//內(nèi)存句柄charfar*lpMem;//假設(shè)長(zhǎng)度為memLenmemHandle=GlobalAlloc(GHND,memLen+1);//申請(qǐng)內(nèi)存塊,此處未做返回結(jié)果檢查,//事實(shí)上,申請(qǐng)內(nèi)存有時(shí)會(huì)失敗memcpy(lpMem,string,textLen);//拷貝數(shù)據(jù),其中string為一字符串變量,textLen

//是這個(gè)字符串的長(zhǎng)度GlobalUnlock(memHandle);//解鎖內(nèi)存...GlobalFree((HGLOBAL)memHandle);//釋放內(nèi)存返回本節(jié)下面給出一個(gè)程序片段,來(lái)說(shuō)明內(nèi)存管理函數(shù)的用法。返回本節(jié)3212.4.3內(nèi)存映射文件內(nèi)存映射文件是由一個(gè)文件到一塊內(nèi)存的映射。Win32提供了允許應(yīng)用程序把文件映射到一個(gè)進(jìn)程的函數(shù)(CreateFileMapping)。這樣,文件內(nèi)的數(shù)據(jù)就可以用內(nèi)存讀/寫(xiě)指令來(lái)訪問(wèn),而不是用ReadFile和WriteFile這樣的I/O系統(tǒng)函數(shù),從而提高了文件存取速度。這種函數(shù)最適用于需要讀取文件并且對(duì)文件內(nèi)包含的信息做語(yǔ)法分析的應(yīng)用程序,如對(duì)輸入文件進(jìn)行語(yǔ)法分析的彩色語(yǔ)法編輯器,編譯器等。

返回本節(jié)12.4.3內(nèi)存映射文件內(nèi)存映射文件是由一個(gè)文件到一塊內(nèi)3312.4.4Win32s:Windows3.x對(duì)Win32API的支持Win32s與Win32是有區(qū)別的。Win32s的s的含義是指子集(subset)。

運(yùn)行在Windows3.x/Win32s系統(tǒng)上的Win32程序支持32位指針和32位寄存器,只需要在系統(tǒng)調(diào)用之前稍作形式替換。

Win32s子集同Win32相比,不支持多線程,高級(jí)圖形API,異步文件I/O,Unicode和安全性;而且它是運(yùn)行于16位的Windows系統(tǒng)上的。但是同Win16相比,有它的優(yōu)越之處,目前在16位Windows程序開(kāi)發(fā)方面有相當(dāng)?shù)臐摿Α?/p>

返回本節(jié)12.4.4Win32s:Windows3.x對(duì)Win3412.4.5Win32編程基礎(chǔ)Win32數(shù)據(jù)類型這里的數(shù)據(jù)類型指的是一些關(guān)鍵字,這些關(guān)鍵字定義了Win32中的函數(shù)中的有關(guān)參數(shù)和返回值的大小和意義。這里需要解釋一下的是句柄。句柄是Windows編程的一個(gè)關(guān)鍵性的概念,編寫(xiě)Windows應(yīng)用程序總是要和各種句柄打交道。所謂句柄,就是一個(gè)惟一的數(shù),用以標(biāo)識(shí)許多不同的對(duì)象類型,如窗口、菜單、內(nèi)存、畫(huà)筆、畫(huà)刷和電話線路等。由于Windows是一個(gè)多任務(wù)操作系統(tǒng),它可以同時(shí)運(yùn)行多個(gè)程序或一個(gè)程序的多個(gè)副本。

Windows不僅使用句柄來(lái)管理實(shí)例,也用它來(lái)管理窗口、位圖、字體、元文件和圖標(biāo)等系統(tǒng)資源。12.4.5Win32編程基礎(chǔ)Win32數(shù)據(jù)類型35Win32常用的數(shù)據(jù)類型有:

返回本節(jié)Win32常用的數(shù)據(jù)類型有:返回本節(jié)3612.5MFC編程12.5.1MFC類庫(kù)概念和組成12.5.2MFC應(yīng)用程序框架12.5.3MFC的優(yōu)點(diǎn)12.5.4MFC對(duì)消息的管理返回首頁(yè)12.5MFC編程12.5.1MFC類庫(kù)概念和組成返3712.5.1MFC類庫(kù)概念和組成類庫(kù)是一個(gè)可以在應(yīng)用中使用的相互關(guān)聯(lián)的C++類的集合。

Microsoft提供了一個(gè)基礎(chǔ)類庫(kù)MFC,其中包含用來(lái)開(kāi)發(fā)C++和C++Windows應(yīng)用程序的一組類?;A(chǔ)類庫(kù)的核心是以C++形式封裝了大部分的WindowsAPI。類庫(kù)表示窗口、對(duì)話框、設(shè)備上下文、公共GDI對(duì)象如畫(huà)筆、調(diào)色板、控制框和其他標(biāo)準(zhǔn)的Windows部件。這些類提供了一個(gè)面向Windows中結(jié)構(gòu)的簡(jiǎn)單的C++成員函數(shù)的接口。12.5.1MFC類庫(kù)概念和組成類庫(kù)是一個(gè)可以在應(yīng)用中使38MFC可分為兩個(gè)主要部分:

①基礎(chǔ)類;②宏和全程函數(shù)。

MFC可分為兩個(gè)主要部分:①基礎(chǔ)類;39①基礎(chǔ)類;MFC中的類按功能來(lái)分可劃分為以下幾類:基類、應(yīng)用程序框架類、應(yīng)用程序類、命令相關(guān)類、文檔/視圖類、線程類、可視對(duì)象類、窗口類、視圖類、對(duì)話框類、屬性表

、控制類、菜單類、設(shè)備描述表、繪畫(huà)對(duì)象類、通用類、文件、診斷、異常、收集、模板收集、其他支持類、OLE2類、OLE基類、OLE可視編輯包裝程序類、OLE可視編輯服務(wù)器程序類、OLE數(shù)據(jù)傳輸類、OLE對(duì)話框類、其他OLE類和數(shù)據(jù)庫(kù)類。①基礎(chǔ)類;MFC中的類按功能來(lái)分可劃分為以下幾類:40②宏和全程函數(shù)。

Microsoft基本宏和全程函數(shù)提供以下功能:數(shù)據(jù)類型、運(yùn)行時(shí)刻對(duì)象類型服務(wù)、診斷服務(wù)、異常處理、CString格式化及信息框顯示、消息映射、應(yīng)用消息和管理、對(duì)象連接和嵌入(OLE)服務(wù)、標(biāo)準(zhǔn)命令和WindowsIDs。約定:全程函數(shù)以“Afx”為前綴,所有全程變量都是以“Afx”為前綴,宏不帶任何特別前綴,但是全部大寫(xiě)。②宏和全程函數(shù)。Microsoft基本宏和全程函數(shù)提供以下41例12-1:CObject類的定義。

//classCObjectistherootofallcompliantobjectsclassCObject{public://Objectmodel(types,destruction,allocation)virtualCRuntimeClass*GetRuntimeClass()const;virtual~CObject();//virtualdestructorsarenecessary//Diagnosticallocationsvoid*PASCALoperatornew(size_tnSize);void*PASCALoperatornew(size_t,void*p);voidPASCALoperatordelete(void*p);#ifdefined(_DEBUG)&&!defined(_AFX_NO_DEBUG_CRT)//forfilename/linenumbertrackingusingDEBUG_NEWvoid*PASCALoperatornew(size_tnSize,LPCSTRlpszFileName,intnLine);#endif例12-1:CObject類的定義。42//Disablethecopyconstructorandassignmentbydefaultsoyouwillget//compilererrorsinsteadofunexpectedbehaviourifyoupassobjects//tected:CObject();private:CObject(constCObject&objectSrc);//noimplementationvoidoperator=(constCObject&objectSrc);//noimplementation//Attributes//Disablethecopyconstructo43public:BOOLIsSerializable()const;BOOLIsKindOf(constCRuntimeClass*pClass)const;//OverridablesvirtualvoidSerialize(CArchive&ar);//DiagnosticSupportvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;//Implementationpublic:staticconstAFX_DATACRuntimeClassclassCObject;#ifdef_AFXDLLstaticCRuntimeClass*PASCAL_GetBaseClass();#endif};public:44CObject類為派生類提供了下述服務(wù):

(1)對(duì)象診斷。(2)運(yùn)行時(shí)訪問(wèn)類的信息。

(3)對(duì)象持續(xù)性。

CObject類為派生類提供了下述服務(wù):(1)對(duì)象診斷。45下面舉個(gè)具體的例子來(lái)說(shuō)明MFC所提供的應(yīng)用程序框架,程序如例12-2所示。例12-2:應(yīng)用程序框架示例。

#include<afxwin.h>//derivedanapplicationclassclassCMinMFCApp:publicCWinApp{public:BOOLInitInstance();};//DerivethemainwindowclassclassCMainWindow:publicCFrameWnd{下面舉個(gè)具體的例子來(lái)說(shuō)明MFC所提供的應(yīng)用程序框架,程序如例46public:CMainWindow();DECLARE_MESSAGE_MAP()};BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)END_MESSAGE_MAP()/*CMinMFCAppMemberFunctions*/BOOLCMinMFCApp::InitInstance(){m_pMainWnd=newCMainWindow();m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();returnTRUE;}public:47/*CMainWindowmemberfunctions*/CMainWindow::CMainWindow()//constructor{Create(NULL,"MinMFCApplication",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);}/*aninstanceoftypeCMinMFCApp*/CMinMFCAppThisApp;返回本節(jié)/*CMainWindowmemberfunctions4812.5.2MFC應(yīng)用程序框架MFCAppWizard生成的應(yīng)用程序包含以下要素。

(1)WinMain()函數(shù)。Windows要求應(yīng)用程序必須有一個(gè)WinMain()函數(shù)。

(2)應(yīng)用程序類CMyFirstApp。該類的每一個(gè)對(duì)象代表一個(gè)應(yīng)用程序。

(3)應(yīng)用程序啟動(dòng)。

(4)成員函數(shù)CMyFirstApp::InitInstance()。

(5)成員函數(shù)CWinApp::Run()。

(6)CMainFrame類。

(7)文檔與視圖類。

(8)關(guān)閉應(yīng)用程序。

返回本節(jié)12.5.2MFC應(yīng)用程序框架MFCAppWizard4912.5.3MFC的優(yōu)點(diǎn)MicrosoftMFC具有以下不同于其他類庫(kù)的優(yōu)勢(shì):完全支持Windows所有的函數(shù)、控件、消息、GDI基本圖形函數(shù)、菜單及對(duì)話框。使用與傳統(tǒng)的WindowsAPI同樣的命名規(guī)則,即匈牙利命名法。進(jìn)行消息處理時(shí),不使用易產(chǎn)生錯(cuò)誤的switch/case語(yǔ)句,所有消息映射到類的成員函數(shù),這種直接消息到方法的映射對(duì)所有的消息都適用。

返回本節(jié)12.5.3MFC的優(yōu)點(diǎn)MicrosoftMFC具有以5012.5.4MFC對(duì)消息的管理1.MFC對(duì)消息的處理2.消息的發(fā)送12.5.4MFC對(duì)消息的管理1.MFC對(duì)消息的處理511.MFC對(duì)消息的處理MFC不使用用C語(yǔ)言編寫(xiě)Windows程序時(shí)用的易產(chǎn)生錯(cuò)誤的switch/case語(yǔ)句,而采用一種消息映射機(jī)制來(lái)決定如何處理特定的消息。這種消息映射機(jī)制包括一組宏,用于標(biāo)識(shí)消息處理函數(shù)、映射類成員函數(shù)和對(duì)應(yīng)的消息等。

1.MFC對(duì)消息的處理MFC不使用用C語(yǔ)言編寫(xiě)Windows52例12-3:消息處理函數(shù)例子。

classCMainFrame:CFrameWnd{public:CMainFrame();protected://{{AFX_MSG(CMainFrame)afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnEditCopy();afx_msgvoidOnClose();//}}AFX_MSGDECLARE_MESSAGE_MAP()};例12-3:消息處理函數(shù)例子。53例12-4:使用用戶自定義消息。

#include<afxwin.h>#defineCM_APPLE(WM_USER+0)#defineCM_ORANGE(WM_USER+1)classCMainFrame:CFrameWnd{public:CMainFrame();protected:afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnClose();//handleuserselectappleafx_msgLRESULTCMApple(WPARAMwParam,LPARAMlParam);//handleuserselectorangeafx_msgLRESULTCMOrange(WPARAMwParam,LPARAMlParam);DECLARE_MESSAGE_MAP()};例12-4:使用用戶自定義消息。54相應(yīng)的消息映射如下:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_CREATE()ON_MESSAGE(CM_APPLE,CMApple)ON_MESSAGE(CM_ORANGE,CMOrange)ON_WM_CLOSE()END_MESSAGE_MAP()相應(yīng)的消息映射如下:552.消息的發(fā)送Windows應(yīng)用程序允許應(yīng)用程序向自己發(fā)送消息、向其他應(yīng)用程序發(fā)送消息,甚至可以向Windows操作系統(tǒng)本身發(fā)送消息(比如要求關(guān)閉操作系統(tǒng)或重新啟動(dòng)操作系統(tǒng))。Windows提供了三個(gè)API函數(shù)用于發(fā)送消息,這三個(gè)函數(shù)是:SendMessage()、PostMessage()和SendDlgItemMessage()。2.消息的發(fā)送Windows應(yīng)用程序允許應(yīng)用程序向自己發(fā)送消56SendMessage()用于向窗口發(fā)送消息,該函數(shù)說(shuō)明如下:

LRESULTSendMessage(HWNDhWnd, //消息要發(fā)往的窗口的句柄UINTMsg, //要發(fā)送的消息WPARAMwParam, //消息的第一個(gè)參數(shù)LPARAMlParam //消息的第二個(gè)參數(shù));SendMessage()用于向窗口發(fā)送消息,該函數(shù)說(shuō)明如下57PostMessage()函數(shù)說(shuō)明如下:BOOLPostMessage(HWNDhWnd,//消息發(fā)往的窗口UINTMsg,//要發(fā)送的消息WPARAMwParam,//消息的第一個(gè)參數(shù)LPARAMlParam//消息的第二個(gè)參數(shù));PostMessage()函數(shù)說(shuō)明如下:BOOLPostM58SendDlgItemMessage()函數(shù)用于向?qū)υ捒虻哪硞€(gè)控制發(fā)送消息,函數(shù)聲明如下:

LONGSendDlgItemMessage(HWNDhDlg,//對(duì)話框句柄intnIDDlgItem,//對(duì)話框控件的IDUINTMsg,//要發(fā)送的消息WPARAMwParam,//消息的第一個(gè)參數(shù)LPARAMlParam//消息的第二個(gè)參數(shù));返回本節(jié)SendDlgItemMessage()函數(shù)用于向?qū)υ捒虻哪?9演講完畢,謝謝觀看!演講完畢,謝謝觀看!60第12章

VisualC++環(huán)境下Windows程序開(kāi)發(fā)概述12.1VisualC++可視化集成開(kāi)發(fā)環(huán)境12.2創(chuàng)建、組織文件、工程和工作區(qū)12.3Windows編程基礎(chǔ)12.4Win32開(kāi)發(fā)12.5MFC編程第12章VisualC++環(huán)境下Windows程序開(kāi)發(fā)6112.1VisualC++可視化集成開(kāi)發(fā)環(huán)境12.1.1VisualC++簡(jiǎn)介12.1.2項(xiàng)目開(kāi)發(fā)過(guò)程12.1.3集成開(kāi)發(fā)環(huán)境DeveloperStudio12.1.4常用功能鍵及其意義返回首頁(yè)12.1VisualC++可視化集成開(kāi)發(fā)環(huán)境12.1.6212.1.1VisualC++簡(jiǎn)介1.VisualC++集成開(kāi)發(fā)環(huán)境(IDE)集成開(kāi)發(fā)環(huán)境(IDE)是一個(gè)將程序編輯器、編譯器、調(diào)試工具和其他建立應(yīng)用程序的工具集成在一起的用于開(kāi)發(fā)應(yīng)用程序的軟件系統(tǒng)。

2.向?qū)В╓izard)向?qū)且粋€(gè)通過(guò)一步步的幫助引導(dǎo)你工作的工具。DeveloperStudio中包含三個(gè)向?qū)А?/p>

3.MFC庫(kù)庫(kù)(library)是可以重復(fù)使用的源代碼和目標(biāo)代碼的集合。MFC(MicrosoftFundamentalClasses)是VisualC++開(kāi)發(fā)環(huán)境所帶的類庫(kù),在該類庫(kù)中提供了大量的類,可以幫助開(kāi)發(fā)人員快速建立應(yīng)用程序。

返回本節(jié)12.1.1VisualC++簡(jiǎn)介1.VisualC6312.1.2項(xiàng)目開(kāi)發(fā)過(guò)程一個(gè)用C++開(kāi)發(fā)項(xiàng)目的通用開(kāi)發(fā)過(guò)程如圖12-1所示。12.1.2項(xiàng)目開(kāi)發(fā)過(guò)程一個(gè)用C++開(kāi)發(fā)項(xiàng)目的通用開(kāi)發(fā)過(guò)64建立一個(gè)項(xiàng)目的第一步是利用編輯器建立程序代碼文件,包括頭文件、代碼文件、資源文件等。然后,啟動(dòng)編譯程序,編譯程序首先調(diào)用預(yù)處理程序處理程序中的預(yù)處理命令(如#include,#define等),經(jīng)過(guò)預(yù)處理程序處理的代碼將作為編譯程序的輸入。編譯對(duì)用戶程序進(jìn)行詞法和語(yǔ)法分析,建立目標(biāo)文件,文件中包括機(jī)器代碼、連接指令、外部引用以及從該源文件中產(chǎn)生的函數(shù)和數(shù)據(jù)名。此后,連接程序?qū)⑺械哪繕?biāo)代碼和用到的靜態(tài)連接庫(kù)的代碼連接起來(lái),為所有的外部變量和函數(shù)找到其提供地點(diǎn),最后產(chǎn)生一個(gè)可執(zhí)行文件。一般有一個(gè)makefile文件來(lái)協(xié)調(diào)各個(gè)部分產(chǎn)生可執(zhí)行文件。返回本節(jié)建立一個(gè)項(xiàng)目的第一步是利用編輯器建立程序代碼文件,包括頭文件6512.1.3集成開(kāi)發(fā)環(huán)境DeveloperStudio1.進(jìn)入DeveloperStudio2.DeveloperStudio的界面3.獲得幫助信息4.VisualC++的編輯器12.1.3集成開(kāi)發(fā)環(huán)境DeveloperStudio66圖12-2DeveloperStudio界面圖12-2DeveloperStudio界面67DeveloperStudio它具有以下特點(diǎn):

(1)自動(dòng)語(yǔ)法。

(2)自動(dòng)縮進(jìn)。

(3)參數(shù)幫助。

(4)集成的關(guān)鍵字幫助。

(5)拖放編輯。

(6)自動(dòng)錯(cuò)誤定位。

返回本節(jié)DeveloperStudio它具有以下特點(diǎn):(1)自動(dòng)6812.1.4常用功能鍵及其意義表12-1常用功能鍵12.1.4常用功能鍵及其意義表12-1常用功能鍵69返回本節(jié)返回本節(jié)7012.2創(chuàng)建、組織文件、工程和工作區(qū)12.2.1新建工程12.2.2新建工作區(qū)12.2.3增加已有文件到工程中12.2.4打開(kāi)工作區(qū)12.2.5設(shè)置當(dāng)前工程返回首頁(yè)12.2創(chuàng)建、組織文件、工程和工作區(qū)12.2.1新建7112.2.1新建工程項(xiàng)目工作區(qū)是一個(gè)包含用戶的所有相關(guān)項(xiàng)目和配置的實(shí)體。工程定義為一個(gè)配置和一組文件,用以生成最終的程序或二進(jìn)制文件。一個(gè)項(xiàng)目工作區(qū)可以包含多個(gè)工程,這些工程既可以是同一類型的工程,也可以是不同類型的工程(如VisualC++和VisualJ++工程)。工作區(qū)現(xiàn)在以.dsw為后綴名(以前為.mdp),項(xiàng)目文件現(xiàn)在以.dsp(以前為.mak)為后綴名。項(xiàng)目工作區(qū)如圖12-3所示。12.2.1新建工程項(xiàng)目工作區(qū)是一個(gè)包含用戶的所有相關(guān)項(xiàng)72圖12-3項(xiàng)目工作區(qū)圖12-3項(xiàng)目工作區(qū)73要新建一個(gè)工程,可以:(1)在File菜單上,單擊New,選擇Projects標(biāo)簽。(2)從列表中選擇項(xiàng)目類型(3)單擊CreateNewWorkspace(新建工作區(qū))或AddtoCurrentWorkspace(加入到當(dāng)前工作區(qū)中)。(4)要使新工程為子工程,可以選擇Dependencyof檢查框,并從列表中選擇一個(gè)工程。要新建一個(gè)工程,可以:74(5)在ProjectName框中,輸入新工程名,確保該名字必須與工作區(qū)中的別的工程名字不重名。(6)在Location框中,指定工程存放的目錄:可以直接輸入路徑名,也可以單擊旁邊的Browse按鈕,瀏覽選擇一個(gè)路徑。(7)單擊Platform框中的相應(yīng)檢查框,指定工程的開(kāi)發(fā)平臺(tái)返回本節(jié)(5)在ProjectName框中,輸入新工程名,確保該名7512.2.2新建工作區(qū)要?jiǎng)?chuàng)建一個(gè)空的工作區(qū),可以:

(1)在File菜單上,單擊New。(2)在隨后彈出的對(duì)話框上,單擊Workspace標(biāo)簽。(3)從類型列表中選擇BlankWorkspace。(4)在WorkspaceName框中輸入名字,注意名字不能與它將要包含的工程同名。(5)在Location框中指定存放工作區(qū)文件的目錄。(6)單擊OK。返回本節(jié)12.2.2新建工作區(qū)要?jiǎng)?chuàng)建一個(gè)空的工作區(qū),可以:返回7612.2.3增加已有文件到工程中(1)打開(kāi)包含目標(biāo)工程的項(xiàng)目工作區(qū)文件。(2)在Project菜單上,單擊AddtoProject,然后單擊Files。(3)在InsertFilesintoProject對(duì)話框中,瀏覽并定位要加入到工程中的文件名,然后選擇它們。(4)從InsertInto中選擇工程名字,然后單擊OK。返回本節(jié)12.2.3增加已有文件到工程中(1)打開(kāi)包含目標(biāo)工程的7712.2.4打開(kāi)工作區(qū)選擇File-OpenWorkspace,指定要打開(kāi)的工作區(qū);或選擇File-RecentWorkspaces,從最近打開(kāi)過(guò)的工作區(qū)列表中選擇一個(gè)。返回本節(jié)12.2.4打開(kāi)工作區(qū)選擇File-OpenWorks7812.2.5設(shè)置當(dāng)前工程選擇ProjectSetting,可以為當(dāng)前工程設(shè)置編譯、鏈接和C/C++等各種選項(xiàng)。

返回本節(jié)12.2.5設(shè)置當(dāng)前工程選擇ProjectSettin7912.3Windows編程基礎(chǔ)12.3.1WindowsAPI12.3.2Windows基礎(chǔ)12.3.3Windows消息映射和處理返回首頁(yè)12.3Windows編程基礎(chǔ)12.3.1Windo8012.3.1WindowsAPI1.WindowsAPI的定義WindowsAPI是應(yīng)用程序編程接口(ApplicationProgrammingInterface)的英文縮寫(xiě)。它是大量函數(shù)加上數(shù)字常量、宏、結(jié)構(gòu)、類型以及其他相關(guān)項(xiàng)的集合。2.WindowsAPI函數(shù)的分類根據(jù)WindowsAPI函數(shù)的功能,可以將其分為三類:(1)窗口管理函數(shù)。用以實(shí)現(xiàn)窗口的創(chuàng)建、移動(dòng)和修改功能。(2)圖形設(shè)備(GUI)函數(shù)。用以實(shí)現(xiàn)與設(shè)備無(wú)關(guān)的圖形操作功能。(3)系統(tǒng)服務(wù)函數(shù)。用以實(shí)現(xiàn)與操作系統(tǒng)有關(guān)的多種功能。返回本節(jié)12.3.1WindowsAPI1.WindowsA8112.3.2Windows基礎(chǔ)1.事件

事件以如下三種方式產(chǎn)生:(1)通過(guò)輸入設(shè)備,如鍵盤(pán)和鼠標(biāo)。(2)通過(guò)屏幕上的可視對(duì)象,如菜單、工具欄按鈕、滾動(dòng)條和對(duì)話框上的控件。(3)來(lái)自Windows內(nèi)部。2.消息但Windows捕獲一個(gè)事件后,它會(huì)編寫(xiě)一條消息,并將相關(guān)信息放入一個(gè)數(shù)據(jù)結(jié)構(gòu)中,然后將包含此數(shù)據(jù)結(jié)構(gòu)的消息發(fā)送給需要此消息的程序。Windows消息是在Windows文件中用宏定義的常數(shù)。消息常數(shù)名通常以WM開(kāi)頭,格式為WM_XXX。12.3.2Windows基礎(chǔ)1.事件823.繪圖及設(shè)備環(huán)境Windows具有圖形用戶界面(GUI),它包括菜單、工具欄、滾動(dòng)條和對(duì)話框中的按鈕等元素。4.對(duì)象與句柄對(duì)設(shè)備環(huán)境的訪問(wèn)是通過(guò)Windows返回的句柄進(jìn)行的。

5.坐標(biāo)系要為繪制和其他任務(wù)指定位置,需要坐標(biāo)系統(tǒng)。Windows提供了8種不同的坐標(biāo)系。

返回本節(jié)3.繪圖及設(shè)備環(huán)境返回本節(jié)8312.3.3Windows消息映射和處理開(kāi)始執(zhí)行在Windows中,管理消息的方式通常是這樣的:當(dāng)發(fā)生某個(gè)消息后,該消息進(jìn)入消息隊(duì)列,操作系統(tǒng)根據(jù)消息提供的信息決定由哪個(gè)應(yīng)用程序來(lái)處理,該應(yīng)用程序依照一定的方式查找應(yīng)用程序各個(gè)類的消息映射(一組宏,這些宏用來(lái)確定某個(gè)消息及相應(yīng)的處理程序的對(duì)應(yīng)關(guān)系),找到處理程序,然后由處理程序執(zhí)行。圖12-4是Windows程序和Windows消息的基本流程。12.3.3Windows消息映射和處理開(kāi)始執(zhí)行84圖12-4Windows程序和Windows消息處理的基本流程圖12-4Windows程序和Windows消息處理的基85Windows程序要處理的消息種類如下:(1)Windows消息。該類消息以WM_開(kāi)頭(WM_COMMAND例外),通常由窗口和視圖來(lái)處理。

(2)由控件和其他子窗口發(fā)送給父窗口的WM_COMMAND消息。這些消息中包括EN_CHANGE通知碼。(3)來(lái)自于用戶界面對(duì)象的WM_COMMAND消息。這些用戶界面對(duì)象包括菜單、工具欄按鈕和快捷鍵。返回本節(jié)Windows程序要處理的消息種類如下:(1)Windows8612.4Win32開(kāi)發(fā)12.4.1搶先式多任務(wù)和多線程12.4.2連續(xù)的地址空間和先進(jìn)的內(nèi)存管理12.4.3內(nèi)存映射文件12.4.4Win32s:Windows3.x對(duì)Win32API的支持12.4.5Win32編程基礎(chǔ)返回首頁(yè)12.4Win32開(kāi)發(fā)12.4.1搶先式多任務(wù)和多線87Win32可以應(yīng)用于特定的操作系統(tǒng),這種系統(tǒng)可以直接控制和處理PC硬件資源,而不必象Win16API那樣依賴于MS-DOS系統(tǒng)服務(wù)。然而,Win32不是簡(jiǎn)單的由Win16從16位到32位的升級(jí),更重要的在于它支持:

(1)高性能的搶先式多任務(wù)和多線程;(2)連續(xù)的32位地址空間和先進(jìn)的內(nèi)存管理;(3)對(duì)所有的可為進(jìn)程共享的對(duì)象,解決了它的安全性問(wèn)題;(4)內(nèi)存映射文件;

Win32可以應(yīng)用于特定的操作系統(tǒng),這種系統(tǒng)可以直接控制和處8812.4.1搶先式多任務(wù)和多線程Windows是一個(gè)多任務(wù)操作系統(tǒng),它提供了一次運(yùn)行多個(gè)應(yīng)用程序的能力。

Windows3.x的多任務(wù)是一種由協(xié)作、軟件方式產(chǎn)生的有限的非搶先式的多任務(wù)。

Windows95的多任務(wù)是一種搶先式多任務(wù)。在搶先式多任務(wù)操作系統(tǒng)中,系統(tǒng)在運(yùn)行的所有進(jìn)程之間對(duì)CPU時(shí)間進(jìn)行共享,從而保證每個(gè)進(jìn)程都能頻繁的訪問(wèn)處理器,并且實(shí)現(xiàn)指令的連續(xù)執(zhí)行。這樣,每個(gè)Win32進(jìn)程都需要分配一個(gè)優(yōu)先級(jí),系統(tǒng)調(diào)度程序利用這種優(yōu)先級(jí)來(lái)決定哪一時(shí)刻。12.4.1搶先式多任務(wù)和多線程Windows是一個(gè)多任89一個(gè)線程處于以下三種狀態(tài)之一:正在執(zhí)行,掛起,準(zhǔn)備運(yùn)行。在單處理器環(huán)境下(如Windows95),同一時(shí)刻只能運(yùn)行一個(gè)線程。為了在Win32中支持多線程進(jìn)程結(jié)構(gòu),Win32在原來(lái)Win16基礎(chǔ)上增加了:(1)對(duì)進(jìn)程以及線程創(chuàng)建、操縱的支持;(2)對(duì)一個(gè)進(jìn)程內(nèi)線程之間的同步和同步對(duì)象的支持;(3)一個(gè)統(tǒng)一的共享機(jī)制。返回本節(jié)一個(gè)線程處于以下三種狀態(tài)之一:正在執(zhí)行,掛起,準(zhǔn)備運(yùn)行。在單9012.4.2連續(xù)的地址空間和先進(jìn)的內(nèi)存管理(1)申請(qǐng)一塊可移動(dòng)的內(nèi)存塊。

(2)鎖定該內(nèi)存塊。因?yàn)閃indows引入了虛擬內(nèi)存管理,可以把內(nèi)存塊移動(dòng)到硬盤(pán)交換文件中,所以在使用內(nèi)存塊之前,必須將它鎖定在真正的內(nèi)存RAM之中,也就是告訴操作系統(tǒng),現(xiàn)在這塊內(nèi)存暫時(shí)由應(yīng)用程序來(lái)管理。

(3)對(duì)該內(nèi)存塊進(jìn)行各種操作:如復(fù)制數(shù)據(jù)到內(nèi)存塊。

(4)解鎖內(nèi)存,應(yīng)用程序?qū)?duì)該內(nèi)存的控制交予Windows。

12.4.2連續(xù)的地址空間和先進(jìn)的內(nèi)存管理(1)申請(qǐng)一塊91下面給出一個(gè)程序片段,來(lái)說(shuō)明內(nèi)存管理函數(shù)的用法。HGLOBALmemHandle;//內(nèi)存句柄charfar*lpMem;//假設(shè)長(zhǎng)度為memLenmemHandle=GlobalAlloc(GHND,memLen+1);//申請(qǐng)內(nèi)存塊,此處未做返回結(jié)果檢查,//事實(shí)上,申請(qǐng)內(nèi)存有時(shí)會(huì)失敗memcpy(lpMem,string,textLen);//拷貝數(shù)據(jù),其中string為一字符串變量,textLen

//是這個(gè)字符串的長(zhǎng)度GlobalUnlock(memHandle);//解鎖內(nèi)存...GlobalFree((HGLOBAL)memHandle);//釋放內(nèi)存返回本節(jié)下面給出一個(gè)程序片段,來(lái)說(shuō)明內(nèi)存管理函數(shù)的用法。返回本節(jié)9212.4.3內(nèi)存映射文件內(nèi)存映射文件是由一個(gè)文件到一塊內(nèi)存的映射。Win32提供了允許應(yīng)用程序把文件映射到一個(gè)進(jìn)程的函數(shù)(CreateFileMapping)。這樣,文件內(nèi)的數(shù)據(jù)就可以用內(nèi)存讀/寫(xiě)指令來(lái)訪問(wèn),而不是用ReadFile和WriteFile這樣的I/O系統(tǒng)函數(shù),從而提高了文件存取速度。這種函數(shù)最適用于需要讀取文件并且對(duì)文件內(nèi)包含的信息做語(yǔ)法分析的應(yīng)用程序,如對(duì)輸入文件進(jìn)行語(yǔ)法分析的彩色語(yǔ)法編輯器,編譯器等。

返回本節(jié)12.4.3內(nèi)存映射文件內(nèi)存映射文件是由一個(gè)文件到一塊內(nèi)9312.4.4Win32s:Windows3.x對(duì)Win32API的支持Win32s與Win32是有區(qū)別的。Win32s的s的含義是指子集(subset)。

運(yùn)行在Windows3.x/Win32s系統(tǒng)上的Win32程序支持32位指針和32位寄存器,只需要在系統(tǒng)調(diào)用之前稍作形式替換。

Win32s子集同Win32相比,不支持多線程,高級(jí)圖形API,異步文件I/O,Unicode和安全性;而且它是運(yùn)行于16位的Windows系統(tǒng)上的。但是同Win16相比,有它的優(yōu)越之處,目前在16位Windows程序開(kāi)發(fā)方面有相當(dāng)?shù)臐摿Α?/p>

返回本節(jié)12.4.4Win32s:Windows3.x對(duì)Win9412.4.5Win32編程基礎(chǔ)Win32數(shù)據(jù)類型這里的數(shù)據(jù)類型指的是一些關(guān)鍵字,這些關(guān)鍵字定義了Win32中的函數(shù)中的有關(guān)參數(shù)和返回值的大小和意義。這里需要解釋一下的是句柄。句柄是Windows編程的一個(gè)關(guān)鍵性的概念,編寫(xiě)Windows應(yīng)用程序總是要和各種句柄打交道。所謂句柄,就是一個(gè)惟一的數(shù),用以標(biāo)識(shí)許多不同的對(duì)象類型,如窗口、菜單、內(nèi)存、畫(huà)筆、畫(huà)刷和電話線路等。由于Windows是一個(gè)多任務(wù)操作系統(tǒng),它可以同時(shí)運(yùn)行多個(gè)程序或一個(gè)程序的多個(gè)副本。

Windows不僅使用句柄來(lái)管理實(shí)例,也用它來(lái)管理窗口、位圖、字體、元文件和圖標(biāo)等系統(tǒng)資源。12.4.5Win32編程基礎(chǔ)Win32數(shù)據(jù)類型95Win32常用的數(shù)據(jù)類型有:

返回本節(jié)Win32常用的數(shù)據(jù)類型有:返回本節(jié)9612.5MFC編程12.5.1MFC類庫(kù)概念和組成12.5.2MFC應(yīng)用程序框架12.5.3MFC的優(yōu)點(diǎn)12.5.4MFC對(duì)消息的管理返回首頁(yè)12.5MFC編程12.5.1MFC類庫(kù)概念和組成返9712.5.1MFC類庫(kù)概念和組成類庫(kù)是一個(gè)可以在應(yīng)用中使用的相互關(guān)聯(lián)的C++類的集合。

Microsoft提供了一個(gè)基礎(chǔ)類庫(kù)MFC,其中包含用來(lái)開(kāi)發(fā)C++和C++Windows應(yīng)用程序的一組類。基礎(chǔ)類庫(kù)的核心是以C++形式封裝了大部分的WindowsAPI。類庫(kù)表示窗口、對(duì)話框、設(shè)備上下文、公共GDI對(duì)象如畫(huà)筆、調(diào)色板、控制框和其他標(biāo)準(zhǔn)的Windows部件。這些類提供了一個(gè)面向Windows中結(jié)構(gòu)的簡(jiǎn)單的C++成員函數(shù)的接口。12.5.1MFC類庫(kù)概念和組成類庫(kù)是一個(gè)可以在應(yīng)用中使98MFC可分為兩個(gè)主要部分:

①基礎(chǔ)類;②宏和全程函數(shù)。

MFC可分為兩個(gè)主要部分:①基礎(chǔ)類;99①基礎(chǔ)類;MFC中的類按功能來(lái)分可劃分為以下幾類:基類、應(yīng)用程序框架類、應(yīng)用程序類、命令相關(guān)類、文檔/視圖類、線程類、可視對(duì)象類、窗口類、視圖類、對(duì)話框類、屬性表

、控制類、菜單類、設(shè)備描述表、繪畫(huà)對(duì)象類、通用類、文件、診斷、異常、收集、模板收集、其他支持類、OLE2類、OLE基類、OLE可視編輯包裝程序類、OLE可視編輯服務(wù)器程序類、OLE數(shù)據(jù)傳輸類、OLE對(duì)話框類、其他OLE類和數(shù)據(jù)庫(kù)類。①基礎(chǔ)類;MFC中的類按功能來(lái)分可劃分為以下幾類:100②宏和全程函數(shù)。

Microsoft基本宏和全程函數(shù)提供以下功能:數(shù)據(jù)類型、運(yùn)行時(shí)刻對(duì)象類型服務(wù)、診斷服務(wù)、異常處理、CString格式化及信息框顯示、消息映射、應(yīng)用消息和管理、對(duì)象連接和嵌入(OLE)服務(wù)、標(biāo)準(zhǔn)命令和WindowsIDs。約定:全程函數(shù)以“Afx”為前綴,所有全程變量都是以“Afx”為前綴,宏不帶任何特別前綴,但是全部大寫(xiě)。②宏和全程函數(shù)。Microsoft基本宏和全程函數(shù)提供以下101例12-1:CObject類的定義。

//classCObjectistherootofallcompliantobjectsclassCObject{public://Objectmodel(types,destruction,allocation)virtualCRuntimeClass*GetRuntimeClass()const;virtual~CObject();//virtualdestructorsarenecessary//Diagnosticallocationsvoid*PASCALoperatornew(size_tnSize);void*PASCALoperatornew(size_t,void*p);voidPASCALoperatordelete(void*p);#ifdefined(_DEBUG)&&!defined(_AFX_NO_DEBUG_CRT)//forfilename/linenumbertrackingusingDEBUG_NEWvoid*PASCALoperatornew(size_tnSize,LPCSTRlpszFileName,intnLine);#endif例12-1:CObject類的定義。102//Disablethecopyconstructorandassignmentbydefaultsoyouwillget//compilererrorsinsteadofunexpectedbehaviourifyoupassobjects//tected:CObject();private:CObject(constCObject&objectSrc);//noimplementationvoidoperator=(constCObject&objectSrc);//noimplementation//Attributes//Disablethecopyconstructo103public:BOOLIsSerializable()const;BOOLIsKindOf(constCRuntimeClass*pClass)const;//OverridablesvirtualvoidSerialize(CArchive&ar);//DiagnosticSupportvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;//Implementationpublic:staticconstAFX_DATACRuntimeClassclassCObject;#ifdef_AFXDLLstaticCRuntimeClass*PASCAL_GetBaseClass();#endif};public:104CObject類為派生類提供了下述服務(wù):

(1)對(duì)象診斷。(2)運(yùn)行時(shí)訪問(wèn)類的信息。

(3)對(duì)象持續(xù)性。

CObject類為派生類提供了下述服務(wù):(1)對(duì)象診斷。105下面舉個(gè)具體的例子來(lái)說(shuō)明MFC所提供的應(yīng)用程序框架,程序如例12-2所示。例12-2:應(yīng)用程序框架示例。

#include<afxwin.h>//derivedanapplicationclassclassCMinMFCApp:publicCWinApp{public:BOOLInitInstance();};//DerivethemainwindowclassclassCMainWindow:publicCFrameWnd{下面舉個(gè)具體的例子來(lái)說(shuō)明MFC所提供的應(yīng)用程序框架,程序如例106public:CMainWindow();DECLARE_MESSAGE_MAP()};BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)END_MESSAGE_MAP()/*CMinMFCAppMemberFunctions*/BOOLCMinMFCApp::InitInstance(){m_pMainWnd=newCMainWindow();m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();returnTRUE;}public:107/*CMainWindowmemberfunctions*/CMainWindow::CMainWindow()//constructor{Create(NULL,"MinMFCApplication",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);}/*aninstanceoftypeCMinMFCApp*/CMinMFCAppThisApp;返回本節(jié)/*CMainWindow

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論