![windows程序設(shè)計(jì)windows環(huán)境經(jīng)典著_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/021d7554-c9af-45a7-a323-e6705f2ccef7/021d7554-c9af-45a7-a323-e6705f2ccef71.gif)
![windows程序設(shè)計(jì)windows環(huán)境經(jīng)典著_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/021d7554-c9af-45a7-a323-e6705f2ccef7/021d7554-c9af-45a7-a323-e6705f2ccef72.gif)
![windows程序設(shè)計(jì)windows環(huán)境經(jīng)典著_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/021d7554-c9af-45a7-a323-e6705f2ccef7/021d7554-c9af-45a7-a323-e6705f2ccef73.gif)
![windows程序設(shè)計(jì)windows環(huán)境經(jīng)典著_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/021d7554-c9af-45a7-a323-e6705f2ccef7/021d7554-c9af-45a7-a323-e6705f2ccef74.gif)
![windows程序設(shè)計(jì)windows環(huán)境經(jīng)典著_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/021d7554-c9af-45a7-a323-e6705f2ccef7/021d7554-c9af-45a7-a323-e6705f2ccef75.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.windows程序設(shè)計(jì) windows環(huán)境 經(jīng)典著windows程序設(shè)計(jì)(windows環(huán)境)(經(jīng)典著作,本人修改)2010-11-19 18:16本書介紹在Windows下編程的方法。這些程序都采用C語(yǔ)言與原始的Windows API來(lái)編寫。雖然用C與API不是編寫Windows程序的唯一方法。但無(wú)論最終您使用什么方式編程,了解Windows API都是非常重要的。讀此書有三個(gè)先決條件:第一,您應(yīng)該熟悉使用Windows xp。第二,您應(yīng)了解C語(yǔ)言。如果要寫Windows程序,一開始卻不想了解C語(yǔ)言,那不是一個(gè)好主意。我建議您在控制臺(tái)環(huán)境中,例如在MS-DOS命令提示窗口下學(xué)習(xí)C語(yǔ)言。Wi
2、ndows程序設(shè)計(jì)有時(shí)包括一些非文字模式程序設(shè)計(jì)的部分;在這些情況下,我將針對(duì)這些問(wèn)題單獨(dú)討論。所以,您應(yīng)非常熟悉C語(yǔ)言,特別是C語(yǔ)言的結(jié)構(gòu)和指針。了解標(biāo)準(zhǔn)C語(yǔ)言執(zhí)行期鏈接庫(kù)的一些相關(guān)知識(shí)是有幫助的,但不是必要的。第三,您應(yīng)該在機(jī)器上安裝Microsoft Visual C+6.0。至止,不需您具有任何Windows程序的寫作經(jīng)驗(yàn)。Windows簡(jiǎn)史在1981年秋天IBM PC推出不久,MS-DOS就已經(jīng)很明顯成為PC上的主流操作系統(tǒng)。MS-DOS代表Microsoft Disk Operating System(磁盤操作系統(tǒng))。MS-DOS是一個(gè)小型的操作系統(tǒng)。MS-DOS提供給用戶一種命令
3、行接口,提供諸如DIR和TYPE等命令,也可以將應(yīng)用程序加入內(nèi)存執(zhí)行。對(duì)于應(yīng)用程序?qū)懽髡?,它提供了一組用于文件的輸入輸出(I/O)函數(shù)。對(duì)于其它的外圍處理-尤其是將文字或圖形寫到顯示器上-應(yīng)用程序可以直接存取PC的硬件。當(dāng)蘋果計(jì)算機(jī)公司的Lisa計(jì)算機(jī)在1983年1月發(fā)布時(shí),它提供了不同于文字模式環(huán)境的另一種選擇,并在1984年1月成為Macintosh上圖形環(huán)境的一種標(biāo)準(zhǔn)。盡管Macintosh的市場(chǎng)占有率在下降,但是它仍然被認(rèn)為是衡量所有其它圖形環(huán)境的標(biāo)準(zhǔn)。Windows是由微軟在1983年11月(在Lisa之后,Macintosh之前)宣布,并在兩年后(1985年11月)發(fā)行。在此后的兩
4、年中,緊隨著Microsoft Windows早期版本1.0之后,又推出了幾種改進(jìn)版本,以支持國(guó)際商業(yè)市場(chǎng),并提供新型顯示器和打印機(jī)的驅(qū)動(dòng)程序。Windows2.0是在1987年11月正式推出市場(chǎng)的。該版本對(duì)用戶界面做了一些改進(jìn)。這些改進(jìn)中最有效的是使用了可重迭式窗口,而Windows 1.0中使用的是并排式窗口。Windows 2.0還增強(qiáng)了鍵盤和鼠標(biāo)接口,特別是加入了菜單和對(duì)話框。至此,Windows還只需要Intel 8086或者8088等級(jí)的cpu,以實(shí)模式執(zhí)行,能存取地址在1MB以下的內(nèi)存。Windows/386(在Windows 2.0之后不久發(fā)行的)使用Intel 386微處理器
5、的虛擬8086模式,實(shí)現(xiàn)將直接存取硬件的多個(gè)MS-DOS程序窗口化和多任務(wù)化。為了統(tǒng)一起見,Windows版本2.1被更名為Windows/286。Windows 3.0是在1990年5月22日發(fā)表的。它將Windows/286和Windows/386結(jié)合到同一種產(chǎn)品中。Windows 3.0有了一個(gè)很大的改變,這就是對(duì)Intel的286、386和486微處理器保護(hù)模式的支持。這能使Windows和Windows應(yīng)用程序能存取高達(dá)16MB的內(nèi)存。Windows用于執(zhí)行程序和維護(hù)文件的外殼程序得到了全面的改進(jìn)。Windows 3.0是第一個(gè)在家用和辦公室市場(chǎng)上取得成功的版本。任何Windows的
6、歷史介紹都必須包括一些OS/2的說(shuō)明,OS/2是對(duì)DOS和Windows的另一種選擇,最初是由Microsoft和IBM合作開發(fā)的。OS/2版本1.0(只有文字模式)在Intel 286(或者后來(lái)的)微處理器上運(yùn)行,在1987年末發(fā)布。在1988年10月的OS/2版本1.1中出現(xiàn)了管理圖形使用界面的PM(Presentation Manager)。PM最初的設(shè)計(jì)構(gòu)想是成為Windows的一種保護(hù)模式版本,但是圖形API改變程度太大,致使軟件生產(chǎn)廠商很難提供對(duì)這兩種平臺(tái)的支持。到1990年9月,IBM和Microsoft之間的沖突達(dá)到了高峰,導(dǎo)致這兩個(gè)公司最后分道揚(yáng)鑣。IBM接管了OS/2,而M
7、icrosoft明確表示W(wǎng)indows將是他們操作系統(tǒng)策略核心。雖然OS/2仍然擁有一些狂熱的崇拜者,但是它遠(yuǎn)不及Windows這樣的普及程度。Microsoft Windows3.1是1992年4月發(fā)布的,其中包括的幾個(gè)重要特性是TrueType字體技術(shù)(給Windows帶來(lái)可縮放的輪廓字體)、多媒體(聲音和音樂(lè))、對(duì)象連結(jié)和嵌入(OLE:Object Linking and Embedding)和通用對(duì)話框。跟OS/2一樣,Windows 3.1只能在保護(hù)模式下運(yùn)作,并且要求至少配置了1MB內(nèi)存的286或386處理器。在1993年7月發(fā)表的Windows NT是第一個(gè)支持Intel 386
8、、486和Pentium微處理器32位保護(hù)模式的Windows版本。Windows NT提供32位平坦尋址,并使用32位的指令集。(本章后面我會(huì)談到一些尋址空間的問(wèn)題)。Windows NT還可以移植到非Intel處理器上,并在幾種使用RISC芯片的工作站上執(zhí)行。Windows 95是在1995年8月發(fā)布的。和Windows NT一樣,Windows 95也支持Intel 386或更高等級(jí)處理器的32位保護(hù)模式。雖然它缺少Windows NT中的某些功能,諸如高安全性和對(duì)RISC機(jī)器的可移植性等,但是Windows 95具有較少硬件資源的優(yōu)點(diǎn)。Windows 98在1998年6月發(fā)布,具有許多
9、加強(qiáng)功能,包括執(zhí)行效能的提高、更好的硬件支持以及與因特網(wǎng)和全球信息網(wǎng)(WWW)更緊密的結(jié)合。Windows方面Windows 98和Windows NT都是支持32位優(yōu)先權(quán)式多任務(wù)(preemptive multitasking)及多線程的圖形操作系統(tǒng)。Windows擁有圖形用戶接口(GUI),這種用戶界面也稱作可視化接口或圖形窗口環(huán)境。有關(guān)GUI的概念可追溯至70年代中期,在Alto和Star等機(jī)器上以及SmallTalk等環(huán)境中由Xerox PARC所作的研究工作。該項(xiàng)研究的成果后來(lái)被Apple Computer和Microsoft引入并流行起來(lái)。雖然有一些爭(zhēng)議,但現(xiàn)在已非常清楚,GUI是
10、一個(gè)在個(gè)人計(jì)算機(jī)工業(yè)史上集各方面技術(shù)大成于一體的最重要產(chǎn)物。所有GUI都在點(diǎn)矩陣對(duì)應(yīng)的視頻顯示器上處理圖形。圖形提供了使用屏幕的最佳方式、傳遞信息的可視化,以及能夠所見即所得的圖形視頻顯示和為書面文件準(zhǔn)備好格式化文字輸出內(nèi)容等。在早期,顯示器僅用于響應(yīng)用戶通過(guò)鍵盤輸入的文字。在圖形界面中,顯示器自身成為使用者輸入的一個(gè)來(lái)源。顯示器以圖標(biāo)和輸入設(shè)備(例如按鈕和滾動(dòng)條)的形式顯示多種圖形對(duì)象。使用者可以使用鍵盤(或者更直接地使用鼠標(biāo)等指向設(shè)備)直接在屏幕上操縱這些對(duì)象,拖動(dòng)圖形對(duì)象、按下鼠標(biāo)按鈕以及滾動(dòng)滾動(dòng)條。因此,用戶與程序的交流變得更為親密。這不再是一種從鍵盤到程序,再到顯示器的單向信息流動(dòng),
11、使用者已經(jīng)能夠與顯示器上的對(duì)象直接交互作用了。于是使用者不再需要花費(fèi)長(zhǎng)時(shí)間學(xué)習(xí)如何使用計(jì)算機(jī)或掌握新的程序了。Windows讓這一切成真,因?yàn)樗袘?yīng)用程序都有相同的基本外觀和感覺(jué)。程序占據(jù)一個(gè)窗口-屏幕上的一塊矩形區(qū)域。每個(gè)窗口由一個(gè)標(biāo)題列標(biāo)識(shí)。大多數(shù)程序功能由程序的菜單開始。用戶可使用滾動(dòng)條觀察那些無(wú)法在一個(gè)屏幕中裝下的信息。某些菜單項(xiàng)目觸發(fā)對(duì)話框,用戶可在其中輸入額外的信息。幾乎在每個(gè)大的Windows程序中都有一個(gè)用于開啟文件的特殊對(duì)話框。該對(duì)話框在所有這些Windows程序中看起來(lái)都一樣(或接近相同),而且?guī)缀蹩偸菑耐徊藛芜x項(xiàng)中啟動(dòng)。一旦您了解了一個(gè)Windows程序的使用方法,您就
12、會(huì)非常容易的學(xué)會(huì)其它的Windows程序。菜單和對(duì)話框允許用戶試驗(yàn)一個(gè)新程序并探究它的功能。大多數(shù)Windows程序同時(shí)具有鍵盤接口和鼠標(biāo)接口。雖然Windows程序的大多數(shù)功能可通過(guò)鍵盤控制,但使用鼠標(biāo)要容易得多。從程序?qū)懽髡叩慕嵌瓤?,一致的用戶接口?lái)自于Windows建構(gòu)菜單和對(duì)話框的內(nèi)置程序。所有菜單都有同樣的鍵盤和鼠標(biāo)接口,因?yàn)檫@項(xiàng)工作是由Windows處理,而不是由應(yīng)用程序處理。為便于多個(gè)程序的使用,以及這些程序間信息的交換,Windows支持多任務(wù)。在同一時(shí)刻能有多個(gè)Windows程序顯示并運(yùn)行。每個(gè)程序在屏幕上占據(jù)一個(gè)窗口。用戶可在屏幕上移動(dòng)窗口,改變它們的大小,在不同程序間切換
13、,并從一個(gè)程序向另一個(gè)程序傳送數(shù)據(jù)。因?yàn)檫@些窗口看起來(lái)有些像桌面上的紙(當(dāng)然,這是計(jì)算機(jī)還未占據(jù)辦公桌之前的年代),Windows有時(shí)被稱作:一個(gè)顯示多個(gè)程序的桌面。Windows的早期版本使用一種非優(yōu)先權(quán)式(non-preemptive)的多任務(wù)系統(tǒng)。這意味著Windows不使用系統(tǒng)定時(shí)器將處理時(shí)間分配給系統(tǒng)中運(yùn)行的多個(gè)應(yīng)用程序,程序必須自愿放棄控制權(quán)以便其它程序運(yùn)行。在Windows NT和Windows 98中,多任務(wù)是優(yōu)先權(quán)式的,而且程序自身可分割成近乎同時(shí)執(zhí)行的多個(gè)執(zhí)行體。操作系統(tǒng)不對(duì)內(nèi)存進(jìn)行管理便無(wú)法實(shí)現(xiàn)多任務(wù)。當(dāng)新程序啟動(dòng)、舊程序終止時(shí),內(nèi)存會(huì)出現(xiàn)碎裂空間。系統(tǒng)必須能夠?qū)㈤e置的內(nèi)
14、存空間組織在一起,因此系統(tǒng)必須能夠移動(dòng)內(nèi)存中的程序代碼和數(shù)據(jù)塊。即使是在8088微處理器上跑的Windows 1.0也能進(jìn)行這類內(nèi)存管理。在實(shí)際模式限制下,這種能力被認(rèn)為是軟件工程一個(gè)令人驚訝的成就。在Windows 1.0中,PC硬件結(jié)構(gòu)的640KB內(nèi)存限制,在不要求任何額外內(nèi)存的情況下被有效地?cái)U(kuò)展了。但Microsoft并未就此停步:Windows 2.0允許Windows應(yīng)用程序存取擴(kuò)充內(nèi)存(EMS);Windows 3.0在保護(hù)模式下,允許Windows應(yīng)用程序存取高達(dá)16MB的擴(kuò)展內(nèi)存。Windows NT和Windows 98通過(guò)成熟的32位操作系統(tǒng)及平坦尋址空間,擺脫了這些舊的限
15、制。Windows上執(zhí)行的程序可共享在稱為動(dòng)態(tài)鏈接庫(kù)的文件中的例程。Windows包括一個(gè)機(jī)制,能夠在執(zhí)行時(shí)連結(jié)使用動(dòng)態(tài)鏈接庫(kù)中例程的程序。Windows自身基本上就是一個(gè)動(dòng)態(tài)鏈接庫(kù)的集合。Windows是一個(gè)圖形接口,Windows程序能夠在顯示器和打印機(jī)上充分利用圖形和格式化文字。圖形接口不僅在外觀上更有吸引力,而且還能夠讓使用者傳遞高層次的信息。Windows應(yīng)用程序不能直接存取設(shè)備硬件。然而,Windows提供了一種圖形設(shè)備接口(GDI),使顯示圖形和格式化文字更容易。Windows虛擬化了顯示硬件,使為Windows編寫的程序可使用任何具有Windows設(shè)備驅(qū)動(dòng)程序的視頻卡或打印機(jī),
16、而程序無(wú)需確定系統(tǒng)相連的設(shè)備類型。對(duì)Windows開發(fā)者來(lái)說(shuō),將與設(shè)備無(wú)關(guān)的圖形接口輸出到IBM PC上不是件輕松的事。PC的設(shè)計(jì)是基于開放式架構(gòu)的原則,鼓勵(lì)第三方硬件制造商為PC開發(fā)接口設(shè)備,而且開發(fā)了大量這樣的設(shè)備。雖然出現(xiàn)了多種標(biāo)準(zhǔn),PC上的傳統(tǒng)MS-DOS程序仍不得不各自支持許多不同的硬設(shè)備。這對(duì)MS-DOS字處理軟件來(lái)說(shuō)非常普遍,它們連同1到2張有許多小文件的磁盤一同銷售,每個(gè)文件支持一種特定的打印機(jī)。Windows程序不要求每個(gè)應(yīng)用程序都自行開發(fā)這些驅(qū)動(dòng)程序,因?yàn)檫@種支持是Windows的一部分。動(dòng)態(tài)鏈接Windows運(yùn)作機(jī)制的核心是一個(gè)稱作動(dòng)態(tài)鏈接的概念。Windows為應(yīng)用程序
17、提供了豐富的API函數(shù),大多數(shù)用于實(shí)現(xiàn)其用戶接口和在顯示器上顯示文字和圖形。這些函數(shù)采用動(dòng)態(tài)鏈接庫(kù)(Dynamic Linking Library,DLL)的方式撰寫。這些動(dòng)態(tài)鏈接庫(kù)是些具有.DLL或者有時(shí)是.EXE擴(kuò)展名的文件,在Windows 98中通常位于WINDOWSSYSTEM子目錄中,在Windows NT中通常位于WINNTSYSTEM和WINNTSYSTEM32子目錄中。在早期,Windows的主要部分僅通過(guò)三個(gè)動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)。這代表了Windows的三個(gè)主要子系統(tǒng),它們被稱作Kernel、User和GDI。當(dāng)子系統(tǒng)的數(shù)目在Windows最近版本中增多時(shí),大多數(shù)典型的Windo
18、ws程序產(chǎn)生的函數(shù)調(diào)用仍對(duì)應(yīng)到這三個(gè)模塊中。Kernel(日前由16位的KRNL386.EXE和32位的KERNEL32.DLL實(shí)現(xiàn))處理所有在傳統(tǒng)上由操作系統(tǒng)核心處理的事務(wù)-內(nèi)存管理、文件I/O和多任務(wù)管理。User(由16位的USER.EXE和32位的USER32.DLL實(shí)作)指用戶接口,實(shí)現(xiàn)所有窗口操作。GDI(由16位的GDI.EXE和32位的GDI32.DLL實(shí)作)是一個(gè)圖形設(shè)備接口,允許程序在屏幕和打印機(jī)上顯示文字和圖形。Windows 98提供上千種函數(shù)調(diào)用。每個(gè)函數(shù)都有一個(gè)描述名稱,例如CreateWindow。該函數(shù)(如您所猜想的)為程序建立新窗口。所有應(yīng)用程序可以使用的Wi
19、ndows函數(shù)都在表頭文件里預(yù)先聲明過(guò)了。在Windows程序中,使用Windows函數(shù)的方式通常與使用如strlen等C語(yǔ)言鏈接庫(kù)函數(shù)的方式相同。主要的區(qū)別在于C語(yǔ)言鏈接庫(kù)函數(shù)的代碼連結(jié)到您的程序代碼中,而Windows函數(shù)的程序代碼在您程序執(zhí)行文件外的DLL中。當(dāng)您執(zhí)行Windows程序時(shí),它通過(guò)一個(gè)稱作動(dòng)態(tài)鏈接的方式與Windows相接。當(dāng)Windows程序被加載到內(nèi)存中時(shí),程序中的調(diào)用被指向DLL函數(shù)的入口。如果該DLL不在內(nèi)存中,就把它加載到內(nèi)存中。當(dāng)您產(chǎn)生一個(gè)可執(zhí)行文件時(shí),您必須連結(jié)程序開發(fā)環(huán)境提供的特定引用鏈接庫(kù)(import library)。這些引用鏈接庫(kù)包含了動(dòng)態(tài)鏈接庫(kù)名稱
20、和所有Windows函數(shù)的引用信息。連結(jié)程序使用該信息在.EXE文件中建立一個(gè)表格,在加載程序時(shí),Windows使用它將呼叫轉(zhuǎn)換為Windows函數(shù)。WINDOWS程序設(shè)計(jì)選項(xiàng)為說(shuō)明Windows程序設(shè)計(jì)的多種技術(shù),本書提供了許多范例程序。這些程序使用C語(yǔ)言撰寫并原原本本的使用Windows API來(lái)開發(fā)程序。我將這種方法稱作古典Windows程序設(shè)計(jì)。這是我們?cè)?985年的Windows程序的方法,但它今天仍是編寫Windows程序的有效方法。API和內(nèi)存模式對(duì)于程序?qū)懽髡邅?lái)說(shuō),API是由操作系統(tǒng)定義的。API包含了所有應(yīng)用程序能夠使用的windows函數(shù),同時(shí)包含了相關(guān)的數(shù)據(jù)類型和結(jié)構(gòu)。在
21、Windows中,API還意味著一個(gè)特殊的程序架構(gòu),我們將在每章的開頭進(jìn)行研究。一般而言,Windows API自Windows 1.0以來(lái)一直保持一致,沒(méi)什么重大改變。具有Windows 98程序編程經(jīng)驗(yàn)的程序員會(huì)對(duì)Windows 1.0程序的原始碼感覺(jué)非常熟悉。API改變的方式就是進(jìn)行增強(qiáng)。Windows 1.0支持不到450個(gè)函數(shù)調(diào)用,現(xiàn)在已有了上千種函數(shù)調(diào)用。Windows API和它的語(yǔ)法的最大變化來(lái)自于從16位架構(gòu)向32位架構(gòu)轉(zhuǎn)化的過(guò)程中。Windows從版本1.0到版本3.1使用16位Intel 8086、8088、和286微處理器上所謂的分段內(nèi)存模式,由于兼容性的原因,從386
22、開始的32位Intel微處理器也支持該模式。在這種模式下,微處理器緩存器的大小為16位,因此C的int數(shù)據(jù)型態(tài)也是16位寬。在分段內(nèi)存模式下,內(nèi)存地址由兩個(gè)部分組成-一個(gè)16位段(segment)指針和一個(gè)16位偏移量(offset)指標(biāo)。從程序?qū)懽髡叩慕嵌瓤?,這非常凌亂并帶來(lái)了long或far指針(包括段地址和偏移量地址)和short或near指標(biāo)(包括帶有假定段地址的偏移量地址)的區(qū)別。從Windows NT和Windows 95開始,Windows支持使用Intel 386、486和Pentium處理器32位模式下的32位平坦尋址內(nèi)存模式。C語(yǔ)言的int數(shù)據(jù)型態(tài)也擴(kuò)展為32位的值。為32
23、位版本W(wǎng)indows編寫的程序使用簡(jiǎn)單的平坦線性空間尋址的32位指針值。用于16位版本W(wǎng)indows的API(Windows 1.0到Windows 3.1)現(xiàn)在稱作Win16。用于32位版本W(wǎng)indows的API(Windows 95、Windows 98和所有版本的Windows NT)現(xiàn)在稱作Win32。許多函數(shù)調(diào)用在從Win16到Win32的轉(zhuǎn)變中保持相同,但有些需要增強(qiáng)。例如,圖像坐標(biāo)點(diǎn)由Win16中的16位值變?yōu)閃in32中的32位值。此外,某些Win16函數(shù)返回一個(gè)包含在32位整數(shù)值中的二維坐標(biāo)點(diǎn)。這在Win32中不可能,因此增加的新函數(shù)以不同方式運(yùn)作。所有32位版本的Windo
24、ws都支持Win16 API(以確保和舊有應(yīng)用程序兼容)和Win32 API(以運(yùn)行新應(yīng)用程序)。非常有趣的是,Windows NT與Windows 95及Windows 98的工作方式不同。在Windows NT中,Win16函數(shù)通過(guò)一個(gè)轉(zhuǎn)換層被轉(zhuǎn)化為Win32函數(shù),然后被操作系統(tǒng)處理。在Windows 95和Windows 98中,該操作正相反:Win32函數(shù)通過(guò)轉(zhuǎn)換層轉(zhuǎn)換為Win16函數(shù),再由操作系統(tǒng)處理?,F(xiàn)在,Windows都能夠支持Win32 API。然而,每個(gè)操作系統(tǒng)依然都支持某些不被別的操作系統(tǒng)支持的某些功能特性。因?yàn)樗鼈兊南嗤幨窍喈?dāng)可觀的,所以有可能編寫在兩個(gè)操作系統(tǒng)下都可
25、執(zhí)行的程序。而且,人們普遍認(rèn)為這兩個(gè)產(chǎn)品最終會(huì)合而為一。語(yǔ)言選項(xiàng)使用C語(yǔ)言和原始的API不是編寫Windows 98程序的唯一方法。然而,這種方法卻能提供給您最佳的性能、最強(qiáng)大的功能和在發(fā)掘Windows特性方面最大的靈活性。可執(zhí)行文件相對(duì)較小且運(yùn)行時(shí)不要求外部鏈接庫(kù)(自然,Windows DLL自身除外)。最重要的是,不管您最終以什么方式開發(fā)Windows應(yīng)用程序,熟悉API會(huì)使您對(duì)Windows內(nèi)部有更深入的了解。了解越深入,應(yīng)用越自如。雖然我認(rèn)為學(xué)習(xí)古典的Windows程序設(shè)計(jì)對(duì)任何Windows程序?qū)懽髡叨际侵匾?,但我不建議使用C和API編寫每個(gè)Windows應(yīng)用程序。許多程序員,特
26、別是那些為公司內(nèi)部開發(fā)程序或在家編寫娛樂(lè)程序的程序員喜歡輕松的開發(fā)環(huán)境,例如Microsoft Visual Basic或者Borland Delphi(它結(jié)合了對(duì)象導(dǎo)向的Pascal版本)。這些環(huán)境使程序員將精力集中于應(yīng)用程序的用戶界面和相關(guān)用戶接口對(duì)象的程序代碼上。在專業(yè)程序員中,特別是那些開發(fā)商業(yè)應(yīng)用程序的程序員-Microsoft Visual C+和Microsoft Foundation Class Library(MFC)是近年來(lái)流行的選擇。MFC在一組C+對(duì)象類別中封裝了許多Windows程序設(shè)計(jì)中的瑣碎細(xì)節(jié)。最近,Internet和World Wide Web的流行大力推廣著
27、Sun Microsystems的Java,這是一個(gè)受C+啟發(fā)卻與微處理器無(wú)關(guān)的程序設(shè)計(jì)語(yǔ)言,而且結(jié)合了可在幾個(gè)操作系統(tǒng)平臺(tái)上執(zhí)行的圖形應(yīng)用程序開發(fā)工具組。顯然,很難說(shuō)哪種方法更有利于開發(fā)Windows應(yīng)用程序。更主要的是,也許是應(yīng)用程序自身的特性決定了所使用的工具。不管您最后實(shí)際上使用什么工具寫作程序,學(xué)習(xí)Windows API將使您更深入地了解Windows工作的方式。Windows是一個(gè)復(fù)雜的系統(tǒng),在API上增加一個(gè)程序?qū)懽鲗硬⑽礈p少它的復(fù)雜性,僅僅是掩蓋了它,早晚您會(huì)碰到它。了解API會(huì)給您更好的補(bǔ)救機(jī)會(huì)。在原始的Windows API之上的任何軟件層都必定將您限制在全部功能的一個(gè)子集
28、內(nèi)。您也許發(fā)現(xiàn),例如,使用Visual Basic編寫應(yīng)用程序非常理想,然而它不允許您做一個(gè)或兩個(gè)很簡(jiǎn)單的基本工作。在這種情況下,您將不得不使用原始的API。API定義了作為Windows程序員所需的一切。沒(méi)有什么方法比直接使用API更萬(wàn)能的了。MFC尤其問(wèn)題百出。雖然它大幅簡(jiǎn)化了某些工作(例如OLE),我卻經(jīng)常發(fā)現(xiàn)要讓它們按我所想的去工作時(shí),就會(huì)在其它特性(例如Document/View架構(gòu))上碰壁。MFC還不是Windows程序設(shè)計(jì)者所追求的靈丹妙藥,很少有人認(rèn)為它是一個(gè)好的對(duì)象導(dǎo)向設(shè)計(jì)的模型。然而MFC程序員對(duì)MFC的對(duì)象類別定義受益頗深,并會(huì)在編程時(shí)經(jīng)常參考MFC原碼,然而要搞懂這些原
29、碼就必須學(xué)習(xí)Windows API。程序開發(fā)環(huán)境Microsoft Visual C+6.0中包括C編譯器和其它編譯及連結(jié)Windows程序所需的文件和工具等。它還包括一個(gè)可編輯原始碼、以交談方式建立資源(如圖標(biāo)和對(duì)話框)以及編輯、編譯、執(zhí)行和測(cè)試程序的環(huán)境。API文件本書不是Windows API權(quán)威的正式文件的替代品。當(dāng)您安裝Visual C+6.0時(shí),您將得到一個(gè)包括API文件的在線求助系統(tǒng)。您可通過(guò)訂閱MSDN或使用Microsoft網(wǎng)站上的在線求助系統(tǒng)更新該文件。連接到,并選擇MSDN Library Online。在Visual C+6.0中,從Help菜單項(xiàng)選擇Contents項(xiàng)
30、目開啟MSDN窗口。API文件按樹形結(jié)構(gòu)組織,尋找標(biāo)有Platform SDK的部分,所有在本書中引用的文件都來(lái)自于該部分。我將向您介紹如何從Platform SDK開始尋找以斜線分層分門別類的文件的位置。(我知道Platform SDK是整個(gè)MSDN知識(shí)庫(kù)中較為晦澀的部分,但我敢保證那是Windows程序設(shè)計(jì)的基本核心。)例如,對(duì)于如何在Windows程序中使用鼠標(biāo)的文件,您可參考/Platform SDK/User Interface Services/User Input/Mouse Input。我在前面提到Windows大致分為Kernel、User和GDI子系統(tǒng)。kernel接口在/
31、Platform SDK/Windows Base Services中,User界面函數(shù)在/Platform SDK/User Interface Services中,GDI位于/Platform SDK/Graphics and Multimedia Services/GDI中。編寫第一個(gè)WINDOWS程序現(xiàn)在是開始寫些程序的時(shí)候了。為了便于對(duì)比,讓我們以一個(gè)非常短的Windows程序和一個(gè)簡(jiǎn)短的文字模式程序開始。這會(huì)幫助我們找到使用開發(fā)環(huán)境并感受建立和編譯程序機(jī)制的正確方向。文字模式(Character-Mode)模型程序員們喜愛(ài)的一本書是The CProgramming Language
32、(Prentice Hall,1978年和1988年),由Brian W.Kernighan和Dennis M.Ritchie(親切地稱為K&R)編著。該書的第一章以一個(gè)顯示hello,world的C語(yǔ)言程序開始。這里是在The CProgramming Language第一版第6頁(yè)中出現(xiàn)的程序:main()printf("hello,worldn");以前C程序員在使用printf等C執(zhí)行期鏈接庫(kù)函數(shù)時(shí),無(wú)需先聲明它們。但現(xiàn)在,我們?cè)敢饨o編譯器一個(gè)在我們的程序中標(biāo)出錯(cuò)誤的機(jī)會(huì)。這里是在K&R第二版中修正的程序:#include stdio.h main()
33、printf("hello,worldn");該程序仍然是那么短。但它可通過(guò)編譯并執(zhí)行得很好,但當(dāng)今許多程序員更愿意清楚地說(shuō)明main函數(shù)的返回值,在這種情況下ANSI C規(guī)定該函數(shù)必須返回一個(gè)值:#include stdio.h int main()printf("hello,worldn");return 0;我們還可以包括main的參數(shù),把程序弄得更長(zhǎng)一些,但讓我們暫且這樣就好了-包括一個(gè)include聲明、程序的進(jìn)入點(diǎn)、一個(gè)執(zhí)行期鏈接庫(kù)聲明和一個(gè)return語(yǔ)句。同樣效果的Windows程序Windows關(guān)于hello,world程序的等價(jià)程序有
34、和文字模式版本完全相同的組件。它有一個(gè)include聲明、一個(gè)程序進(jìn)入點(diǎn)、一個(gè)函數(shù)調(diào)用和一個(gè)return語(yǔ)句。下面便是該程序:/*-HelloMsg.c-Displays"Hello,Windows 98!"in amessage box(c)Charles Petzold,1998-*/#include windows.h int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)MessageBox(NULL,TEXT("Hello,Wi
35、ndows 98!"),TEXT("HelloMsg"),0);return 0;在剖析該程序之前,讓我們看一下在Visual C+Developer Studio中建立新程序的方式。首先,從File菜單中選New。在New對(duì)話框中,單擊Projects頁(yè)面標(biāo)簽,選擇Win32 Application。在Location欄中,選擇一個(gè)子目錄,在Project Name欄中,輸入該項(xiàng)目的名稱,此時(shí)該名稱是HelloMsg,這便是在Location欄中顯示的目錄的子目錄。Create New Workspace復(fù)選框應(yīng)該勾起來(lái),Platforms部分應(yīng)該顯示W(wǎng)in32
36、,選擇OK。將會(huì)出現(xiàn)一個(gè)標(biāo)題為Win32 Application-Step 1Of 1的對(duì)話框,指出要建立一個(gè)Empty Project,并按下Finish按鈕。從File菜單中再次選擇New。在New對(duì)話框中,選擇Files頁(yè)面標(biāo)簽,選擇C+Source File。Add To Project復(fù)選框應(yīng)被選中,并應(yīng)顯示HelloMsg。在File Name欄中輸入HelloMsg.c,選中OK。現(xiàn)在您可輸入上面所示的HELLOMSG.C文件,您也可以選擇Insert菜單和File As Text選項(xiàng)從本書附帶的CD-ROM上復(fù)制HELLOMSG.C的內(nèi)容。從結(jié)構(gòu)上說(shuō),HELLOMSG.C與K&
37、amp;R的hello,world程序是相同的。表頭文件STDIO.H已被WINDOWS.H所代替,進(jìn)入點(diǎn)main被WinMain所代替,而且C語(yǔ)言執(zhí)行時(shí)期鏈接庫(kù)函數(shù)printf被Windows API函數(shù)MessageBox所代替。然而,在程序中有許多新東西,包括幾個(gè)陌生的大寫標(biāo)識(shí)符。讓我們從頭開始。頭文件HELLOMSG.C以一個(gè)前置處理器指示命令開始,實(shí)際上在每個(gè)用C編寫的Windows程序的開頭都可看到:#include windows.h WINDOWS.H是主要的含入文件,它包含了其它Windows頭文件,這些頭文件的某些也包含了其它頭文件。這些頭文件中最重要的和最基本的是:WIN
38、DEF.H基本型態(tài)定義。WINNT.H支持Unicode的型態(tài)定義。WINBASE.H Kernel函數(shù)。WINUSER.H用戶接口函數(shù)。WINGDI.H圖形設(shè)備接口函數(shù)。這些頭文件定義了Windows的所有數(shù)據(jù)類型、函數(shù)定義、數(shù)據(jù)結(jié)構(gòu)和常數(shù)標(biāo)識(shí)符,它們是Windows文件中的一個(gè)重要部分。使用Visual C+Developer Studio的Edit菜單中的Find in Files搜索這些頭文件非常方便。您還可以在Developer Studio中打開這些頭文件并直接閱讀它們。程序進(jìn)入點(diǎn)正如在C程序中的進(jìn)入點(diǎn)是函數(shù)main一樣,Windows程序的進(jìn)入點(diǎn)是WinMain,總是像這樣出現(xiàn):
39、int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)該進(jìn)入點(diǎn)在/Platform SDK/User Interface Services/Windowing/Windows/Window Reference/Window Functions中有說(shuō)明。它在WINBASE.H中聲明如下:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd);
40、您會(huì)注意到我在HELLOMSG.C中做了許多小改動(dòng)。第三個(gè)參數(shù)在WINBASE.H中定義為L(zhǎng)PSTR,我將它改為PSTR。這兩種數(shù)據(jù)型態(tài)都定義在WINNT.H中,作為指向字符串的指針。LP前綴代表長(zhǎng)指針,這是16位Windows下的產(chǎn)物。我還在WinMain聲明中改變了兩個(gè)參數(shù)的名稱。許多Windows程序中的變量名使用一種稱作匈牙利表示法的命名系統(tǒng),該系統(tǒng)在變量名稱前面增加了表示變量數(shù)據(jù)型態(tài)的短前綴,我將在第三章更詳細(xì)地討論這個(gè)概念?,F(xiàn)在僅需記住前綴i表示int、sz表示以零結(jié)束的字符串。WinMain函數(shù)聲明為返回一個(gè)int值。WINAPI標(biāo)識(shí)符在WINDEF.H定義,語(yǔ)句如下:#defi
41、ne WINAPI _stdcall該語(yǔ)句指定了一個(gè)調(diào)用約定,包括如何生產(chǎn)機(jī)械碼以在堆棧中放置函數(shù)的參數(shù)。許多Windows函數(shù)聲明為WINAPI。WinMain的第一個(gè)參數(shù)被稱作執(zhí)行實(shí)例句柄。在Windows程序設(shè)計(jì)中,句柄僅是一個(gè)應(yīng)用程序用來(lái)識(shí)別某些東西的數(shù)字。在這種情況下,該句柄唯一地標(biāo)識(shí)該程序,還需要它在其它Windows函數(shù)中作為參數(shù)。在Windows的早期版本中,當(dāng)同時(shí)運(yùn)行同一程序多次時(shí),您便創(chuàng)建了該程序的多個(gè)實(shí)例(multiple instances)。同一應(yīng)用程序的所有實(shí)例共享程序和只讀的內(nèi)存(通常是例如菜單和對(duì)話框模板的資源)。程序通過(guò)檢查hPrevInstance參數(shù)就能夠
42、確定自身以外的其它實(shí)例是否正在運(yùn)行。然后它可以略過(guò)一些繁雜的工作并從前面的實(shí)例中將某些數(shù)據(jù)移到自己的數(shù)據(jù)區(qū)域。在32位Windows版本中,該概念已被拋棄。傳給WinMain的第二個(gè)參數(shù)總是NULL(定義為0)。WinMain的第三個(gè)參數(shù)是用于執(zhí)行程序的命令列。某些Windows應(yīng)用程序利用它在程序啟動(dòng)時(shí)將文件加載內(nèi)存。WinMain的第四個(gè)參數(shù)指出程序最初顯示的方式,可以是正常的或者是最大化地充滿整個(gè)畫面,或者是最小化顯示在工作列中。我們將在第三章中介紹使用該參數(shù)的方法。MessageBox函數(shù)MessageBox函數(shù)用于顯示短信息。雖然,MessageBox顯示的小窗口不具有什么功能,實(shí)際
43、上它被認(rèn)為是一個(gè)對(duì)話框。MessageBox的第一個(gè)參數(shù)通常是窗口句柄,我們將在第三章介紹其含義。第二個(gè)參數(shù)是在消息框主體中顯示的字符串,第三個(gè)參數(shù)是出現(xiàn)在消息框標(biāo)題列上的字符串。在HELLMSG.C中,這些文字字符串的每一個(gè)都被封裝在一個(gè)TEXT宏中。通常您不必將所有字符串都封裝在TEXT宏中,但如果想將您的程序轉(zhuǎn)換為Unicode字符集,這確是一個(gè)好主意。我將在第二章詳細(xì)討論該問(wèn)題。MessageBox的第四個(gè)參數(shù)可以是在WINUSER.H中定義的一組以前綴MB_開始的常數(shù)的組合。您可從第一組中選擇一個(gè)常數(shù)指出希望在對(duì)話框中顯示的按鈕:#define MB_OK 0x 00000000L#
44、define MB_OKCANCEL 0x 00000001L#define MB_ABORTRETRYIGNORE 0x 00000002L#define MB_YESNOCANCEL 0x 00000003L#define MB_YESNO 0x 00000004L#define MB_RETRYCANCEL 0x 00000005L如果在HELLOMSG中將第四個(gè)參數(shù)設(shè)置為0,則僅顯示OK按鈕??梢允褂肅語(yǔ)言的OR(|)操作符號(hào)將上面顯示的一個(gè)常數(shù)與代表內(nèi)定按鈕的常數(shù)組合:#define MB_DEFBUTTON1 0x 00000000L#define MB_DEFBUTTON2 0x
45、 00000100L#define MB_DEFBUTTON3 0x 00000200L#define MB_DEFBUTTON4 0x 00000300L還可以使用一個(gè)常數(shù)指出消息框中圖示的外觀:#define MB_ICONHAND 0x 00000010L#define MB_ICONQUESTION 0x 00000020L#define MB_ICONEXCLAMATION 0x 00000030L#define MB_ICONASTERISK 0x 00000040L這些圖示中的某些有替代名稱:#define MB_ICONWARNING MB_ICONEXCLAMATION#define MB_ICONERROR MB_ICONHAND#define MB_ICONINFORMATION MB_ICONASTERISK#define MB_ICONSTOP MB_ICONHAND雖然只有少數(shù)其它MB_常數(shù),但您可以自己參考頭文件或/Platform SDK/User
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 糧油加工廠出租居間合同
- 汽車美容店裝修監(jiān)理合同
- 二零二五年度辦公室勞動(dòng)合同地址確認(rèn)及員工績(jī)效獎(jiǎng)金協(xié)議
- 裝修分期付款合同須知
- 報(bào)關(guān)合同和銷售合同
- 新勞動(dòng)合同法規(guī)定
- 三農(nóng)村電商行業(yè)監(jiān)管與政策支持方案
- 軟件開發(fā)流程與項(xiàng)目管理作業(yè)指導(dǎo)書
- 居間合同物權(quán)方
- 建筑裝飾裝修工程作業(yè)指導(dǎo)書
- 醫(yī)?;鸨O(jiān)管培訓(xùn)課件
- 開工第一課安全教育記錄表
- 一氧化碳中毒與搶救知識(shí)考核試題與答案
- 部編版小學(xué)語(yǔ)文四年級(jí)下冊(cè)教師教學(xué)用書(教學(xué)參考)完整版
- 初中生物面團(tuán)發(fā)酵實(shí)驗(yàn)報(bào)告
- 工程項(xiàng)目總投資的構(gòu)成及估算
- 串通招投標(biāo)法律問(wèn)題研究
- 高原鐵路建設(shè)衛(wèi)生保障
- 顳下頜關(guān)節(jié)盤復(fù)位固定術(shù)后護(hù)理查房
- 新版藥品管理法培訓(xùn)完整版本課件
- 硝苯地平控釋片
評(píng)論
0/150
提交評(píng)論