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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第12章

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

2.向導(Wizard)向導是一個通過一步步的幫助引導你工作的工具。DeveloperStudio中包含三個向導。

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

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

(1)自動語法。

(2)自動縮進。

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

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

(5)拖放編輯。

(6)自動錯誤定位。

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

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

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

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

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

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

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

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

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

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

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

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

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

(4)解鎖內存,應用程序將對該內存的控制交予Windows。

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

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

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

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

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

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

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

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

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

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

MFC可分為兩個主要部分:①基礎類;39①基礎類;MFC中的類按功能來分可劃分為以下幾類:基類、應用程序框架類、應用程序類、命令相關類、文檔/視圖類、線程類、可視對象類、窗口類、視圖類、對話框類、屬性表

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

Microsoft基本宏和全程函數(shù)提供以下功能:數(shù)據(jù)類型、運行時刻對象類型服務、診斷服務、異常處理、CString格式化及信息框顯示、消息映射、應用消息和管理、對象連接和嵌入(OLE)服務、標準命令和WindowsIDs。約定:全程函數(shù)以“Afx”為前綴,所有全程變量都是以“Afx”為前綴,宏不帶任何特別前綴,但是全部大寫。②宏和全程函數(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類為派生類提供了下述服務:

(1)對象診斷。(2)運行時訪問類的信息。

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

CObject類為派生類提供了下述服務:(1)對象診斷。45下面舉個具體的例子來說明MFC所提供的應用程序框架,程序如例12-2所示。例12-2:應用程序框架示例。

#include<afxwin.h>//derivedanapplicationclassclassCMinMFCApp:publicCWinApp{public:BOOLInitInstance();};//DerivethemainwindowclassclassCMainWindow:publicCFrameWnd{下面舉個具體的例子來說明MFC所提供的應用程序框架,程序如例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應用程序框架MFCAppWizard生成的應用程序包含以下要素。

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

(2)應用程序類CMyFirstApp。該類的每一個對象代表一個應用程序。

(3)應用程序啟動。

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

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

(6)CMainFrame類。

(7)文檔與視圖類。

(8)關閉應用程序。

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

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

1.MFC對消息的處理MFC不使用用C語言編寫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相應的消息映射如下:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_CREATE()ON_MESSAGE(CM_APPLE,CMApple)ON_MESSAGE(CM_ORANGE,CMOrange)ON_WM_CLOSE()END_MESSAGE_MAP()相應的消息映射如下:552.消息的發(fā)送Windows應用程序允許應用程序向自己發(fā)送消息、向其他應用程序發(fā)送消息,甚至可以向Windows操作系統(tǒng)本身發(fā)送消息(比如要求關閉操作系統(tǒng)或重新啟動操作系統(tǒng))。Windows提供了三個API函數(shù)用于發(fā)送消息,這三個函數(shù)是:SendMessage()、PostMessage()和SendDlgItemMessage()。2.消息的發(fā)送Windows應用程序允許應用程序向自己發(fā)送消56SendMessage()用于向窗口發(fā)送消息,該函數(shù)說明如下:

LRESULTSendMessage(HWNDhWnd, //消息要發(fā)往的窗口的句柄UINTMsg, //要發(fā)送的消息WPARAMwParam, //消息的第一個參數(shù)LPARAMlParam //消息的第二個參數(shù));SendMessage()用于向窗口發(fā)送消息,該函數(shù)說明如下57PostMessage()函數(shù)說明如下:BOOLPostMessage(HWNDhWnd,//消息發(fā)往的窗口UINTMsg,//要發(fā)送的消息WPARAMwParam,//消息的第一個參數(shù)LPARAMlParam//消息的第二個參數(shù));PostMessage()函數(shù)說明如下:BOOLPostM58SendDlgItemMessage()函數(shù)用于向對話框的某個控制發(fā)送消息,函數(shù)聲明如下:

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

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

2.向導(Wizard)向導是一個通過一步步的幫助引導你工作的工具。DeveloperStudio中包含三個向導。

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

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

(1)自動語法。

(2)自動縮進。

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

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

(5)拖放編輯。

(6)自動錯誤定位。

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

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

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

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

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

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

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

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

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

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

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

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

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

(4)解鎖內存,應用程序將對該內存的控制交予Windows。

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

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

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

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

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

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

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

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

Microsoft提供了一個基礎類庫MFC,其中包含用來開發(fā)C++和C++Windows應用程序的一組類?;A類庫的核心是以C++形式封裝了大部分的WindowsAPI。類庫表示窗口、對話框、設備上下文、公共GDI對象如畫筆、調色板、控制框和其他標準的Windows部件。這些類提供了一個面向Windows中結構的簡單的C++成員函數(shù)的接口。12.5.1MFC類庫概念和組成類庫是一個可以在應用中使98MFC可分為兩個主要部分:

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

MFC可分為兩個主要部分:①基礎類;99①基礎類;MFC中的類按功能來分可劃分為以下幾類:基類、應用程序框架類、應用程序類、命令相關類、文檔/視圖類、線程類、可視對象類、窗口類、視圖類、對話框類、屬性表

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

Microsoft基本宏和全程函數(shù)提供以下功能:數(shù)據(jù)類型、運行時刻對象類型服務、診斷服務、異常處理、CString格式化及信息框顯示、消息映射、應用消息和管理、對象連接和嵌入(OLE)服務、標準命令和WindowsIDs。約定:全程函數(shù)以“Afx”為前綴,所有全程變量都是以“Afx”為前綴,宏不帶任何特別前綴,但是全部大寫。②宏和全程函數(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類為派生類提供了下述服務:

(1)對象診斷。(2)運行時訪問類的信息。

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

CObject類為派生類提供了下述服務:(1)對象診斷。105下面舉個具體的例子來說明MFC所提供的應用程序框架,程序如例12-2所示。例12-2:應用程序框架示例。

#include<afxwin.h>//derivedanapplicationclassclassCMinMFCApp:publicCWinApp{public:BOOLInitInstance();};//DerivethemainwindowclassclassCMainWindow:publicCFrameWnd{下面舉個具體的例子來說明MFC所提供的應用程序框架,程序如例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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論