版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
創(chuàng)建應(yīng)用程序框架
8.1應(yīng)用程序向?qū)ppWizard
8.2AppWizard生成的類和源文件
8.3項(xiàng)目和項(xiàng)目工作區(qū)
8.4ClassWizard
習(xí)題
8.1應(yīng)用程序向?qū)ppWizard
VisualC++提供了創(chuàng)建MFC應(yīng)用程序框架的應(yīng)用程序向?qū)FCAppWizard。MFCAppWizard提供了一系列的對話框,在對話框中提供了一些不同的選項(xiàng),程序員通過不同的選項(xiàng),可以建立不同類型和風(fēng)格的MFC應(yīng)用程序(可執(zhí)行文件程序或動(dòng)態(tài)鏈接庫)。在完成這一系列對話框設(shè)置后,MFCAppWizard自動(dòng)生成應(yīng)用程序的源代碼,包括頭文件、類的實(shí)現(xiàn)文件、資源文件和項(xiàng)目文件等,并使這些文件與ClassWizard兼容。
8.1.1MFCAppWizard[exe]的使用下面以建立一個(gè)單文檔應(yīng)用程序?yàn)槔?,說明MFCAppWizard[exe]應(yīng)用程序向?qū)У氖褂谩!纠?.1】建立與例7.2功能相似的MFC應(yīng)用程序。使用MFCAppWizard[exe]建立應(yīng)用程序的步驟如下:
(1)執(zhí)行“File”→“New”菜單命令,打開“New”對話框,如圖8-1所示。圖8-1New對話框的“Projects”頁面
(2)選定“Projects”標(biāo)簽,在左側(cè)項(xiàng)目類型列表框中選擇項(xiàng)目類型“MFCAppWizard[exe]”。在“Projectname”文本框中輸入項(xiàng)目名,本例為EX8_1。在“Location”文本框中輸入保存項(xiàng)目的路徑和文件夾名,或單擊右側(cè)的“瀏覽”按鈕,在打開的對話框中選擇保存項(xiàng)目的文件夾。向?qū)⒃谠撐募A下建立一個(gè)以項(xiàng)目名為名稱的子文件夾,用于保存此項(xiàng)目的所有文件。設(shè)置完成后,單擊“OK”按鈕,出現(xiàn)“MFCAppWizard-Step1”對話框,如圖8-2所示。圖8-2MFCAppWizard–Step1對話框
(3)在“MFCAppWizard-Step1”對話框中,可以選擇應(yīng)用程序的類型和資源所使用的語言。使用MFCAppWizard[exe]向?qū)Э梢越⑷N類型的應(yīng)用程序:
·Singledocument:單文檔界面應(yīng)用程序(SDI),即程序一次只能打開一個(gè)文檔,如Windows中的記事本。
·Multipledocument:多文檔界面應(yīng)用程序(MDI),即程序可以同時(shí)打開多個(gè)文檔,如MicrosoftWord97。
·Dialogbased:基于對話框的應(yīng)用程序,即程序運(yùn)行后是對話框界面,如Windows中的計(jì)算器。選項(xiàng)“Document/Viewarchitecturesupport?”詢問應(yīng)用程序是否需要支持文檔/視圖體系結(jié)構(gòu)。在“Whatlanguagewouldyoulikeyourresourcesin?”欄中,可以選擇程序資源所使用的語言。本例中,選擇“Singledocument”以建立單文檔界面應(yīng)用程序,選中“Document/Viewarchitecturesupport?”,選擇使用“中文[中國][APPWZCHS.DLL]”。單擊“Next”按鈕,出現(xiàn)“MFCAppWizard-Step2of6”對話框,如圖8-3所示。圖8-3MFCAppWizard–Step2of6對話框
(4)在“MFCAppWizard–Step2of6”對話框中選擇對數(shù)據(jù)庫的支持方式,其中包括以下選項(xiàng):
·None:不包括任何對數(shù)據(jù)庫的支持,但以后可以手工添加對數(shù)據(jù)庫的操作代碼。如果應(yīng)用程序不使用數(shù)據(jù)庫,則選擇該項(xiàng)將建立比較小的應(yīng)用程序。
·Headerfilesonly:提供最簡單的數(shù)據(jù)庫支持,在項(xiàng)目中包含數(shù)據(jù)庫頭文件,但不創(chuàng)建任何與數(shù)據(jù)庫相關(guān)的類,需要時(shí)必須自己創(chuàng)建。
·Databaseviewwithoutfilesupport:包含所有的數(shù)據(jù)庫頭文件,并創(chuàng)建相關(guān)的數(shù)據(jù)庫類和視圖類,但不包括文檔的序列化。
·Databaseviewwithfilesupport:包含所有的數(shù)據(jù)庫頭文件,創(chuàng)建相關(guān)的數(shù)據(jù)庫類和視圖類,并支持文檔的序列化。
需要注意的是,若在上一步?jīng)]有選擇“Document/Viewarchitecturesupport?”,則后兩個(gè)選項(xiàng)無效。另外,若選擇后兩個(gè)選項(xiàng)之一,還必須通過單擊“DataSource”設(shè)置數(shù)據(jù)源。本例應(yīng)用程序不使用數(shù)據(jù)庫,選擇“None”。單擊“Next”按鈕,出現(xiàn)“MFCAppWizard–Step3of6”對話框,如圖8-4所示。圖8-4MFCAppWizard–Step3of6對話框
(5)在“MFCAppWizard–Step3of6”對話框中選擇應(yīng)用程序?qū)?fù)合文檔的支持類型。如果建立的應(yīng)用程序?yàn)閱挝臋n和多文檔界面,則可以選擇以下復(fù)合文檔支持選項(xiàng):
·None:默認(rèn)選項(xiàng),應(yīng)用程序不支持任何復(fù)合文檔。
·Container:應(yīng)用程序作為復(fù)合文檔容器,可以嵌入或鏈接復(fù)合文檔對象。
·Mini-server:應(yīng)用程序可以創(chuàng)建被其它應(yīng)用程序嵌入的對象。應(yīng)用程序不能作為一個(gè)獨(dú)立的程序運(yùn)行,只能被其它支持嵌入對象的程序啟動(dòng)。
·Full-server:應(yīng)用程序可以創(chuàng)建被其它應(yīng)用程序嵌入或鏈接的對象,并能作為一個(gè)獨(dú)立的程序運(yùn)行。
·Bothcontainerandserver:應(yīng)用程序既可以作為復(fù)合文檔容器,又可以作為一個(gè)可單獨(dú)運(yùn)行的復(fù)合文檔服務(wù)器。
·Yes,please:應(yīng)用程序支持復(fù)合文檔格式的序列化,可以將包含復(fù)合文檔對象的文檔保存為一個(gè)文件。
·No,thankyou:不支持復(fù)合文檔格式的序列化,必須一次性將包含復(fù)合文檔對象的文檔裝入內(nèi)存。
·Automation:使應(yīng)用程序支持自動(dòng)化,這樣應(yīng)用程序就可以被其它自動(dòng)化客戶(如MicrosoftExcel)訪問。
·ActiveXControls:使應(yīng)用程序可以使用ActiveX控件。如果不選擇該項(xiàng),以后要使應(yīng)用程序可以插入ActiveX控件,就必須自己進(jìn)行相應(yīng)的初始化。本例中使用所有缺省選項(xiàng)。單擊“Next”按鈕,出現(xiàn)“MFCAppWizard–Step4of6”對話框,如圖8-5所示。圖8-5MFCAppWizard–Step4of6對話框
(6)在“MFCAppWizard–Step4of6”對話框中可以設(shè)置應(yīng)用程序的界面特征。
·Dockingtoolbar:缺省設(shè)置,為應(yīng)用程序添加一個(gè)標(biāo)準(zhǔn)的工具欄,且添加相應(yīng)的菜單命令來顯示或隱藏工具欄。
·Initialstatusbar:缺省設(shè)置,為應(yīng)用程序添加一個(gè)標(biāo)準(zhǔn)的狀態(tài)欄,且添加相應(yīng)的菜單命令來顯示或隱藏狀態(tài)欄。
·Printingandprintpreview:缺省設(shè)置,為應(yīng)用程序添加打印和打印預(yù)覽功能。
·Context-sensitiveHelp:應(yīng)用程序具有上下文相關(guān)聯(lián)的幫助系統(tǒng)。
·3Dcontrols:缺省選項(xiàng),應(yīng)用程序界面具有三維立體外觀。
·MAPI(MessagingAPI):使應(yīng)用程序可以創(chuàng)建、操作、傳輸和存儲電子郵件。
·WindowsSockets:使應(yīng)用程序可以使用Sockets,支持TCP/IP協(xié)議。
·Normal:使用傳統(tǒng)風(fēng)格的工具欄。
·InternetExplorerReBars:采用類似IE瀏覽器風(fēng)格的工具欄。
·Howmanyfileswouldlikeonyourrecentfilelist?:在應(yīng)用程序的“文件”菜單下列出最近使用過的文檔的個(gè)數(shù)。單擊“Advanced”按鈕可以進(jìn)行更進(jìn)一步的設(shè)置,可以修改缺省的文件名和擴(kuò)展名,調(diào)整窗口的樣式,確定是否使用分隔窗口等。本例使用缺省設(shè)置。單擊“Next”按鈕,出現(xiàn)“MFCAppWizard–Step5of6”對話框,如圖8-6所示。圖8-6MFCAppWizard–Step5of6對話框
(7)在“MFCAppWizard–Step5of6”對話框中可以對項(xiàng)目進(jìn)行相應(yīng)的設(shè)置。
·MFCStandard:缺省設(shè)置,采用MFC標(biāo)準(zhǔn)風(fēng)格。
·WindowsExplorer:采用Windows資源管理器風(fēng)格,應(yīng)用程序窗口分為左右兩部分,左邊是一個(gè)樹型視圖,右邊是一個(gè)列表視圖。
·Yes,please:缺省選項(xiàng),向?qū)г谠闯绦虼a內(nèi)插入相應(yīng)的注釋。
·No,thankyou:在源程序內(nèi)不插入注釋。
·AsasharedDLL:將MFC類庫作為應(yīng)用程序的共享動(dòng)態(tài)鏈接庫。
·Asastaticallylinkedlibrary:采用靜態(tài)鏈接方式,將應(yīng)用程序中需要用到的MFC庫作為靜態(tài)庫插入到應(yīng)用程序中。這樣生成的應(yīng)用程序是一個(gè)完整的應(yīng)用程序,可以直接運(yùn)行而不用考慮系統(tǒng)中是否安裝了所需的MFC類庫。本例中使用缺省設(shè)置。單擊“Next”按鈕,出現(xiàn)“MFCAppWizard–Step6of6”對話框,如圖8-7所示。圖8-7MFCAppWizard–Step6of6對話框
(8)在“MFCAppWizard–Step6of6”對話框中列出了向?qū)⒁傻念惖娜笔∶捌漕^文件和實(shí)現(xiàn)文件名,我們可以修改類名及其相關(guān)文件,另外可以修改某些類的基類。單擊“Finish”按鈕,出現(xiàn)“NewProjectInformation”對話框。
(9)在“NewProjectInformation”對話框中,顯示了用戶在前面各步驟中所做的設(shè)置和選擇??梢栽诖藢υ捒蛑袡z查前面的設(shè)置,若這些信息正確,則可以單擊“OK”按鈕,AppWizard將根據(jù)用戶的設(shè)置創(chuàng)建應(yīng)用程序框架。若需要修改相關(guān)內(nèi)容,則單擊“Cancel”按鈕返回到上一個(gè)對話框。應(yīng)用程序框架創(chuàng)建完成后,就可以編譯、鏈接并運(yùn)行此程序。先執(zhí)行“Build”→“Build”菜單命令或按F7鍵或單擊工具欄上的創(chuàng)建按鈕創(chuàng)建可執(zhí)行文件,然后執(zhí)行“Build”→“Execute”菜單命令或按“Ctrl+F5”組合鍵或單擊工具欄上的執(zhí)行按鈕執(zhí)行應(yīng)用程序。因此,使用AppWizard創(chuàng)建應(yīng)用程序框架,無需編寫任何代碼就可以得到一個(gè)具有一定功能的完整的應(yīng)用程序。例8.1運(yùn)行結(jié)果如圖8-8所示。圖8-8例8.1運(yùn)行結(jié)果【例8.2】使用MFCAppWizard[exe]創(chuàng)建一個(gè)基于對話框的應(yīng)用程序,程序運(yùn)行時(shí)顯示一個(gè)對話框。利用MFCAppWizard[exe]創(chuàng)建基于對話框的應(yīng)用程序框架的步驟與創(chuàng)建單文檔應(yīng)用程序框架的步驟相似,即:
(1)執(zhí)行“File”→“New”菜單命令,打開如圖8-1所示的“New”對話框。在“New”對話框中選擇項(xiàng)目類型為“MFCAppWizard[exe]”,輸入項(xiàng)目名為EX8_2,確定保存項(xiàng)目的路徑。單擊“OK”按鈕,出現(xiàn)如圖8-2所示的“MFCAppWizard-Step1”對話框。
(2)在“MFCAppWizard–Step1”對話框中選擇“Dialogbased”選項(xiàng),單擊“Next”按鈕,出現(xiàn)如圖8-9所示的“MFCAppWizard-Step2of4”對話框。圖8-9MFCAppWizard-Step2of4對話框
(3)在“MFCAppWizard-Step2of4”對話框中可以設(shè)置應(yīng)用程序的特征,包括如下選項(xiàng):
·Aboutbox:在程序中加入About對話框,顯示程序的版本信息。在程序?qū)υ捒虻目刂撇藛沃屑尤搿瓣P(guān)于”菜單。
·Pleaseenteratitleforyourdialog:在下面的文本框中輸入對話框的標(biāo)題。其它選項(xiàng)的含義與創(chuàng)建單文檔應(yīng)用程序時(shí)相同。本例使用缺省設(shè)置。單擊“Next”按鈕,進(jìn)入下一步。
(4)創(chuàng)建對話框應(yīng)用程序的后續(xù)步驟與創(chuàng)建單文檔應(yīng)用程序的MFCAppWizard-Step5of6和MFCAppWizard-Step6of6相同(如圖8-6和圖8-7所示)。編譯、鏈接并運(yùn)行程序,程序運(yùn)行結(jié)果如圖8-10所示。圖8-10例8.2運(yùn)行結(jié)果8.1.2基于框架構(gòu)造應(yīng)用程序利用MFC框架構(gòu)造應(yīng)用程序,就是在應(yīng)用程序向?qū)傻腗FC應(yīng)用程序框架的基礎(chǔ)上,加入特定的應(yīng)用程序代碼,添加新的資源,通過定義各個(gè)對象所響應(yīng)的消息和命令將它們連接起來構(gòu)成一個(gè)完整的應(yīng)用程序。同時(shí),用戶利用C++語言和標(biāo)準(zhǔn)C++技術(shù),從MFC類庫所提供的類中派生出應(yīng)用程序自己的類,并重載基類成員以增強(qiáng)性能。開發(fā)基于框架的應(yīng)用程序時(shí)一般按如下幾個(gè)步驟進(jìn)行:
(1)根據(jù)應(yīng)用程序的特性,利用應(yīng)用程序向?qū)FCAppWizard[exe]創(chuàng)建一個(gè)應(yīng)用程序框架。
(2)構(gòu)造應(yīng)用程序的用戶接口。利用VisualC++提供的資源編輯器為應(yīng)用程序添加、編輯用戶接口,如創(chuàng)建和編輯菜單、定義加速鍵、添加對話框、編輯工具欄以及其它資源。
(3)利用類向?qū)lassWizard或手工為各個(gè)類添加必要的數(shù)據(jù)成員和成員函數(shù)。
(4)利用ClassWizard為菜單命令、工具欄命令按鈕等添加命令消息處理函數(shù)和其它消息處理函數(shù)。
(5)根據(jù)應(yīng)用程序的具體要求編程實(shí)現(xiàn)各命令處理函數(shù)和消息處理函數(shù)。
(6)根據(jù)應(yīng)用程序的需要?jiǎng)?chuàng)建并實(shí)現(xiàn)附加類,并將其與框架進(jìn)行有機(jī)的連接。
(7)調(diào)試和測試應(yīng)用程序。使用VisualC++工具鏈接、編譯和調(diào)試應(yīng)用程序,測試應(yīng)用程序的功能。8.2AppWizard生成的類和源文件使用MFCAppWizard[exe]創(chuàng)建應(yīng)用程序框架時(shí),首先創(chuàng)建一個(gè)程序員指定名稱的項(xiàng)目,然后為此項(xiàng)目生成若干個(gè)類和一系列的文件,并保存在以項(xiàng)目名為名稱的文件夾下。程序員在圖8-2中指定的應(yīng)用程序的類型不同,由向?qū)傻念愐灿兴煌?。缺省情況下,如果指定的應(yīng)用程序類型為單文檔界面應(yīng)用程序(SDI),則生成四個(gè)主要類和一個(gè)關(guān)于對話框類;若指定的是多文檔應(yīng)用程序(MDI),則生成五個(gè)主要類和一個(gè)關(guān)于對話框類;若指定的是基于對話框的應(yīng)用程序,則生成兩個(gè)主要類和一個(gè)關(guān)于對話框類。AppWizard生成的類名缺省時(shí)以字符“C”開頭,后接項(xiàng)目名,最后是類的種類標(biāo)識。應(yīng)用程序的功能主要分布在這些類中實(shí)現(xiàn),類之間通過公有成員函數(shù)來傳遞消息并進(jìn)行相互間的通信和數(shù)據(jù)交換。8.2.1應(yīng)用程序類應(yīng)用程序類CEX8_1App從CWinApp派生,其頭文件為EX8_1.h,實(shí)現(xiàn)文件為EX8_1.cpp。應(yīng)用程序類控制應(yīng)用程序的所有對象(文檔、視圖和框架窗口),并負(fù)責(zé)完成應(yīng)用程序的初始化、程序的啟動(dòng)和程序運(yùn)行結(jié)束時(shí)的清理工作。每個(gè)基于MFC的Windows應(yīng)用程序都必須有且只有一個(gè)從類CWinApp派生的派生類的全局對象,通過這個(gè)對象進(jìn)入應(yīng)用程序主函數(shù)WinMain并創(chuàng)建文檔、視圖和框架窗口對象。在應(yīng)用程序類CEX8_1App中重載了CWinApp類的虛函數(shù)InitInstance,由第7章已經(jīng)知道,在派生的應(yīng)用程序類中必須重載InitInstance函數(shù)。缺省時(shí),由AppWizard生成的InitInstance函數(shù)主要完成以下工作:
(1)在注冊表中注冊應(yīng)用程序。通過調(diào)用函數(shù)SetRegistryKey完成注冊。
(2)創(chuàng)建并注冊文檔模板。文檔模板用于存放與應(yīng)用程序的文檔、視圖和邊框窗口有關(guān)的信息。創(chuàng)建或打開文檔時(shí),應(yīng)用程序使用文檔模板創(chuàng)建文檔類對象來存放文檔,創(chuàng)建視圖類對象來顯示文檔,創(chuàng)建框架窗口類對象來容納標(biāo)題欄、菜單欄、工具欄和視圖窗口。
(3)處理命令行參數(shù)。應(yīng)用程序運(yùn)行時(shí),可以在命令行中指定參數(shù),例如指定打開的文件等。
(4)通過調(diào)用ShowWindow和UpdateWindow函數(shù)顯示和更新框架窗口。在此函數(shù)中,可以根據(jù)應(yīng)用程序的需要添加其它的初始化代碼。在應(yīng)用程序類中還有菜單“幫助”→“關(guān)于”命令的消息處理函數(shù)OnAppAbout,用于打開關(guān)于對話框。在文件EX8_1.cpp中定義了與關(guān)于對話框相關(guān)聯(lián)的對話框類CAboutDlg。8.2.2框架窗口類框架窗口類CMainFrame從CFrameWnd類派生,其頭文件為MainFrm.h,實(shí)現(xiàn)文件為MainFrm.cpp。它主要負(fù)責(zé)管理應(yīng)用程序窗口,創(chuàng)建并顯示標(biāo)題欄、菜單欄、工具欄和狀態(tài)欄。
AppWizard生成的框架窗口類中添加了對框架窗口創(chuàng)建時(shí)發(fā)送的消息WM_CREATE的處理函數(shù)OnCreate,在此函數(shù)中首先調(diào)用基類的OnCreate函數(shù),基類的OnCreate通過調(diào)用OnCreateClient創(chuàng)建視圖窗口對象,然后創(chuàng)建工具欄和狀態(tài)欄,并使工具欄成為可移動(dòng)的。在CMainFrame類中還重載了虛函數(shù)PreCreateWindow,此函數(shù)在創(chuàng)建框架窗口前由應(yīng)用程序框架調(diào)用??梢酝ㄟ^修改CREATESTRUCT結(jié)構(gòu)參數(shù)cs的值來改變窗口的默認(rèn)風(fēng)格,例如改變窗口大小和位置,修改窗口背景、光標(biāo)和圖標(biāo)等。8.2.3文檔類文檔類CEX8_1Doc從CDocument類派生,其頭文件為EX8_1Doc.h,實(shí)現(xiàn)文件為EX8_1Doc.cpp。它主要負(fù)責(zé)應(yīng)用程序數(shù)據(jù)的保存和裝載,實(shí)現(xiàn)文檔的序列化功能。文檔類CEX8_1Doc主要包含兩個(gè)成員函數(shù),一個(gè)是OnNewDocument,另一個(gè)是Serialize。當(dāng)用戶執(zhí)行“文件”→“新建”命令時(shí),MFC應(yīng)用程序框架會自動(dòng)調(diào)用OnNewDocument函數(shù);另外,在應(yīng)用程序啟動(dòng)時(shí)也會調(diào)用此函數(shù)。OnNewDocument函數(shù)主要用于初始化文檔。函數(shù)Serialize用來負(fù)責(zé)文檔數(shù)據(jù)的保存和讀取。8.2.4視圖類視圖類CEX8_1View是從CView派生的,其頭文件為EX8_1View.h,實(shí)現(xiàn)文件為EX8_1View.cpp。視圖類用于處理客戶區(qū)窗口,是框架窗口的一個(gè)子窗口,負(fù)責(zé)應(yīng)用程序數(shù)據(jù)的顯示以及如何進(jìn)行人機(jī)交互。在視圖類CEX8_1View中重載了基類CView的成員函數(shù)GetDocument,通過此函數(shù)可以獲取與此視圖窗口關(guān)聯(lián)的文檔類的指針m_pDocument。由于視圖窗口主要用來顯示文檔內(nèi)的數(shù)據(jù),因此通過此指針就可以訪問文檔類的數(shù)據(jù)成員和成員函數(shù)。
在視圖類CEX8_1View中還重載了基類CView的虛函數(shù)OnDraw。此函數(shù)被應(yīng)用程序框架調(diào)用,負(fù)責(zé)文檔數(shù)據(jù)在視圖窗口中的輸出。當(dāng)產(chǎn)生屏幕更新、打印和打印預(yù)覽消息時(shí),框架自動(dòng)調(diào)用此函數(shù)。實(shí)際上,在CView類的WM_PAINT消息處理函數(shù)OnPaint中調(diào)用了OnDraw函數(shù),因此,每當(dāng)視圖窗口需要更新時(shí)都會自動(dòng)調(diào)用OnDraw。如果用戶在應(yīng)用程序的視圖類中添加了對WM_PAINT的處理函數(shù),則用戶可以選擇是否調(diào)用OnDraw。例如例8.1中在OnDraw函數(shù)中添加了顯示文字的代碼。另外,在視圖類CEX8_1View中還重載了基類CView的三個(gè)虛函數(shù)OnPreparePrinting、OnBeginPrinting和OnEndPrinting,用來負(fù)責(zé)處理與打印預(yù)覽和打印有關(guān)的事務(wù)。三個(gè)函數(shù)中,只在OnPreparePrinting中調(diào)用了基類的同名函數(shù),其它兩個(gè)函數(shù)為空,需要用戶添加附加的初始化代碼和打印結(jié)束后的清理代碼。8.2.5對話框類對話框類CAboutDlg從CDialog派生,其定義和實(shí)現(xiàn)都在EX8_1.cpp文件中,當(dāng)執(zhí)行“幫助”→“關(guān)于”菜單命令時(shí),顯示關(guān)于程序版本信息的對話框。8.2.6其它文件除了生成主要類的源代碼文件外,AppWizard還生成為建立應(yīng)用程序所必需的其它文件:
(1)?Resource.h:資源頭文件,用于定義項(xiàng)目中所有資源的標(biāo)識符,給資源ID分配一個(gè)整數(shù)值。
(2)?StdAfx.h和StdAfx.cpp:標(biāo)準(zhǔn)包含文件,用于生成項(xiàng)目的預(yù)編譯頭文件(EX8_1.pch)和預(yù)編譯類型信息文件(StdAfx.obj)。預(yù)編譯文件用于提高項(xiàng)目的編譯速度。
(3)?EX8_1.clw:類向?qū)募娣庞蒑FCClassWizard使用的信息。利用ClassWizard類向?qū)砑有骂悺轭愄砑訑?shù)據(jù)成員和成員函數(shù)時(shí)要使用該文件,利用ClassWizard建立和編輯消息映射時(shí)也需要存儲在該文件中的信息。
(4)?EX8_1.rc:包含資源描述信息的資源文件。資源文件列出了應(yīng)用程序所有的資源,包括存儲在子目錄\res中的圖標(biāo)、位圖和光標(biāo)。一般利用VisualC++IDE的資源編輯器對資源進(jìn)行可視化編輯,也可以通過Open命令以文本方式打開一個(gè)資源文件進(jìn)行編輯。
(5)?res\EX8_1.rc2:包含不是由VisualC++資源編輯器編輯的資源。可以將所有不能由資源編輯器編輯的資源放置到該文件中。
(6)?res\EX8_1Doc.ico:文檔圖標(biāo)文件,一般顯示在多文檔界面程序的子窗口上,在SDI程序中不顯示該圖標(biāo)。
(7)?res\EX8_1.ico:應(yīng)用程序圖標(biāo)文件。在資源管理器中用此圖標(biāo)作為應(yīng)用程序的圖形標(biāo)識,在程序運(yùn)行后此圖標(biāo)將出現(xiàn)在主窗口標(biāo)題欄的最左端。
(8)?res\Toolbar.bmp:用于創(chuàng)建工具欄按鈕的位圖文件,該位圖是擁用程序工具欄中所有圖標(biāo)的圖形表示。可利用工具欄編輯器對該位圖進(jìn)行編輯。
(9)?EX8_1.dsp:項(xiàng)目文件,保存該項(xiàng)目有關(guān)源代碼文件、資源文件以及項(xiàng)目設(shè)置的有關(guān)信息。
(10)?EX8_1.dsw:項(xiàng)目工作區(qū)文件,保存上一次操作結(jié)束時(shí)VisualC++窗口的狀態(tài)、位置以及針對該項(xiàng)目工作區(qū)所做的設(shè)置信息。當(dāng)用戶需要打開某個(gè)項(xiàng)目時(shí),只需要利用VisualC++打開此文件即可。
(11)?Readme.txt:項(xiàng)目自述文件,該文件介紹了AppWizard所創(chuàng)建文件的內(nèi)容和功能,并告訴程序員在什么位置添加自己的代碼以及如何更改程序所用的語言。8.3項(xiàng)目和項(xiàng)目工作區(qū)在VisualC++中以項(xiàng)目(Project)的方式管理應(yīng)用程序的各個(gè)元素,一個(gè)程序?qū)?yīng)一個(gè)項(xiàng)目,項(xiàng)目通常位于項(xiàng)目工作區(qū)(Workspace)中。VisualC++的項(xiàng)目工作區(qū)可以容納多個(gè)項(xiàng)目。例如,如果你正在編寫一個(gè)動(dòng)態(tài)鏈接庫(DynamicLinkLibrary,DLL),則可以在項(xiàng)目工作區(qū)中為DLL創(chuàng)建一個(gè)項(xiàng)目,然后在同一項(xiàng)目工作區(qū)創(chuàng)建另一個(gè)項(xiàng)目來測試這個(gè)動(dòng)態(tài)鏈接庫。對于初學(xué)者,一般在一個(gè)項(xiàng)目工作區(qū)中只包含一個(gè)項(xiàng)目,在創(chuàng)建一個(gè)新的項(xiàng)目時(shí),如果VisualC++項(xiàng)目工作區(qū)窗口中有打開的項(xiàng)目,可以執(zhí)行“File”→“CloseWorkspace”菜單命令關(guān)閉當(dāng)前項(xiàng)目工作區(qū),或在創(chuàng)建新項(xiàng)目時(shí),在圖8-1所示的New對話框中選中“Createnewworkspace”選項(xiàng)。8.3.1項(xiàng)目在VisualC++的集成開發(fā)環(huán)境中,可以通過“File”→“New”菜單命令來創(chuàng)建一個(gè)新的項(xiàng)目。在圖8-1中可以發(fā)現(xiàn),VisualC++可以創(chuàng)建各種類型的項(xiàng)目,創(chuàng)建的每一個(gè)項(xiàng)目都會自動(dòng)生成一個(gè)項(xiàng)目文件,其后綴名為?.DSP。項(xiàng)目名是項(xiàng)目中其它文件命名的基礎(chǔ)。項(xiàng)目文件保存了該項(xiàng)目有關(guān)源代碼文件、資源文件以及項(xiàng)目設(shè)置的有關(guān)信息。項(xiàng)目是一些相互關(guān)聯(lián)的文件的集合,如類定義和實(shí)現(xiàn)的源代碼文件、資源文件等,這些文件被編譯、鏈接后,形成Windows應(yīng)用程序。8.3.2項(xiàng)目工作區(qū)項(xiàng)目工作區(qū)代表了特定項(xiàng)目的集合,每個(gè)工作區(qū)可以包含一個(gè)或多個(gè)項(xiàng)目。通過“Project”→“InsertProjectintoWorkspace”菜單命令,可以將不同的項(xiàng)目加入到同一個(gè)項(xiàng)目工作區(qū)。本書不涉及具有多個(gè)項(xiàng)目的項(xiàng)目工作區(qū)。每個(gè)項(xiàng)目工作區(qū)有一個(gè)項(xiàng)目工作區(qū)文件(文件名后綴為.DSW),它負(fù)責(zé)組織項(xiàng)目中的文件,保存項(xiàng)目描述內(nèi)容和設(shè)置信息??梢岳庙?xiàng)目工作區(qū)窗口去查看和訪問項(xiàng)目中的各種組件。創(chuàng)建一個(gè)項(xiàng)目的同時(shí),VisualC++為這個(gè)項(xiàng)目創(chuàng)建了一個(gè)缺省的項(xiàng)目工作區(qū),項(xiàng)目工作區(qū)可以采用如下方法進(jìn)行修改:
·通過“Project”→“Settings”菜單命令來對項(xiàng)目進(jìn)行設(shè)置。
·通過“Tools”菜單的“Options”或“Customize”命令來改變項(xiàng)目工作區(qū)的設(shè)置。利用“Options”對話框中的“Workspace”標(biāo)簽,可以定制不同的窗口、狀態(tài)欄以及項(xiàng)目工作區(qū)的其它部件。利用“Editor”標(biāo)簽,可以指定源代碼編輯器的有關(guān)設(shè)置。利用“Customize”對話框,可以重新布局、增加、減少工具欄按鈕以及菜單命令、鍵盤快捷鍵等。提示:關(guān)于項(xiàng)目工作區(qū)的詳細(xì)設(shè)置,可以通過在MSDN的索引中輸入關(guān)鍵字“Customizing”來查詢。8.3.3項(xiàng)目工作區(qū)窗口的使用當(dāng)創(chuàng)建一個(gè)新的項(xiàng)目或打開一個(gè)項(xiàng)目時(shí),這個(gè)項(xiàng)目成為當(dāng)前項(xiàng)目。在VisualC++的集成開發(fā)環(huán)境窗口中,缺省時(shí)會打開一個(gè)項(xiàng)目工作區(qū)窗口,如圖8-11所示。對于Win32控制臺應(yīng)用程序項(xiàng)目,項(xiàng)目工作區(qū)窗口下有“ClassView”和“FileView”兩個(gè)標(biāo)簽;對于Windows應(yīng)用程序項(xiàng)目,窗口下多一個(gè)“ResourceView”標(biāo)簽。可以通過以下方式控制項(xiàng)目工作區(qū)窗口:
·如果在VisualC++集成開發(fā)環(huán)境中沒有項(xiàng)目工作區(qū)窗口,可以執(zhí)行“View”→“Workspace”菜單命令。
·單擊項(xiàng)目工作區(qū)窗口右上角的關(guān)閉按鈕“×”,可以關(guān)閉項(xiàng)目工作區(qū)窗口。
·單擊工具欄上的Workspace按鈕,可以讓窗口在可見與不可見之間轉(zhuǎn)換。圖8-11項(xiàng)目工作區(qū)窗口
1.?ClassView的使用單擊項(xiàng)目工作區(qū)窗口的“ClassView”標(biāo)簽,窗口中將以樹型結(jié)構(gòu)顯示項(xiàng)目中所包含的C++類及類成員的列表,如圖8-11所示。在每個(gè)類的成員(數(shù)據(jù)成員和成員函數(shù))左側(cè)都有一個(gè)小圖標(biāo),這個(gè)圖標(biāo)給出了成員類型(數(shù)據(jù)成員和成員函數(shù))以及訪問權(quán)限。各種圖標(biāo)的含義如表8-1所示。表8-1ClassView中各圖標(biāo)的含義圖標(biāo)(方塊為藍(lán)色)含義圖標(biāo)(方塊為紫色)含義公有數(shù)據(jù)成員公有成員函數(shù)保護(hù)數(shù)據(jù)成員保護(hù)成員函數(shù)私有數(shù)據(jù)成員私有成員函數(shù)通過ClassView,可以方便地查看和編輯源代碼文件,給類添加數(shù)據(jù)成員和成員函數(shù)以及在項(xiàng)目中添加新類。操作方法如下:
·單擊每個(gè)類名前的可以展開類,查看類的成員,單擊類名前的可以折疊。
·雙擊類名可以打開類定義的頭文件(?.h),光標(biāo)停留在類聲明開始處。
·雙擊成員函數(shù)可以打開程序代碼,光標(biāo)定位于類的成員函數(shù)的實(shí)現(xiàn)代碼處。
·在ClassView中添加新類的方法:右擊項(xiàng)目工作區(qū)窗口頂部的項(xiàng)目名,在彈出的快捷菜單中選擇“NewClass”命令,在“NewClass”對話框中指定類名和基類,單擊“OK”按鈕。
·右擊類名,彈出如圖8-12所示的快捷菜單,可以在類中添加數(shù)據(jù)成員、成員函數(shù),重載虛函數(shù)和添加消息處理等。圖8-12右擊類的快捷菜單
·右擊成員函數(shù),彈出如圖8-13所示的快捷菜單,可以刪除函數(shù),查看函數(shù)的定義和聲明等。
圖8-13右擊成員函數(shù)的快捷菜單
2.?FileView的使用單擊項(xiàng)目工作區(qū)窗口下的“FileView”標(biāo)簽,項(xiàng)目工作區(qū)窗口將以樹形結(jié)構(gòu)分類顯示項(xiàng)目中的文件,如圖8-14所示?!癋ileView”的使用方法如下:
·雙擊文件名可以打開此文件。
·右擊文件名,彈出快捷菜單,可以進(jìn)行項(xiàng)目設(shè)置、編譯文件和查看文件屬性等。圖8-14項(xiàng)目工作區(qū)窗口的“FileView”標(biāo)簽
3.?ResourceView的使用單擊項(xiàng)目工作區(qū)窗口下的“ResourceView”標(biāo)簽,項(xiàng)目工作區(qū)窗口中顯示一個(gè)由不同類型的資源文件組成的樹形結(jié)構(gòu),如圖8-15所示。使用ResourceView不僅可以查看已經(jīng)存在的資源,還可以實(shí)現(xiàn)對資源的編輯、創(chuàng)建新的資源和導(dǎo)入資源。圖8-15項(xiàng)目工作區(qū)窗口的“ResourceView”標(biāo)簽
·查看資源。展開需要查看資源的文件夾,雙擊資源的ID,VisualC++自動(dòng)以合適的編輯器打開這項(xiàng)資源。例如,想要查看菜單資源,先展開“Menu”文件夾,雙擊菜單資源的ID(IDR_MAINFRAME),VisualC++自動(dòng)用菜單編輯器打開此菜單資源。
·資源的編輯。按查看資源的步驟打開欲編輯的資源,然后在相應(yīng)的資源編輯器中編輯和修改。
·資源的創(chuàng)建。要在項(xiàng)目中添加一個(gè)新的資源,可以執(zhí)行“Insert”→“Resource”菜單命令,在彈出的“InsertResource”對話框中,雙擊需要?jiǎng)?chuàng)建的資源。另外,在項(xiàng)目工作區(qū)窗口的“ResourceView”標(biāo)簽中,右擊項(xiàng)目名或文件夾名,會出現(xiàn)快捷菜單,執(zhí)行“Insert”命令也會打開“InsertResource”對話框。
·資源的刪除。在“ResourceView”標(biāo)簽中選中要?jiǎng)h除的資源,按下“Delete”鍵,即可刪除這個(gè)資源。8.4ClassWizard
在開發(fā)一個(gè)基于MFC的Windows應(yīng)用程序時(shí),AppWizard只使用一次。當(dāng)創(chuàng)建完應(yīng)用程序框架后,程序員所要做的工作就是為應(yīng)用程序特定的功能添加代碼。當(dāng)需要為應(yīng)用程序添加消息處理函數(shù)和對話框控件的成員變量,或者為程序添加新的MFC派生類時(shí),需要使用ClassWizard類向?qū)?。ClassWizard就像程序員的助手,是進(jìn)行MFC應(yīng)用程序設(shè)計(jì)時(shí)必不可少的工具。當(dāng)打開一個(gè)項(xiàng)目或創(chuàng)建一個(gè)新的項(xiàng)目后,“View”菜單中會出現(xiàn)“ClassWizard”菜單項(xiàng),這時(shí)才能使用ClassWizard類向?qū)?。?zhí)行“View”→“ClassWizard”菜單命令或按“Ctrl+W”快捷鍵,打開如圖8-16所示的“MFCClassWizard”對話框。圖8-16ClassWizard類向?qū)υ捒颉癕FCClassWizard”對話框共有五個(gè)標(biāo)簽:“MessageMaps”用來處理消息映射,為消息添加或刪除處理函數(shù),查看已被處理的消息并定位消息處理函數(shù)代碼;“MemberVariables”標(biāo)簽用來給對話框控件添加或刪除變量;“Automation”標(biāo)簽提供了OLE自動(dòng)化的屬性和方法的管理;“ActiveXEvents”標(biāo)簽用于管理ActiveX類所支持的ActiveX事件;“ClassInfo”標(biāo)簽顯示應(yīng)用程序中所包含類的信息,如類的頭文件、實(shí)現(xiàn)文件和基類信息等。在“MFCClassWizard”對話框中,經(jīng)常使用的是“MessageMaps”和“MemberVariables”標(biāo)簽。
“MFCClassWizard”對話框中的“MessageMaps”標(biāo)簽主要用于消息映射和為類重載虛函數(shù)。“MessageMaps”標(biāo)簽下,“Project”列表框列出了當(dāng)前項(xiàng)目工作區(qū)中項(xiàng)目的名稱;“Classname”下拉列表框列出了當(dāng)前項(xiàng)目中的類;“ObjectIDs”列表框列出了能產(chǎn)生消息的對象的ID,這些消息能在當(dāng)前類中進(jìn)行消息處理,如菜單項(xiàng)、對話框控件等,一般第一項(xiàng)為當(dāng)前類的類名;“Messages”列表框列出了在“ObjectIDs”框中選擇的對象可處理的消息和可重載的MFC虛函數(shù);“Memberfunctions”框列出了所選擇類中已添加的消息處理函數(shù)和已重載的虛函數(shù),函數(shù)前的“V”標(biāo)記表示該函數(shù)為虛函數(shù),“W”標(biāo)記表示該函數(shù)為消息處理函數(shù)。8.4.1添加消息處理函數(shù)下面結(jié)合例8.1,學(xué)習(xí)利用ClassWizard類向?qū)砑酉⑻幚砗瘮?shù)的方法。當(dāng)例8.1啟動(dòng)時(shí),在視圖窗口的客戶區(qū)域中央顯示一字符串,在客戶區(qū)域單擊鼠標(biāo)左鍵,以鼠標(biāo)指針點(diǎn)為中心,畫一個(gè)圓。
(1)若例8.1的項(xiàng)目不是當(dāng)前項(xiàng)目,則應(yīng)先打開此項(xiàng)目。執(zhí)行“File”→“Open”菜單命令,在“打開”對話框中查找到項(xiàng)目工作空間文件“EX8_1.dsw”,單擊“打開”按鈕。
(2)執(zhí)行“View”→“ClassWizard”菜單命令,彈出“MFCClassWizard”對話框。
(3)選擇“MessageMaps”標(biāo)簽,在“Project”列表框中選中項(xiàng)目“EX8_1”,在“Classname”列表框中選擇添加消息處理函數(shù)的類。例8.1中由視圖窗口處理鼠標(biāo)左鍵按下的消息WM_LBUTTONDOWN,因此,選擇視圖類“CEX8_1View”。在“ObjectIDs”列表框中選擇“CEX8_1View”,在“Messages”列表框中選擇消息“WM_LBUTTONDOWN”,然后單擊“AddFunction”按鈕(或雙擊消息名),則在“Memberfunctions”列表框中添加相應(yīng)的函數(shù)名“OnLButtonDown”和消息映射項(xiàng)“ON_WM_LBUTTONDOWN”。
(4)在“Memberfunctions”列表框中選擇消息處理函數(shù)“OnLButtonDown”,單擊“EditCode”按鈕,關(guān)閉對話框,VisualC++代碼窗口自動(dòng)打開此消息處理函數(shù),以便在消息處理函數(shù)中添加代碼。在消息處理函數(shù)“OnLButtonDown”中添加如下代碼:
voidCEX8_1View::OnLButtonDown(UINTnFlags,CPointpoint)
{ CClientDCdc(this); CRectrect(point.x-50,point.y-50,point.x+50,point.y+50); dc.Ellipse(rect); CView::OnLButtonDown(nFlags,point);
}
說明:其中的黑體為手工添加的代碼,其它為ClassWizard自動(dòng)生成的函數(shù)結(jié)構(gòu)和注釋。在本書后面也一樣,黑體為手工添加的代碼,其它為AppWizard或ClassWizard等向?qū)ё詣?dòng)生成的。8.4.2編輯消息處理函數(shù)在例7.2中,為了使應(yīng)用程序啟動(dòng)時(shí)自動(dòng)在窗口客戶區(qū)域顯示字符串,在框架窗口類中添加了消息WM_PAINT的處理函數(shù)。在AppWizard生成的應(yīng)用程序框架中,框架窗口作為菜單、工具欄、狀態(tài)欄和視圖窗口的容器,框架窗口的客戶區(qū)域被它們所覆蓋,用戶一般直接與視圖窗口進(jìn)行交互。在MFC的視圖類CView中,已經(jīng)添加了消息WM_PAINT的處理函數(shù),如下所示:
voidCView::OnPaint()
{ CPaintDCdc(this); OnPrepareDC(&dc); OnDraw(&dc);
}該函數(shù)缺省調(diào)用了CView類的虛函數(shù)OnDraw。OnDraw除了支持顯示器外,還支持打印機(jī)。因此,在AppWizard生成的應(yīng)用程序框架中,一般不再重載OnPaint消息處理函數(shù),只需要在重載的OnDraw中添加相應(yīng)的代碼即可。當(dāng)產(chǎn)生WM_PAINT消息時(shí),系統(tǒng)會自動(dòng)調(diào)用OnDraw函數(shù)。在例8.1的視圖類CEX8_1View的函數(shù)OnDraw中添加代碼,當(dāng)應(yīng)用程序啟動(dòng)時(shí),在視圖窗口中央顯示字符串“歡迎學(xué)習(xí)MFC!”,操作步驟如下:
(1)執(zhí)行“View”→“ClassWizard”菜單命令,打開“MFCClassWizard”對話框。
(2)在“Classname”下選中消息處理函數(shù)所在的類(例8.1中函數(shù)OnDraw在類CEX8_1View中,選中CEX8_1View);在“Memberfunctions”列表框中選擇要編輯的消息處理函數(shù),單擊“EditCode”按鈕(或直接雙擊消息處理函數(shù)),則自動(dòng)跳轉(zhuǎn)到消息處理函數(shù)的開始處,可以直接添加相應(yīng)的代碼。在例8.1的CEX8_1View::OnDraw函數(shù)中添加如下代碼(黑體代碼):
voidCEX8_1View::OnDraw(CDC*pDC)
{ CEX8_1Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere
CRectrect;
GetClientRect(&rect);
pDC->DrawText(_T("歡迎學(xué)習(xí)MFC!"),-1,&rect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}
執(zhí)行“Buld”→“Buld”菜單命令(或按F7快捷鍵)編譯、鏈接程序。例8.1運(yùn)行的結(jié)果如圖8-17所示。圖8-17例8.1的運(yùn)行結(jié)果編輯消息處理函數(shù)也可以使用項(xiàng)目工作區(qū)窗口的“ClassView”標(biāo)簽,展開消息處理函數(shù)所在的類,雙擊函數(shù)名,則VisualC++自動(dòng)打開消息處理函數(shù),光標(biāo)定位在函數(shù)上。8.4.3刪除消息處理函數(shù)利用ClassWizard刪除消息處理函數(shù)的過程如下:
(1)在“MFCClassWizard”對話框中選擇“Messa
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 富平廚房施工方案(3篇)
- 炊事車應(yīng)急預(yù)案(3篇)
- 物聯(lián)網(wǎng)應(yīng)急預(yù)案(3篇)
- 電工排水施工方案(3篇)
- 砌塊施工方案大全(3篇)
- 管網(wǎng)交叉施工方案(3篇)
- 結(jié)構(gòu)雨棚施工方案(3篇)
- 船運(yùn)防汛應(yīng)急預(yù)案(3篇)
- 虛脫患者應(yīng)急預(yù)案(3篇)
- 道路詳細(xì)施工方案(3篇)
- 維修工作計(jì)劃模板范文
- DB13(J)-T 8401-2021 鋼絲網(wǎng)片復(fù)合保溫板應(yīng)用技術(shù)標(biāo)準(zhǔn)
- 設(shè)計(jì)公司部門領(lǐng)導(dǎo)發(fā)言稿
- 深圳科技館新館展教工程常設(shè)展區(qū)整體展教方案
- 《重慶市北碚區(qū)高標(biāo)準(zhǔn)農(nóng)田建設(shè)規(guī)劃2021-2030年》
- T-CI 451-2024 構(gòu)網(wǎng)型光伏變換器并網(wǎng)技術(shù)規(guī)范
- 《公路工程預(yù)算定額》(JTGT3832-2018)
- 粵港車牌合同模板
- 中級(監(jiān)控類) 消防設(shè)施操作員理論考試題及答案
- 分體電動(dòng)門培訓(xùn)課件
評論
0/150
提交評論