Visual C++ 2005編程

?

Windows編程其實(shí)不難。通過本書的全面學(xué)習(xí),你會(huì)發(fā)現(xiàn)Visual C++ 2005會(huì)讓你的Windows編程之路變得更加得寬敞。在你的學(xué)習(xí)之路上,唯一的障礙就是:在你接觸Windows編程的各種細(xì)節(jié)之前,你必須要全面系統(tǒng)的學(xué)習(xí)C++的語言特性,特別是C++的面向?qū)ο笤O(shè)計(jì)技術(shù)。Visual C++ 2005提供了很多的Windows編程工具,而面向?qū)ο蠹夹g(shù)在這些工具中的作用是非常重要的。本書就將要帶你學(xué)習(xí)、理解、掌握這些技術(shù)。

?

通過本章的學(xué)習(xí),將使你對(duì) C++ 編寫應(yīng)用程序的一些基本概念有一個(gè)整體的了解。 Visual C++ 2005 集成開發(fā)環(huán)境( IDE )的各種操作都非常簡單、易懂,因此將通過對(duì) IDE 的快速瀏覽使你學(xué)習(xí)到大部分的操作。熟悉 IDE 的最好方法就是創(chuàng)建、編譯、執(zhí)行一個(gè)簡單的程序來實(shí)踐。到本章結(jié)束,你會(huì)學(xué)習(xí)到:

?????? · ??? Visual C++ 2005 的主要組件是什么?

?????? · ??? .Net 框架由什么組成?它具有什么優(yōu)勢?

?????? · ??? 什么是解決方案和工程以及如何創(chuàng)建?

?????? · ??? 控制臺(tái)程序相關(guān)知識(shí)

?????? · ??? 如何創(chuàng)建、編輯程序?

?????? · ??? 如何編譯、鏈接、執(zhí)行 C++ 控制臺(tái)程序?

?????? · ??? 如何創(chuàng)建、執(zhí)行基本的 Windows 程序?

?

好了,打開你的PC,啟動(dòng)Windows,在功能強(qiáng)大的Visual C++ 2005中開始我們的Window編程之旅!

?

.Net框架

?

.Net框架是微軟.Net開發(fā)產(chǎn)品的中心概念,當(dāng)然也包括Visual C++ 2005。.Net框架由兩部分組成:應(yīng)用程序執(zhí)行宿主-通用語言運(yùn)行時(shí)(CLR)和.Net框架類庫集合。當(dāng)代碼在CLR環(huán)境下執(zhí)行時(shí),.Net框架類提供了函數(shù)功能支持,不管我們的代碼是何種語言編寫的。所以,使用C++、C#和其他支持.Net框架的語言編寫應(yīng)用程序都可以使用相同的類庫。

?

Visual C++ 2005中,可以編寫兩種基本不同類型的C++程序:一種是在本地計(jì)算機(jī)上直接運(yùn)行的程序,此類C++符合ISO/ANSI語言標(biāo)準(zhǔn),被稱為本地C++程序;另一種就是在CLR控制下運(yùn)行的程序,此類C++是ISO/ANSI語言標(biāo)準(zhǔn)的一個(gè)擴(kuò)展,被稱為C++/CLI。它們通常也稱為CLR程序或者C++/CLI程序。

?

嚴(yán)格上說,.Net框架并不屬于Visual C++ 2005,而是Windows操作系統(tǒng)為了幫助快速建立應(yīng)用程序和Web Services而包含的組件。.Net框架不但在代碼的可靠性、安全性上有非常大的優(yōu)勢,而且可以把C++和20多種支持.Net框架的語言進(jìn)行混合編程。.Net框架的一個(gè)不利之處就是程序的性能下降,不過這種性能下降在大多數(shù)環(huán)境是可以忽略的。

?

通用語言運(yùn)行時(shí) (CLR)

?

對(duì)于很多用高級(jí)語言(Visual Basic、C#、C++等)編寫的程序,它們都是在CLR標(biāo)準(zhǔn)環(huán)境中執(zhí)行的。CLR已經(jīng)作為通用語言規(guī)范(CLI)的一種被收錄到歐洲計(jì)算機(jī)制造商協(xié)會(huì)(ECMA)標(biāo)準(zhǔn)ECMA-355之中,并在進(jìn)一步完善以符合ISO標(biāo)準(zhǔn)(ISO/IEC 23271)。所以CLR是CLI的一種實(shí)現(xiàn)。這就是為什么CLR下的C++被寫為C++/CLI,它是通用語言結(jié)構(gòu)下的特殊C++。因此在其他操作系統(tǒng)上可能會(huì)看到實(shí)現(xiàn)CLI的C++/CLI編譯器。

?

ECMA的所有標(biāo)準(zhǔn)信息都可以在 http://www.ecma-international.org 得到。ECMA-335現(xiàn)在可以免費(fèi)下載。

?

CLI是虛擬機(jī)中一個(gè)非常重要的規(guī)范,它允許不同高級(jí)語言編寫的應(yīng)用程序,在不修改和編譯源代碼的條件下直接在不同的系統(tǒng)環(huán)境中執(zhí)行。在編譯高級(jí)語言時(shí),CLI為虛擬機(jī)指定了標(biāo)準(zhǔn)的中間語言。在.Net框架中,中間語言被稱為微軟中間語言(MSIL)。中間語言的代碼最后在執(zhí)行時(shí)被及時(shí)映射到機(jī)器代碼運(yùn)行。當(dāng)然,在CLI中間語言里的代碼也可以在其他擁有CLI實(shí)現(xiàn)的環(huán)境被執(zhí)行。

?

CLI 也定義一個(gè)通用的數(shù)據(jù)類型集,稱為通用類型系統(tǒng)( CTS ),可以被所有面向 CLI 實(shí)現(xiàn)的語言使用。 CTS 說明了如何在 CLR 中使用這些類型,同時(shí)包含了一個(gè)預(yù)定義類型集。

我們也可以定義自己的數(shù)據(jù)類型,定義的方法必須和CLR的說明保持一致。你會(huì)發(fā)現(xiàn),通過標(biāo)準(zhǔn)化的數(shù)據(jù)類型系統(tǒng)描述數(shù)據(jù),允許不同語言編寫的組件采用統(tǒng)一的方法處理數(shù)據(jù)。同時(shí)讓不同語言的組件集成到一個(gè)應(yīng)用程序變?yōu)榭赡堋?/span>

?

CLR主要通過兩個(gè)方面大大提高了數(shù)據(jù)安全性和程序可靠性:一是動(dòng)態(tài)內(nèi)存的分配和釋放都是自動(dòng)完成的;二是在程序執(zhí)行前程序的MSIL代碼會(huì)進(jìn)行全面的檢測和驗(yàn)證。CLR也僅僅是CLI規(guī)范在Windows PC上的一種實(shí)現(xiàn),在其他的操作系統(tǒng)和硬件平臺(tái)上,肯定有不同的CLI實(shí)現(xiàn)。有時(shí)你會(huì)發(fā)現(xiàn)CLI和CLR兩個(gè)術(shù)語被交替使用,盡管它們是非常明顯的不同。CLI是標(biāo)準(zhǔn)規(guī)范,CLR是微軟實(shí)現(xiàn)的一種CLI。

?

編寫C++應(yīng)用程序

?

Visual C++ 2005中,可以開發(fā)的程序和組件類型非常多。正如在本章前面提到過的兩種基本W(wǎng)indows程序類型:一種是代碼和CLR一起執(zhí)行;一種是代碼直接編譯為機(jī)器碼然后在本地執(zhí)行。在面向CLR基于窗口的程序中,可以采用.Net框架提供的Windows Forms作為GUI的基礎(chǔ)。Windows Forms可以進(jìn)行快速的GUI開發(fā),因?yàn)樗梢院芊奖愕募尤霕?biāo)準(zhǔn)組件。同時(shí)完全自動(dòng)生成代碼。然后就可以按需修改生成的代碼以滿足我們不同的需要。

?

對(duì)于本地執(zhí)行的代碼,有多種操作方法??梢允褂梦④浕A(chǔ)類(MFC)編寫窗口程序的圖形用戶接口(GUI)。MFC封裝了Windows操作系統(tǒng)的應(yīng)用程序編程接口(API),實(shí)現(xiàn)了GUI的創(chuàng)建和控制,大大減少的程序開發(fā)的過程。如果是現(xiàn)在寫的Windows API,它肯定被期望是面向?qū)ο蟮模驗(yàn)樗菴++的出現(xiàn)早很多年,所以它不具有面向?qū)ο蟮奶卣鳌.?dāng)然,誰也不會(huì)強(qiáng)逼你使用MFC,如果你想要更高的效率,那么自己用C++代碼調(diào)用API函數(shù)吧!

?

CLR一些執(zhí)行的C++代碼被稱為托管C++,因?yàn)閿?shù)據(jù)和代碼都是CLR管理的。在CLR程序中,存儲(chǔ)數(shù)據(jù)動(dòng)態(tài)分配的內(nèi)存被自動(dòng)釋放,因此它消除了本地C++程序中常出現(xiàn)的資源泄漏錯(cuò)誤。而部分在CLR外執(zhí)行的代碼被稱為非托管C++,CLR與它們的執(zhí)行沒有明顯的關(guān)系。在非托管C++必須小心分配和釋放內(nèi)存的所有方面,非托管C++也被稱為本地C++,因?yàn)樗鼈兪潜恢苯泳幾g為本地的機(jī)器碼。

1 1 說明了開發(fā) C++ 應(yīng)用程序的基本過程

o_1-1.jpg
1-1

1-1并沒有覆蓋所有的內(nèi)容。應(yīng)用可以既有托管C++又有非托管C++,因此沒有必要把一種環(huán)境強(qiáng)制和其他的混入一起。當(dāng)然,使用混合代碼會(huì)有某些方面的損失。所以只在必要時(shí)選擇混合編碼,如轉(zhuǎn)換已有的本地C++代碼,讓其和CLR一些執(zhí)行時(shí)。在本地C++代碼肯定不會(huì)有托管C++的一些固有特性。這些特性在托管、非托管代碼組件通信相關(guān)方面可以很明顯的看到。但是,當(dāng)需要開發(fā)或者擴(kuò)展已有的非托管代碼,同時(shí)希望獲得使用CLR的優(yōu)勢時(shí),這種混合托管、非托管代碼的能力是非常重要的。當(dāng)然,在一個(gè)新的應(yīng)用程序開始時(shí)就應(yīng)該考慮是否希望使用托管C++。

?

學(xué)習(xí)Windows編程

?

Windows下的交互式應(yīng)用程序至少包含兩個(gè)方面的內(nèi)容:一是編碼創(chuàng)建用戶交互的圖形用戶接口(GUI);二是編碼處理交互操作以實(shí)現(xiàn)應(yīng)用程序的功能。Visual C++ 2005為Windows程序開發(fā)的這兩個(gè)方面都提供了大量的輔助功能。正如你在本章后面看到的:可以不編寫任何代碼而創(chuàng)建一個(gè)帶GUI的Windows程序。Visual C++ 2005會(huì)自動(dòng)生成創(chuàng)建GUI的基本代碼。但是,我們需要很好的理解這些自動(dòng)生成的代碼,因?yàn)槲覀円谶@些代碼的基礎(chǔ)上進(jìn)行擴(kuò)展、修改以滿足我們所需。而這項(xiàng)工作就要求全面、充分的理解C++。

?

考慮到上面提到的要求,所以最好先學(xué)C++――包括本地C++和C++/CLI兩個(gè)語言版本,而暫時(shí)不涉及Windows編程相關(guān)的東西。在掌握了C++后,就可以快速的學(xué)習(xí)基于C++/CLI和C++的Windows編程。這就意味著學(xué)習(xí)C++的時(shí)候只是使用一些命令行相關(guān)的輸入、輸出程序。通過只使用命令行簡單的輸入、輸出功能,我們就可以集中精力研究C++語言如何工作,避免一些不必要的GUI創(chuàng)建和控制。掌握C++以后,你就會(huì)發(fā)現(xiàn)用C++開發(fā)Windows應(yīng)用程序是多么的容易,也是一種自然的過渡過程。

?

學(xué)習(xí)C++

?

Visual C++ 2005 全面支持兩種不同標(biāo)準(zhǔn)定義的 C++ 語言:

?????? ??? ISO/ANSI C++ 標(biāo)準(zhǔn),支持本地應(yīng)用程序-非托管 C++ 。此版 C++ 在大多數(shù)的 計(jì)算機(jī)平臺(tái)都支持。

??? ? C++/CLI標(biāo)準(zhǔn),支持基于CLR的應(yīng)用程序,是ISO/ANSI C++的擴(kuò)展。

本書的第二章到第十章講述C++語言。因?yàn)镃++/CLI是ISO/ANSI C++的擴(kuò)展,每章的第一部分講述ISO/ANSI C++語言元素;第二部分講述C++/CLI的附加特性。

?

編寫C++/CLI程序可以充分利用.Net框架的作用,而這是ISO/ANSI C++程序不可能有的。雖然C++/CLI是ISO/ANSI C++的擴(kuò)展,但是C++/CLI程序必須符合CLR的要求,因?yàn)檫@些程序要在CLR環(huán)境下執(zhí)行的。也許看到這里,你心里也有了結(jié)論:ISO/ANSI C++提供的內(nèi)存動(dòng)態(tài)分配和釋放與CLR是不兼容的。程序中必須使用CLR的內(nèi)存管理機(jī)制,這就意味著必須用C++/CLI類而不能用本地C++類。

?

C++語言標(biāo)準(zhǔn)

?

美國國家標(biāo)準(zhǔn)委員會(huì)(ANSI)出版的ISO/IEC 14882文檔定義了ISO/ANSI標(biāo)準(zhǔn)。到1998年,ISO/ANSI 標(biāo)準(zhǔn)C++已經(jīng)制定了非常完善的C++語言版本。并且得到了大多數(shù)的硬件平臺(tái)和操作系統(tǒng)的支持。用ISO/ANSI C++編寫的程序可以很容易移植到其它相當(dāng)?shù)南到y(tǒng)環(huán)境,但是即便如此,程序中使用的庫函數(shù)會(huì)決定移植的困難度,特別是建立圖形用戶接口的函數(shù)。標(biāo)準(zhǔn)ISO/ANSI C++是很多專業(yè)程序員的首選,不但得到了廣泛的支持,也是迄今為止功能最強(qiáng)大的編程語言。

?

C++語言標(biāo)準(zhǔn)可以在 http://www.iso.org 購買。

?

為了讓C++能更好的支持ECMA-355定義的通用語言規(guī)范(CLI),C++/CLI擴(kuò)展了ISO/ANSI標(biāo)準(zhǔn)C++。2003年,微軟為了支持C++程序在.Net框架下執(zhí)行,提出了一個(gè)初始的程序開發(fā)技術(shù)說明,它就成為了后來CLI標(biāo)準(zhǔn)的第一個(gè)版本。CLI和C++/CLI都是微軟在.Net框架下提出的。當(dāng)然,把它們標(biāo)準(zhǔn)化能加快在其他Windows環(huán)境中的實(shí)現(xiàn)。雖然C++/CLI是C++的擴(kuò)展,必須注意的是如果希望程序完全在CLR的控制下運(yùn)行,一些ISO/ANSI C++支持的特性將不能使用的。

?

在本地環(huán)境上,CLR有很多實(shí)質(zhì)性的優(yōu)勢。讓C++程序基于CLR執(zhí)行,可以有更好的安全性。也能避免完全使用ISO/ANSI C++的一些潛在錯(cuò)誤。CLR通過標(biāo)準(zhǔn)化目標(biāo)編譯環(huán)境消除了各種高級(jí)語言的不兼容。因此,以C++編寫的模塊可以和其他語言如C#、Visual Basic編寫的模塊組合在一起。

?

控制臺(tái)程序

?

除了可以開發(fā)窗口程序,Visual C++ 2005允許編寫、編譯、測試純粹的C++程序。它們沒有窗口程序那么復(fù)雜的要求,是簡單基于字符的命令行程序。在Visual C++ 2005中它們都是通過鍵盤、屏幕的字符模式進(jìn)行交互,所以也稱為控制臺(tái)程序。

?

學(xué)習(xí)控制臺(tái)程序,而不是Windows編程,這好像偏離了正軌。其實(shí)不然,學(xué)習(xí)C++的時(shí)候還不必涉及Windows編程的特殊技術(shù),此時(shí)控制臺(tái)程序是最好的方法。有許多非常簡單的Windows程序代碼,在學(xué)習(xí)C++的各種技術(shù)時(shí)不必為Windows的復(fù)雜而心煩意亂。因此本書前面講述C++語言的章節(jié),會(huì)介紹一些輕量級(jí)的控制臺(tái)程序。然后才是很多重量級(jí)的Windows程序代碼。

?

學(xué)習(xí)C++時(shí),應(yīng)該集中精力在C++的語言特征上,不必在意語言操作環(huán)境。在控制臺(tái)程序中只有一個(gè)文本接口。此接口對(duì)于我們理解C++語言已經(jīng)足夠了,因此C++語言本身沒有包含任何的圖形功能。在使用微軟基礎(chǔ)類庫(MFC)的本地C++程序,或者是CLR中Windows Forms編寫窗口應(yīng)用程序時(shí),自然會(huì)介紹大量圖形用戶接口編程的知識(shí)。

?

常用的控制臺(tái)程序主要有兩種不同的程序類型:Win32控制臺(tái)程序,編譯為本地代碼,與標(biāo)準(zhǔn)ISO/ANSI C++兼容;CLR控制臺(tái)程序,基于CLR,可以使用C++/CLI的語言特性。

?

Windows編程思想(Concept)

?

編寫Windows程序的捷徑就是利用Visual C++ 2005提供的工具。Visual C++ 2005提供的工程創(chuàng)建工具可以自動(dòng)生成各種類型的應(yīng)用程序框架,包括窗口程序。用Visual C++ 2005開發(fā)程序的第一步就是創(chuàng)建工程。為了快速的了解這些工具,本章后面通過一些例子來詳細(xì)介紹創(chuàng)建過程,包括Windows程序的框架。

?

Windows程序的結(jié)構(gòu)與傳統(tǒng)的從命令行執(zhí)行的控制臺(tái)程序不同,復(fù)雜很多。在控制臺(tái)程序中,可以直接從鍵盤獲取輸入然后輸出到命令行。而Windows程序只能通過Windows操作系統(tǒng)提供的函數(shù)來訪問計(jì)算機(jī)的輸入、輸出設(shè)備。不允許直接訪問硬件資源。Windows可以同時(shí)執(zhí)行多個(gè)任務(wù),Windows決定特定的輸入操作,如鼠標(biāo)點(diǎn)擊和鍵盤按下,會(huì)被傳送到哪個(gè)應(yīng)用程序。以此通知相關(guān)的應(yīng)用程序。因此Windows操作系統(tǒng)控制了用戶的所有通信。

?

Windows程序和用戶之間的接口有很多,可以在任何時(shí)候進(jìn)行大量不同的輸入操作。用戶可以選擇任意多的菜單項(xiàng),點(diǎn)擊工具欄按鈕,在應(yīng)用程序窗口上點(diǎn)擊鼠標(biāo)。一個(gè)設(shè)計(jì)完善的應(yīng)用程序可以在任何時(shí)候處理任意類型的輸入,因?yàn)槲覀兪菬o法提前知道程序?qū)⒂惺裁礃拥妮斎氩僮靼l(fā)生。這些用戶操作最先由操作系統(tǒng)接受,統(tǒng)一的處理為事件。和應(yīng)用程序用戶接口相關(guān)的事件通常引起程序部分特殊代碼段的執(zhí)行。因此程序是如何執(zhí)行通常由用戶的行為決定。以此方式運(yùn)行的程序稱為事件驅(qū)動(dòng)程序。與傳統(tǒng)的單一執(zhí)行順序程序不同?;谶^程的程序,它的輸入操作由代碼控制,只有在程序允許的時(shí)候才有效。因此,Windows程序是由一些專門響應(yīng)由用戶行為引起的事件的代碼片斷組成。

?

1-2中的每個(gè)方形塊都是為了處理一個(gè)特殊事件而編寫的特殊代碼段。這些單獨(dú)的代碼塊可能會(huì)讓程序看起來很零碎,實(shí)際上連接這些代碼塊為一個(gè)程序整體是由操作系統(tǒng)完成的。可以把這些程序看作是提供特殊性能的自定義窗口。

?

在單獨(dú)的程序中,為外部事件提供服務(wù)的模塊,如菜單選擇、鼠標(biāo)點(diǎn)擊等,通常都可以訪問應(yīng)用程序?qū)iT的通用數(shù)據(jù)集合。這些語言程序數(shù)據(jù)包含程序環(huán)境相關(guān)的信息,如編輯器中的字符串,棒球程序(游戲)中每個(gè)隊(duì)員的得分記錄,程序執(zhí)行過程中發(fā)生的一些事件信息。這些共享的數(shù)據(jù)集可以讓看似獨(dú)立的程序模塊用相同的、和諧的方式進(jìn)行通信和操作。

?

Visual C++ 2005提供的應(yīng)用程序向?qū)Э梢陨蒞indows程序的每個(gè)基本單元,即使這個(gè)單元只有少量的幾行代碼。當(dāng)然這幾行代碼可能變?yōu)楹芏啻a。為了簡化理解C++執(zhí)行過程,需要一個(gè)盡可能簡單的上下文環(huán)境。幸好Visual C++ 2005提供了現(xiàn)成的程序環(huán)境。

o_1-2.jpg
1-2

?

什么是集成開發(fā)環(huán)境?

?

Visual C++ 2005的集成開發(fā)環(huán)境(IDE)功能非常強(qiáng)大,全面支持C++程序的創(chuàng)建、編譯、鏈接和測試。也是學(xué)習(xí)C++語言的好環(huán)境(特別是和一些書籍配合使用)。

?

為了讓編程C++程序更加容易,Visual C++ 2005設(shè)計(jì)、集成了很多輔助工具。本章會(huì)介紹部分工具。為了不讓學(xué)習(xí)這些繁瑣的工具、特征、選項(xiàng)變得枯燥,先看看IDE是如何工作的。然后隨著本書來進(jìn)一步了解IDE的知識(shí)。

?

系統(tǒng)組件

?

Visual C++ 2005中最基礎(chǔ)的部分(也屬于IDE)是編輯器、編譯器、鏈接器以及庫函數(shù)。它們是編寫、執(zhí)行C++程序最重要的基礎(chǔ)工具。它們的主要作用有:

?

編輯器

?

編輯器提供了創(chuàng)建、編輯C++程序源代碼的交互式環(huán)境。也提供了一些非常熟悉的常用工具如:剪切和粘貼。編輯器也提供顏色高亮以區(qū)別不同的顏色元素。它會(huì)自動(dòng)的識(shí)別C++語言的基礎(chǔ)關(guān)鍵字,然后根據(jù)它們的類型顯示不同的顏色。這項(xiàng)功能不僅能讓代碼更可讀,而且在輸入這些語言關(guān)鍵字時(shí)如果發(fā)生錯(cuò)誤,編輯器會(huì)很友好的作出提示。

?

編譯器

?

編譯器把源代碼轉(zhuǎn)換為對(duì)象代碼,在編譯過程中同時(shí)檢查和報(bào)告錯(cuò)誤信息。如果程序有無效、無法識(shí)別的代碼,編譯器都會(huì)報(bào)錯(cuò)誤。結(jié)構(gòu)上的錯(cuò)誤如只有部分無法執(zhí)行的程序代碼同樣報(bào)錯(cuò)。編譯器輸出的對(duì)象代碼存儲(chǔ)在對(duì)象文件中。輸出的對(duì)象代碼有兩種類型。對(duì)象代碼的擴(kuò)展名通常是.obj。

?

鏈接器

?

鏈接器把編譯器從源代碼產(chǎn)生的模塊文件組合在一起,從C++提供的程序庫把需要的部分代碼塊加入,然后把所有的文件融合為可執(zhí)行整體。鏈接器也是能檢測錯(cuò)誤的,如程序引用的代碼丟失或者不存在。

?

程序庫

?

程序庫是一個(gè)簡單的預(yù)先寫好的程序集合,通過標(biāo)準(zhǔn)的、專業(yè)程序代碼單元支持、擴(kuò)展C++語言。所有的程序都可以引入到自己編寫的代碼完成一些常用的操作。Visual C++ 2005在不同的程序庫中都通過程序?qū)崿F(xiàn)了一些操作,這些程序可以大大的減少自己編寫、測試這些代碼的工作量。前面提到的.Net類庫,還有其他的程序庫,實(shí)現(xiàn)太多此處不便列舉。本書會(huì)介紹一個(gè)最重要的程序庫。

?

標(biāo)準(zhǔn)C++程序庫定義了一個(gè)基礎(chǔ)的函數(shù)集,這些函數(shù)可以在任何支持ISO/ANSI C++的編譯器上運(yùn)行。標(biāo)準(zhǔn)C++程序庫實(shí)現(xiàn)了有大量的程序功能,包括數(shù)值計(jì)算(計(jì)算平方根和計(jì)算三角函數(shù)等),字符、字符串處理程序(字符分類和字符比較)等等很多。隨著你掌握更多的ISO/ANSI C++知識(shí),對(duì)標(biāo)準(zhǔn)C++程序庫也會(huì)更熟悉的。當(dāng)然也有支持ISO/ANSI C++擴(kuò)展版的C++/CLI程序庫。

?

微軟基礎(chǔ)類庫(MFC)提供了對(duì)本地基于窗口的應(yīng)用程序支持。MFC大大的減少了建立應(yīng)用程序圖形用戶接口的工作量。在進(jìn)一步研究C++的細(xì)微差別后,對(duì)MFC也就更熟悉。另一個(gè)程序庫Windows Forms也實(shí)現(xiàn)了很多的工具程序,和MFC一樣都減少了建立基于窗口的應(yīng)用程序的工作量。它是在.Net框架下執(zhí)行的。本書也會(huì)介紹如何用Windows Forms庫開發(fā)應(yīng)用程序。

?

如何使用IDE

?

本書所有的程序都是在Visual C++ 2005的IDE中開發(fā)執(zhí)行的。啟動(dòng)Visual C++ 2005以后,會(huì)得到和圖1-3類似窗口界面。

o_1-3.jpg
1-3

?

1-3左邊的窗口是解決方案瀏覽窗口。右上角顯示啟動(dòng)畫面的窗口是編輯器窗口。底部是輸出窗口。解決方案瀏覽器可以瀏覽每個(gè)文件、同時(shí)在編輯器中顯示文件內(nèi)容。也可以向程序添加文件。解決方案瀏覽器窗口有三個(gè)其他的切換頁(圖1-3中只顯示了兩個(gè)):類視圖、資源視圖和應(yīng)用程序的屬性管理。也可以通過View菜單選擇不同頁來進(jìn)行顯示。編輯器是輸入、修改源代碼和其他程序組件的窗口。底部的輸出窗口在編譯、鏈接程序時(shí)會(huì)顯示一些消息。

?

工具欄選項(xiàng)

在工具欄區(qū)點(diǎn)擊右鍵,可以自定義選擇需要在Visual C++窗口中顯示哪些工具欄。圖1-4顯示了右鍵彈出菜單列舉的所有工具欄名稱。所有當(dāng)前顯示的工具欄都會(huì)在菜單項(xiàng)前面顯示選中標(biāo)記。

o_1-4.jpg
1-4

?

任何時(shí)候都可以通過這里定義需要顯示的工具欄。圖1-3中顯示的工具欄有:Build、Class Designer、Debug、Standard和View Designermenu。在菜單左邊的空白灰色區(qū)點(diǎn)擊可以使工具欄顯示。點(diǎn)擊選中標(biāo)記可以使工具欄隱藏。

?

不必為應(yīng)用程序有時(shí)需要太多的工具欄而感到混亂。因?yàn)橛行┕ぞ邫谠谛枰獣r(shí)會(huì)自動(dòng)的顯示。所以默認(rèn)的工具欄設(shè)置能滿足大多數(shù)時(shí)候的需要。也許在開發(fā)程序的時(shí)候會(huì)覺得范圍沒有顯示的工具欄很不方便,任何可需之時(shí)都可以通過工具欄區(qū)右鍵的菜單來改變工具欄設(shè)置。

?

和其他窗口應(yīng)用程序一樣,Visual C++ 2005的所有工具欄都有提示信息。在工具欄按鈕上稍微的停頓,白色標(biāo)簽就會(huì)顯示工具欄的作用。

?

工具欄停靠

?

可停靠工具欄可以通過鼠標(biāo)拖動(dòng)到窗口內(nèi)任意方便的位置。如果是??吭趹?yīng)用程序的四邊,工具欄就處理停靠狀態(tài)。外觀和應(yīng)用程序頂部的工具欄一樣。頂部的標(biāo)準(zhǔn)工具欄上有一個(gè)磁盤圖標(biāo)、在一個(gè)雙眼望遠(yuǎn)鏡文件圖標(biāo)的右邊有一個(gè)文本輸入框。把鼠標(biāo)放在標(biāo)準(zhǔn)工具欄上,按下鼠標(biāo)左鍵,然后保存左鍵的按下狀態(tài),此時(shí)標(biāo)準(zhǔn)工具欄就如是一個(gè)單獨(dú)的窗口,可以放在任何的地方。

?

拖動(dòng)任何可停靠工具欄離開??课恢脮r(shí),會(huì)看到圖1-5中標(biāo)準(zhǔn)工具欄一樣的效果——一個(gè)小的封閉窗口,只是標(biāo)題欄不同。這種狀態(tài)下稱為浮動(dòng)工具欄。圖1-3中看到的所有工具欄都是可停靠、可浮動(dòng)的。所以可以用它們做停靠拖動(dòng)試驗(yàn)??梢酝?抗ぞ邫谠谝恍┪恢糜^察相反的外觀狀態(tài)??梢园芽赏?抗ぞ邫谕?吭谥鞔翱诘娜魏挝恢?。

o_1-5.jpg
1-5

?

Visual C++ 2005中工具欄使用的一些圖標(biāo)都比較通用。和其他一些窗口程序一樣,不會(huì)給人很陌生的感覺。有時(shí)程序員不會(huì)重視Visual C++環(huán)境中按鈕的確切含義。因此本書會(huì)在使用的時(shí)候單獨(dú)介紹。

通常開發(fā)的每個(gè)程序都需要建立一個(gè)新的工程。著眼于工程的確切含義,理解工程定義機(jī)制能幫助學(xué)習(xí)Visual C++ 2005的IDE。

?

文檔

?

關(guān)于Visual C++ 2005的資料有很多。微軟開發(fā)者網(wǎng)絡(luò)(MSDN)文檔庫不僅提供了關(guān)于Visual C++ 2005全面的、所有方面的參考資料。還有其他很多的開發(fā)資料。在按照Visual C++ 2005的時(shí)候,可以選擇部分還是全部的MSDN文檔。如果有足夠的硬盤空間,強(qiáng)烈建議按照MSDN文檔庫。

?

瀏覽MSDN文檔庫可以用F1鍵。Help菜單下也有多個(gè)文檔訪問方法。在本章后面會(huì)看到,遇到編碼錯(cuò)誤時(shí)MSDN是一個(gè)非常有用的工具,它提供了足夠的參考文檔。

?

工程和解決方案

?

工程包含了組成各種類型程序所需的所有內(nèi)容。可以是控制臺(tái)程序、基于窗口的程序或者是其他類型。通常包含一個(gè)、多個(gè)存儲(chǔ)代碼的源文件,加上一些其他的輔助數(shù)據(jù)。工程的所有文件都放在工程文件夾。關(guān)于工程的一些其他詳細(xì)信息存儲(chǔ)在工程文件夾下以vcproj為后綴的XML文件中。工程文件夾下還包含一些其他的文件夾,用來存儲(chǔ)編譯、鏈接工程輸出的文件。

?

解決方案顧名思義,代表一個(gè)特殊數(shù)據(jù)處理問題的解決方法,它建立了一種有效的集合所有程序代碼、資源的機(jī)制。比如商務(wù)操作中的分布式順序登陸系統(tǒng),可能需要在一個(gè)解決方案中分別開發(fā)幾個(gè)不同的工程程序。因此解決方案是存儲(chǔ)一個(gè)、多個(gè)相關(guān)工程所有信息的文件夾。在解決方案文件夾下可以有多個(gè)的工程文件夾。關(guān)于解決方案的工程信息文件存儲(chǔ)在兩個(gè)文件中,分別以.slnand、.suo為后綴。創(chuàng)建工程時(shí),如果沒有選擇把工程加入到某個(gè)解決方案中,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)新的解決方案。

?

如果在創(chuàng)建工程時(shí)也創(chuàng)建了解決方案,就可以把其他的工程加入到這個(gè)解決方案中。你甚至可以把任何的工程都加入到此解決方案。在實(shí)踐操作時(shí),為了方便管理,只把和解決方案的相關(guān)一些工程添加到一起。一般在沒有特殊原因的時(shí)候都應(yīng)該給每個(gè)工程建立相應(yīng)的解決方案。本書所有的例子工程都是單獨(dú)的,都有自己的解決方案。

?

定義工程

?

Visual C++ 2005中編寫程序的第一步是創(chuàng)建工程:在主菜單的File -> New -> Project或者快捷鍵Ctrl+Shift+N。也可以創(chuàng)建一些包含代碼的文件及其他組成程序的數(shù)據(jù)。在工程目錄下的XML文件記錄了工程中使用的一些Visual C++? 2005設(shè)置。這些文件都是由IDE自己進(jìn)行維護(hù),可以不過多關(guān)注它們。但是偶爾修改這些文件時(shí)需要注意。

?

到此,已經(jīng)介紹不少的內(nèi)容,現(xiàn)在通過一些實(shí)踐操作來鞏固這些知識(shí)。

?

實(shí)踐——?jiǎng)?chuàng)建Win32工作臺(tái)程序工程

?

下面講述如何創(chuàng)建一個(gè)控制臺(tái)程序工程。選擇File -> New -> Project打開新建工程對(duì)話框,如圖1-6:

o_1-6.jpg
1-6

?

新建工程對(duì)話框左邊的樹形列表顯示了可以創(chuàng)建的工程類型。在本例中選擇Win32。選擇不同的工程類型決定了應(yīng)用程序向?qū)?huì)創(chuàng)建怎樣的初始工程內(nèi)容。新建工程對(duì)話框的右邊顯示出所有的子工程模板。應(yīng)用程序向?qū)?huì)根據(jù)選擇的模板創(chuàng)建工程的組成文件。點(diǎn)擊新建工程對(duì)話框的OK按鈕后,在下一個(gè)出現(xiàn)的對(duì)話框中可以自定義創(chuàng)建的文件。對(duì)大多數(shù)的工程、模板選項(xiàng),都會(huì)自動(dòng)的創(chuàng)建工程的基礎(chǔ)源代碼模塊。

?

出現(xiàn)新建工程對(duì)話框后,在工程名稱編輯框輸入合適的工程名稱,本例中是Ex1_01。Visual C++ 2005支持長文件名,在命名有很大的彈性。底部的編輯框是解決方案名稱,默認(rèn)時(shí)解決方案文件夾名稱和工程名稱一樣。需要時(shí)可以修改解決方案名稱。在中間的Location編輯框是工程文件夾存儲(chǔ)路徑,可以按需修改。如果只是輸入了工程名稱,解決方案工程文件夾名稱會(huì)被自動(dòng)的設(shè)置為工程名稱。如果解決方案文件夾不存在它就會(huì)被創(chuàng)建??梢酝ㄟ^Location編輯框輸入不同的路徑,或者是Browse按鈕進(jìn)行選擇。點(diǎn)擊OK后會(huì)顯示圖1-7所示W(wǎng)in32應(yīng)用程序向?qū)А?o:p>

?

此向?qū)?duì)話框說明了當(dāng)前的工程設(shè)置。點(diǎn)擊Finish按鈕后向?qū)ё詣?dòng)根據(jù)設(shè)置創(chuàng)建相應(yīng)的工程文件。點(diǎn)擊向?qū)?duì)話框左邊的Application Settings會(huì)顯示圖1-8所示的應(yīng)用程序設(shè)置頁。

o_1-7.jpg
1-7

o_1-8.jpg
1-8

在應(yīng)用程序設(shè)置頁可以設(shè)置工程選項(xiàng)。在學(xué)習(xí)C++時(shí),通常創(chuàng)建的工程都是選擇Empty Project檢驗(yàn)欄。此例中可以不修改這些設(shè)置直接點(diǎn)擊Finish按鈕。然后向?qū)?chuàng)建所有的默認(rèn)文件。

?

工程文件夾的名稱和工程名稱是一樣的。所有的工程定義文件都放在工程文件夾下。默認(rèn)情況下,解決方案文件夾和工程名稱一樣,工程文件夾位于解決方案文件夾下。定義解決方案內(nèi)容的文件也在解決方案文件夾下。在Windows瀏覽器中可以看到解決方案文件夾下三個(gè)文件:

??? ·? 以.sln為后綴的文件記錄了此解決方案的所有工程信息

??? · 以.suo為后綴的文件記錄了解決方案的設(shè)置選項(xiàng)。

??? · 以.ncb為后綴的文件記錄了一些解決方案的智能信息。當(dāng)在編輯窗口輸入代碼時(shí),??????? 智能工具提供自動(dòng)完成功能和顯示提示信息。

Windows瀏覽器中查看工程文件夾,初始情況下有六個(gè)文件。包括一個(gè)工程內(nèi)容的摘要信息文本文件ReadMe.txt。在這個(gè)ReadMe.txt中可能沒有提及存儲(chǔ)工程選項(xiàng)設(shè)置文件,以復(fù)合文件名稱命名:Ex1_01.vcproj.ComputerName.UserName.user。

?

Visual C++ 2005左邊解決方案窗口會(huì)自動(dòng)打開創(chuàng)建的工程,如圖1-9所示。為了能更清晰的查看解決方案切換頁的名稱,圖中增加了每個(gè)切換頁的寬度。

o_1-9.jpg
1-9

解決方案頁顯示了解決方案下的所有工程和包含的文件,此例中只有一個(gè)工程。雙擊解決方案的文件名就會(huì)在右邊的編輯窗口附加一頁顯示文件的內(nèi)容。在右邊的多頁編輯窗口中可以及時(shí)的交替顯示,只需簡單的單擊相應(yīng)的切換按鈕。

?

類視圖頁顯示工程定義的類,包括每個(gè)類的內(nèi)容。在本例中沒有類,因此視圖是空的。在后面討論類的時(shí)候,通過類視圖可以很方便、快速的訪問程序中定義的每個(gè)類定義、實(shí)現(xiàn)以及相互轉(zhuǎn)移代碼。

?

屬性管理頁顯示了工程的Debug、Release屬性設(shè)置。在本章后面會(huì)介紹這些版本信息。在顯示的屬性上點(diǎn)擊右鍵,通過彈出菜單選擇、修改屬性。此時(shí)會(huì)顯示修改屬性的對(duì)話框。任何時(shí)候按下Alt+F7都會(huì)顯示屬性框。在討論程序的Debug、Release版時(shí)會(huì)介紹更多信息。

?

資源視圖頁包含對(duì)話框、圖標(biāo)、菜單、工具欄和其他程序使用的資源。本例中是控制臺(tái)程序,沒有使用資源。在編寫窗口程序時(shí),會(huì)涉及更多的資源。在資源視圖頁可以編輯、添加工程的可用資源。

?

Visual C++ 2005IDE的大多工具一樣,在解決方案瀏覽窗口和其他切換頁上或者一些空白區(qū)點(diǎn)擊右鍵,也有上下文相關(guān)的彈出菜單。如果解決方案瀏覽窗口影響了編碼位置,可以點(diǎn)擊自動(dòng)隱藏按鈕。需要顯示時(shí)再點(diǎn)擊IDE窗口左邊的名字頁。

?

編輯源代碼

?

應(yīng)用程序向?qū)?huì)生成可編譯、執(zhí)行的完整Win32控制臺(tái)程序。只是這個(gè)程序沒有任何實(shí)際的功能,為了讓程序有意義需要修改代碼。如果代碼文件在編輯窗口不可見,在解決方案瀏覽窗口中雙擊Ex1_01.cpp文件。此文件是應(yīng)用程序向?qū)傻闹鞒绦蛭募?。打開后的效果如圖1-10。

o_1-10.jpg
1-10

如果圖中的代碼行號(hào)沒有顯示,從主菜單的Tools -> Options,可以顯示選項(xiàng)設(shè)置對(duì)話框。展開左邊Text Editor下的C/C++樹子項(xiàng),選擇General。然后選中對(duì)話框右邊的Line Numbers檢測欄。下面會(huì)簡單介紹圖1-10中代碼的功能,詳細(xì)的信息后面講解。

?

程序開始的兩行是注釋,所有在“//”后此行的字符都被編譯器忽略。當(dāng)你想添加注釋時(shí),只需要在注釋前加上“//”。

?

第四行是#include指令,通過#include指令把stdafx.h文件的內(nèi)容加入到文件此位置。這是在C++程序中把.h頭文件添加到.cpp源文件的標(biāo)準(zhǔn)方法。

?

_tmain()函數(shù)開始第一行也是此源代碼文件的第一行可執(zhí)行文件。C++程序的函數(shù)就是一個(gè)簡單的可執(zhí)行命名程序單元。每個(gè)C++程序至少由一個(gè)函數(shù)組成,通常是多個(gè)函數(shù)。

?

文件的第八、第十行的左右括號(hào)分別把_tmain()函數(shù)的所有可執(zhí)行代碼封裝起來。真正的可執(zhí)行代碼只是第十行,它的作用是結(jié)束程序。

?

現(xiàn)在可以添加如下的兩行代碼到代碼編輯窗口:

// Ex1_01.cpp :定義控制臺(tái)程序的入口點(diǎn)

#include “stdafx.h”

#include <iostream>

int _tmain(int argc, _TCHAR* argv[])

{

??? std::cout << “Hello world!\n”;

??? return 0;

}

?

沒有陰影的代碼是自動(dòng)生成的,陰影下的代碼需要自己添加。為了產(chǎn)生新的空白行,可以把鼠標(biāo)放在前一行文本的末尾按下回車鍵,然后就可以輸入代碼。請(qǐng)確保程序和前面的例子代碼一樣,否則可能有編譯錯(cuò)誤。

?

第一行輸入代碼是#include指令,把ISO/ANSI C++的標(biāo)準(zhǔn)頭文件內(nèi)容加入到這個(gè)源文件中。<iostream>定義了基礎(chǔ)的I/O操作工具,以及在第二個(gè)附加中使用的把內(nèi)容輸出到命令行。std::cout是標(biāo)準(zhǔn)輸出流,在第二個(gè)附加語句中把字符串“Hello world!\n”寫入std::cout。在雙引號(hào)之間的字符串會(huì)寫入命令行然后顯示出來。

?

編譯解決方案

?

編譯解決方案按下F7或者Build->Build Solution菜單項(xiàng)。同樣可以點(diǎn)擊工具欄上相應(yīng)的按鈕。與Build菜單一樣功能的工具欄可能沒有顯示,想要顯示直接在工具欄區(qū)點(diǎn)擊右鍵從彈出菜單選擇Build工具欄。例子程序應(yīng)該可以編譯成功。如果有錯(cuò)誤,請(qǐng)檢測在你輸入兩行額外代碼時(shí)是否有誤。仔細(xì)檢查這兩行代碼。

?

編譯控制臺(tái)程序的輸出文件

?

例子程序編譯無錯(cuò)后,在Windows瀏覽器中查看工程文件夾,有一個(gè)新的子文件夾Debug。此文件夾包含剛才的編譯操作所輸出的文件。在Debug文件夾下有多個(gè)不同的文件。

?

除了程序的可執(zhí)行文件.exe,對(duì)其他的文件可以不作詳細(xì)的了解。如果你對(duì)這些文件好奇,下面會(huì)簡單快速的說明這些文件信息。

?

文件擴(kuò)展名

描述信息

.exe

程序的可執(zhí)行文件,只有在編譯、鏈接都成功后才會(huì)產(chǎn)生。

.obj

對(duì)象文件,是編譯器根據(jù)源代碼產(chǎn)生的機(jī)器碼。鏈接器需要這些文件,它們和函數(shù)庫一起產(chǎn)生EXE文件。

.ilk

重新編譯工程的時(shí)候鏈接器使用的文件。使連接器只把修改過的源代碼對(duì)象文件逐步的鏈接到已經(jīng)存在的EXE中??梢员苊庠谛薷某绦驎r(shí)每次都重新鏈接所有的代碼。

.pch

預(yù)編譯頭文件。通過預(yù)編譯頭文件,可以把大量很少修改的主題代碼(特別是C++程序庫代碼)預(yù)先處理一次存入.pch文件。通過.PCH文件充分的減少代碼重新編譯的時(shí)間。

.pdb

包含在DEBUG模式下運(yùn)行程序需要的DEBUG信息。在DEBUG下,可以動(dòng)態(tài)檢測程序運(yùn)行過程中生成的信息。

.idb

包含重新編譯解決方案時(shí)需要的信息。

?

程序的Debug和Release版本

?

在菜單Project -> Ex1_01 Properties下,可以設(shè)置工程的很多屬性。可以設(shè)置源代碼在編譯、鏈接過程中的處理方式。所有這些設(shè)置都統(tǒng)稱為配置,它們影響最后生成的程序版本。創(chuàng)建新的工程工作區(qū)時(shí),Visual C++ 2005自動(dòng)為創(chuàng)建程序兩個(gè)不同的配置版本:一是DEBUG版,包含有幫助調(diào)試程序的信息。在DEBUG版,程序發(fā)生錯(cuò)誤時(shí),可以逐句執(zhí)行語句來檢測程序的數(shù)據(jù)。另一個(gè)是RELEASE版,不包含調(diào)試信息,含有代碼優(yōu)化設(shè)置。編譯器通過代碼優(yōu)化可以生成最高效的可執(zhí)行模塊。這兩個(gè)版本的配置信息足夠滿足本書的學(xué)習(xí)。如果想加入其他的程序配置,可以通過Build -> Configuration Manager菜單訪問配置。如果沒有加載任何工程,這個(gè)菜單項(xiàng)不會(huì)存在。雖然這不是什么大問題,但是在你瀏覽菜單尋找該項(xiàng)時(shí)可能會(huì)有迷惑。

?

在如圖1-1所示的配置管理對(duì)話框中,可以從Active solution configuration的下拉列表選擇程序工作的配置文件版本。

o_1-11.jpg
1-11

從列表選擇了程序的配置版本后用Close按鈕關(guān)閉對(duì)話框。在開發(fā)程序時(shí),通常使用Debug版。在DEBUG下完全調(diào)試正確后,通常會(huì)再選擇Release重新編譯。Release下產(chǎn)生的代碼是經(jīng)過優(yōu)化,沒有調(diào)試和跟蹤信息,因此重新運(yùn)行速度更快,占用的內(nèi)存更少。

?

執(zhí)行程序

?

成功編譯解決方案后,用Ctrl+F5執(zhí)行程序,你會(huì)看到圖1-12一樣的執(zhí)行結(jié)果。

o_1-12.jpg
1-12

如你所見,窗口中輸出了雙引號(hào)直接的字符內(nèi)容。字符串最后的“\n”是特殊字符系列,稱為轉(zhuǎn)義字符,表示換行符號(hào)。轉(zhuǎn)義字符的作用是再字符串中表示一些特殊的不能用鍵盤直接輸入的字符。

?

實(shí)例 —— 創(chuàng)建空的控制臺(tái)工程

?

先前的例子工程包含一些對(duì)C++簡單程序來說不需要的額外數(shù)據(jù)。默認(rèn)選中的預(yù)編譯頭會(huì)使工程預(yù)編譯stdafx.h文件的內(nèi)容。此選項(xiàng)對(duì)含有大量代碼的C++程序可以減少處理時(shí)間,但是對(duì)我們的例子沒有什么用處。在下面的實(shí)例中,創(chuàng)建空工程然后自己添加源代碼。將用一個(gè)新的Win32控制臺(tái)程序解決方案(Ex1_02)來說明創(chuàng)建過程。在新建工程對(duì)話框里輸入工程名稱后點(diǎn)擊OK按鈕,在新的Win32應(yīng)用程序向?qū)?duì)話框左邊點(diǎn)擊Application Settings。在Additional options中選中Empty project檢測框。如圖1-13所示。

o_1-13.jpg
1-13

點(diǎn)擊Finish按鈕后,會(huì)創(chuàng)建和前面一樣的工程,只是這次的工程中沒有任何文件。下面向工程添加新的源代碼文件。右鍵點(diǎn)擊解決方案窗口,選擇彈出菜單的Add -> New Item。在Add New Item對(duì)話框左邊選擇Code,然后再從右邊選擇C++ File(.CPP)。最后輸入文件名Ex1-02。如圖1-14所示。

o_1-14.jpg
圖1-14

點(diǎn)擊Add按鈕后,新文件會(huì)加入到工程中,同時(shí)在編輯器窗口顯示。當(dāng)然,現(xiàn)在的文件是空的,在其中輸入下面的代碼:

?

// Ex1_02.cpp 一個(gè)簡單的控制臺(tái)程序

#include <iostream> //基本的輸入、輸出庫

int main()

{

??? std::cout << “This is a simple program that outputs some text.” << std::endl;

??? std::cout << “You can output more lines of text” << std::endl;

??? std::cout << “just by repeating the output statement like this.” << std::endl;

??? return 0; // 返回到操作系統(tǒng)

}

?

在輸入代碼時(shí),窗口會(huì)自動(dòng)縮進(jìn)對(duì)齊,C++用縮進(jìn)對(duì)齊來改善代碼的可讀性。在回車的時(shí)候,編輯器根據(jù)前一行代碼自動(dòng)進(jìn)行縮進(jìn)對(duì)齊。輸入時(shí)也可以看到語法顏色高亮。根據(jù)輸入內(nèi)容的不同,編輯器會(huì)自動(dòng)分配一個(gè)顏色給不同的元素,據(jù)此顯示不同的顏色。

?

上面的代碼是一個(gè)完整的程序。與前一個(gè)應(yīng)用程序向?qū)傻睦佑袃蓚€(gè)不同之處。一是沒有包含stdafx.h文件。此次不使用它是因?yàn)槌绦蛑袥]有使用預(yù)編譯頭工具。二是函數(shù)名稱是main,而不是_tmain。實(shí)際上所有的ISO/ANSI C++程序都是從main()開始執(zhí)行的。微軟同時(shí)也提供了另一個(gè)名為wmain的函數(shù),根據(jù)程序是否使用unicode字符,_tmain可以表示main()或者wmain。在前面的例子中,_tmain在內(nèi)部被定義為main。在所有的ISO/ANSI C++選擇中都使用名稱main。

?

輸出語句有一點(diǎn)不同,在main()的第一個(gè)語句是:

?

std::cout << “This is a simple program that outputs some text.” << std::endl;

?

語句中有兩個(gè)“<<”操作符。每個(gè)的作用都是把后續(xù)的字符串傳送到std::cout顯示。std::cout是標(biāo)準(zhǔn)輸出流。第一個(gè)在雙引號(hào)之間的字符串被送到輸出流,第二個(gè)的std::endl是標(biāo)準(zhǔn)程序庫中定義的特殊字符,表示換行。前面也使用過字符串末尾的轉(zhuǎn)義字符‘\n’來產(chǎn)生新行。所以上面的語句也可以寫為:

?

std::cout << “This is a simple program that outputs some text.\n”;

?

為什么這行代碼用陰影表示,而上一行沒有?因?yàn)樯弦恍写a是為了方便解釋而重復(fù)出現(xiàn)的。此行代碼在之前沒有出現(xiàn)過,是新的寫法。所以加了陰影。

?

現(xiàn)在可以和前面的例子一樣編譯工程。編譯時(shí)如果編輯窗口的代碼文件沒有保存,會(huì)自動(dòng)保存。編譯成功后,用Ctrl+F5執(zhí)行出現(xiàn)。效果如圖1-15所示。

o_1-15.jpg
1-15

?

錯(cuò)誤處理

?

如果輸入的程序不正確,當(dāng)然會(huì)有錯(cuò)誤發(fā)生。為了進(jìn)行測試,可以故意在程序中引入錯(cuò)誤。對(duì)已經(jīng)有錯(cuò)誤的程序可以直接用來測試。在本例的源代碼編輯窗口中刪除倒數(shù)第二行(第8行)末尾的分號(hào)。再編譯源代碼,應(yīng)用出現(xiàn)底部的輸出窗口會(huì)顯示下面的錯(cuò)誤信息:

?

C2143: syntax error : missing ‘;’ before ‘return’

?

編譯時(shí)的每個(gè)錯(cuò)誤都有一個(gè)錯(cuò)誤號(hào),通過它可以在文檔中查找解決方法?,F(xiàn)在的錯(cuò)誤原因很明顯。但是大多數(shù)時(shí)候,需要查找文檔來找到問題的原因。為了得到文檔中關(guān)于此錯(cuò)誤的信息,可以在輸出窗口中對(duì)應(yīng)的輸出行上按下F1鍵,會(huì)自動(dòng)打開一個(gè)新的窗口來顯示相應(yīng)的錯(cuò)誤有關(guān)信息。你可以就用上面的C2143錯(cuò)誤試試按下F1看效果。

?

修改錯(cuò)誤后,重新編譯工程。重新編譯的速度會(huì)快很多,因?yàn)楣こ潭x會(huì)自動(dòng)跟蹤組成工程的每個(gè)文件的變化情況。進(jìn)行普通編譯時(shí),Visual C++ 2005自動(dòng)和最近的上一次編譯做比較,只編譯那些已經(jīng)修改過的文件。這就意味著如果工程有多個(gè)文件,在一次編譯完成后只修改了其中的一個(gè)文件,在鏈接創(chuàng)建新的EXE文件前只有那個(gè)修改過的文件才會(huì)編譯。

?

除了Win32控制臺(tái)程序外,還有CLR控制臺(tái)程序。下一節(jié)將介紹CLR控制臺(tái)程序。

?

實(shí)例——?jiǎng)?chuàng)建CLR控制臺(tái)工程

?

按下Ctrl+Shift+N鍵打開New Project對(duì)話框。選擇CLR類型和CLR Console Application程序模板。如圖1-16所示。

?

o_1-16.jpg
1-16

輸入名稱Ex1_03再點(diǎn)擊OK按鈕,應(yīng)用程序向?qū)ё詣?dòng)創(chuàng)建工程的文件。CLR控制臺(tái)程序沒有其他的設(shè)置選項(xiàng)。所以此模板的CLR控制臺(tái)程序初始文件都是一樣的。如果你想建立空的工程(雖然對(duì)本書的學(xué)習(xí)沒有多大的作用)有單獨(dú)的空的CLR工程模板。

?

從圖1-17的解決方案瀏覽器窗口可以看到,與Win32控制臺(tái)工程相比有一些其他的文件。

?

在虛擬資源文件夾下有兩個(gè)文件。.ico文件存儲(chǔ)應(yīng)用程序圖標(biāo),在程序最小化的時(shí)候顯示。.rc文件記錄了應(yīng)用程序使用的資源文件——此例中只是有一個(gè)圖標(biāo)。

?

o_1-17.jpg
1-17

?

工程中有一個(gè)名為AssemblyInfo.cpp的文件。每個(gè)CLR程序都有一個(gè)或多個(gè)程序集,程序集是形成函數(shù)單元的代碼和資源集合。程序集也包含一些CLR的擴(kuò)展數(shù)據(jù);其中有使用數(shù)據(jù)的類型說明;代碼的版本信息;其他程序集能否訪問此集合的權(quán)限信息。簡言之,一個(gè)程序集就是CLR程序所有的基礎(chǔ)編譯模塊。

?

如果編輯窗口中沒有顯示Ex1_03.cpp源代碼文件,在解決方案瀏覽器窗口雙擊文件,編輯窗口會(huì)如圖1-18所示。

r_118.jpg
1-18

從效率上考慮,CLR程序使用預(yù)編譯頭來提供效率。所以和本地C++控制臺(tái)程序一樣,CLR程序默認(rèn)也有#include指令。下一行代碼是:

??? using namespace System;

?

所有的.Net工具函數(shù)庫都是定義在namespace空間中的。所有可能用到的標(biāo)準(zhǔn)類函數(shù)都是在名字空間System內(nèi)。此行代碼表示此后程序代碼都是使用System名字空間。到底聲明是名字空間呢?

?

名字空間是一個(gè)非常簡單的概念。程序中的代碼、形成.Net庫的代碼都會(huì)有大量需要命名的東西——數(shù)據(jù)類型、變量、函數(shù)代碼塊都需要命名。問題就是碰巧你使用的命名已經(jīng)在庫中使用了,這就會(huì)引起名稱混亂。名字空間提供了解決這個(gè)問題的辦法。所有定義在名字空間System內(nèi)的函數(shù)庫代碼名字都有一個(gè)隱含的名字前綴,這個(gè)前綴名就是名字空間的名稱。因此如果庫中名字為String,它的實(shí)際名字是System::String。因此如果你在代碼中不注意使用到了String,那么就應(yīng)該用System::String來訪問.Net庫中的String。

?

兩個(gè)冒號(hào)[域]是范圍解析操作符。此處范圍解析操作符把名字空間名稱System和類型名稱String分隔開來。在前面的本地C++程序中也有過范圍解析操作符std::cout和std::endl。它們具有同樣的功能:std是本地C++程序庫的名字空間,cout和endl是在std名字空間類定義的,分別代表標(biāo)準(zhǔn)輸出流和換行字符。

?

事實(shí)上,例子中通過using namespace語句,可以使用System名字空間內(nèi)的任何名稱,而不需加上空間的名稱前綴。如果你遇到了自定義名稱和庫中的名稱沖突,解決方法就是可以移除using namespace語句,給庫的名稱加上明確的名字空間名稱限定。在第二章會(huì)講述更多名字空間的知識(shí)。

?

按下Ctrl+F5編譯、執(zhí)行程序。輸出效果如圖1-19。

?

o_1-19.jpg
1-19

輸出結(jié)果和第一個(gè)例子一樣。輸出是由下面的語句產(chǎn)生的。

?

Console::WriteLine(L”Hello World”);

?

此句使用了一個(gè).Net庫函數(shù),把雙引號(hào)之間的字符串寫入命令行。因此CLR和Ex1_01中的本地C++程序語句的等價(jià)的:

?

std::cout << “Hello world!\n”;

?

CLR語句比本地C++語句有更直接的外觀效果。

?

Visual C++ 2005的設(shè)置選項(xiàng)

?

Visual C++ 2005中有兩種設(shè)置:一種是設(shè)置Visual C++ 2005提供的工具,它對(duì)每個(gè)工程都有效。另一種是每個(gè)工程的單獨(dú)設(shè)置,它可以改變工程代碼在編譯、鏈接時(shí)的處理方式。從主菜單選擇Tools -> Options可以打開選項(xiàng)設(shè)置對(duì)話框。對(duì)話框的效果如圖1-20所示。

?

o_1-20.jpg
1-20

點(diǎn)擊左邊的子窗口中每個(gè)項(xiàng)目前的加號(hào),打開子項(xiàng)列表。圖1-20打開了Project and Solutions下的General子項(xiàng)。在對(duì)話框右邊顯示出左邊相關(guān)主題的設(shè)置。也許現(xiàn)在你只關(guān)心部分的設(shè)置項(xiàng),但是還是建議你瀏覽所有的設(shè)置內(nèi)容,對(duì)它有一個(gè)整體的了解。點(diǎn)擊標(biāo)題欄的幫助按鈕(問號(hào)按鈕)會(huì)顯示當(dāng)前設(shè)置項(xiàng)的解釋信息。

?

也許你需要改變創(chuàng)建工程的默認(rèn)路徑,修改圖1-20中第一個(gè)Environment的設(shè)置項(xiàng),改變projects和solutions的存儲(chǔ)路徑。

?

在左邊的Projects and Solutions -> VC++ Project Settings下的設(shè)置項(xiàng),是對(duì)所有的工程都有效的。從菜單Project -> Properties可以修改指定工程的設(shè)置。這個(gè)菜單項(xiàng)的名字中可以看出當(dāng)前工程的名字。

?

創(chuàng)建、執(zhí)行Windows應(yīng)用程序

?

前面的工程是不是都很容易?,F(xiàn)在開始創(chuàng)建兩個(gè)Windows應(yīng)用程序。先用MFC創(chuàng)建本地的C++應(yīng)用程序。然后創(chuàng)建CLR下的Windows Forms應(yīng)用程序。對(duì)這兩個(gè)生成的程序,不會(huì)全部詳細(xì)討論它們的工程文件內(nèi)容。只是在某些細(xì)節(jié)方面,才介紹一些相關(guān)知識(shí)來幫助我們理解程序。通過這種方法來幫助理解程序執(zhí)行過程。

?

創(chuàng)建MFC應(yīng)用程序

?

開始創(chuàng)建工程的時(shí)候,如果已經(jīng)有一個(gè)活動(dòng)工程(Visual C++ 2005的主窗口會(huì)顯示工程名稱),可以在File -> Close Solution關(guān)閉解決方案。如果沒有直接關(guān)閉,創(chuàng)建工程時(shí)也會(huì)自動(dòng)關(guān)閉當(dāng)前的解決方案。

?

用菜單New -> Project(或者Ctrl+Shift+N)打開New Project對(duì)話框。Project Type選擇MFC,工程模板選擇MFC Application。如圖1-21一樣輸入Ex1_04的工程名稱。

o_1-21.jpg
1-21

點(diǎn)擊OK按鈕后,進(jìn)入到應(yīng)用程序向?qū)?duì)話框。在此對(duì)話框中可以設(shè)置很多應(yīng)用程序包含的選項(xiàng)。都可以在對(duì)話框右邊的選項(xiàng)列表進(jìn)行判斷。如圖1-22。后面會(huì)介紹一些具體的選項(xiàng)。

?

本例中可以忽略這些設(shè)置,接受默認(rèn)值,點(diǎn)擊Finish按鈕用默認(rèn)設(shè)置創(chuàng)建工程。之后的解決方案瀏覽器窗口如圖1-23所示。

o_1-22.jpg
1-22

?

o_1-23.jpg
1-23

?

1-23中已經(jīng)通過Property Manager的右鍵菜單Hide隱藏了Property Manager。向?qū)?chuàng)建了很多的文件。編寫窗口程序時(shí),需要大量的時(shí)間努力學(xué)習(xí)相關(guān)知識(shí)。其中的.CPP文件包含可執(zhí)行的源代碼。.H文件包含可執(zhí)行代碼需要的定義信息。.ICO是圖標(biāo)文件。通過子文件夾分類,可以進(jìn)行快速的訪問。它們都是虛擬的文件夾。實(shí)際的工程文件夾下不會(huì)存在。

?

Windows瀏覽器中查看解決方案文件夾,或者其他可以看到文件的方法,你會(huì)發(fā)現(xiàn)有24個(gè)文件。3個(gè)在解決方案文件夾下,另外17個(gè)文件在工程文件夾下,4個(gè)在工程文件夾下的res文件夾中。res子文件夾包含程序使用的資源文件,如菜單圖標(biāo)等。我們只是在輸入一個(gè)工程名稱后就產(chǎn)生了如此多的文件。正是因?yàn)楫a(chǎn)生的文件很多,為每個(gè)工程建立單獨(dú)的目錄就很有必要了。

?

工程中的ReadMe.txt文件中解釋了MFC應(yīng)用程序向?qū)傻拿總€(gè)文件的作用。需要時(shí)可以用Notepad、WordPad或者Visual C++ 2005的編輯器查看其內(nèi)容。在解決方案中雙擊文件就可以在編輯窗口中打開。

?

編譯、執(zhí)行MFC應(yīng)用程序

?

執(zhí)行程序前,必須編譯工程——編譯源代碼鏈接模塊,與控制臺(tái)程序一樣。可以用Ctrl+F5編譯然后立即執(zhí)行。一個(gè)單獨(dú)的鍵盤快捷鍵完成兩項(xiàng)工作,節(jié)約時(shí)間。

?

編譯后,輸出窗口顯示沒有錯(cuò)誤,程序開始執(zhí)行。執(zhí)行效果如圖1-24所示。

?

o_1-24.jpg
1-24

程序的功能非常完整,有菜單、工具欄。盡管程序沒有特殊的功能(這些功能需要自己添加)。但是所有的菜單都實(shí)現(xiàn)了。你還可以從File -> New創(chuàng)建新的子窗口。

?

利用應(yīng)用程序向?qū)?chuàng)建Windows程序非常容易。當(dāng)我們不需要Ex1_04這樣簡單的程序時(shí),就需要把程序的外衣一層一層的剝?nèi)?,深入分析?nèi)部結(jié)構(gòu),實(shí)現(xiàn)更豐富的功能就不是很難了。當(dāng)然,有些人愿意花上一兩個(gè)月的準(zhǔn)備時(shí)間,然后拋棄Visual C++ 2005的輔助工具,用老的編程習(xí)慣來編寫Windows程序。這就是為什么一些程序員過去常常吃壽司。隨著Visual C++ 2005的到來,那樣的情景已經(jīng)不復(fù)存在。但是你將不可能知道編程技術(shù)角有什么?如果你喜歡壽司,最好給自己選擇一個(gè)正確的方向。

?

創(chuàng)建Windows Forms應(yīng)用程序

?

Windows Forms應(yīng)用程序采用不同的應(yīng)用程序向?qū)А?chuàng)建一個(gè)新的工程,選擇CLR Project types下的Windows Forms Applicaion模板。輸入Ex1_05工程名,如圖1-25。

?

o_1-25.jpg
1-25

此類程序沒有其他設(shè)置,直接點(diǎn)擊OK按鈕創(chuàng)建工程。解決方案瀏覽器窗口顯示了自動(dòng)生成的文件,如圖1-26。

o_1-26.jpg
1-26

?

在工程的目錄下,此工程只有相當(dāng)少的文件。包括解決方案文件總共只有15個(gè)。因此這類工程的初始GUI比使用MFC的本地C++程序更簡單。Windows Forms應(yīng)用程序沒有菜單和工具欄。只有一個(gè)窗口。當(dāng)然,可以添加菜單和工具欄,Windows Forms應(yīng)用程序向?qū)J(rèn)你不需要菜單和工具欄。編輯窗口也有些不同,如圖1-27。

?

o_1-27.jpg
1-27

?

編輯窗口顯示了應(yīng)用程序窗口的圖形而不是代碼。因?yàn)殚_發(fā)Windows Forms程序的GUI是面向圖形設(shè)計(jì)而不是編碼設(shè)計(jì)。可以同畫圖一樣拖放GUI組件到應(yīng)用程序窗口。Visual C++ 2005會(huì)自動(dòng)生成顯示代碼。按下Ctrl+Alt+X,或者菜單View -> Toolbox,將看到一個(gè)額外顯示GUI組件列表的窗口,如圖1-28。

o_1-28.jpg
1-28

?

窗口Toolbox 顯示了可以添加到Windows Forms應(yīng)用程序的標(biāo)準(zhǔn)組件列表??梢試L試給Ex1_05添加按鈕:點(diǎn)擊Toolbox列表的Button,然后在編輯窗口中Ex1_05的客戶區(qū)想顯示按鈕的位置進(jìn)行點(diǎn)擊。拖動(dòng)按鈕的邊界可以改變其大小。拖動(dòng)按鈕改變其位置。同樣可以修改按鈕標(biāo)題:從鍵盤輸入Start然后按下回車。標(biāo)題改變了同時(shí)激活、打開了另一個(gè)窗口:顯示按鈕所有的屬性。關(guān)于屬性不會(huì)再進(jìn)行介紹,只是需要記住它們都是影響按鈕外觀效果的規(guī)范說明。修改這些屬性以滿足程序的需要。再添加一個(gè)Stop標(biāo)題的按鈕。如圖1-29。

o_1-29.jpg
1-29

?

可以再任何時(shí)候編輯GUI組件。相應(yīng)的代碼會(huì)自動(dòng)調(diào)整??梢圆捎猛瑯拥姆椒ㄌ砑悠渌慕M件。然后用Ctrl+F5編譯、執(zhí)行程序。很簡單,對(duì)吧!

?

總結(jié)

?

本章包含了用Visual C++ 2005創(chuàng)建各種應(yīng)用出現(xiàn)的基本方法。利用應(yīng)用出現(xiàn)向?qū)?,?chuàng)建、執(zhí)行本地、CLR控制臺(tái)程序。創(chuàng)建MFC窗口程序和基于CLR的Windows Forms程序。

?

本章的主要知識(shí)點(diǎn)有:

??? ·? 通用語言運(yùn)行時(shí)(CLR)是微軟實(shí)現(xiàn)的一個(gè)通用語言規(guī)范(CLI)標(biāo)準(zhǔn)。

??? ·? .Net框架由CLR和.Net庫組成。.Net庫提供了基于CLR的應(yīng)用程序函數(shù)支持。

??? ·? 本地C++應(yīng)用程序是以支持ISO/ANSI C++語言的。

??? ·? 用C++/CLI編寫的應(yīng)用程序需要CLR一起執(zhí)行。

??? ·? 解決方案是一種工程容器。由一個(gè)或多個(gè)工程組合起來解決某類信息處理問題。

??? ·? 工程是代碼和資源容器,代碼和資源也是構(gòu)成程序單元函數(shù)的元素。

??? ·? 程序集是CLR程序的基本單元。所有的CLR出現(xiàn)都是由一個(gè)或多個(gè)程序集組成。

?

從下一章開始,本書前半部分會(huì)大量運(yùn)用控制臺(tái)程序。所有說明C++語言要素的例子都是Win32、CLR控制臺(tái)程序。在結(jié)束對(duì)C++語言的學(xué)習(xí)后才會(huì)再次回到基于MFC的應(yīng)用程序向?qū)稀?o:p>