第一章 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)_第1頁(yè)
第一章 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)_第2頁(yè)
第一章 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)_第3頁(yè)
第一章 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)_第4頁(yè)
第一章 計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、計(jì)算機(jī)程序設(shè)計(jì)基礎(chǔ)1.1 編程語(yǔ)言及其發(fā)展1.1.1 計(jì)算機(jī)編程語(yǔ)言 所謂計(jì)算機(jī)程序,是計(jì)算機(jī)所執(zhí)行的一系列指令的集合,通過(guò)這些指令集合,計(jì)算機(jī)可以實(shí)現(xiàn)數(shù)值計(jì)算、信息處理、信息顯示等功能。 計(jì)算機(jī)系統(tǒng)采用電信號(hào)表示其內(nèi)部的所有信息,而每個(gè)電信號(hào)往往采用通、斷兩個(gè)狀態(tài)表示,因而,計(jì)算機(jī)內(nèi)的所有信息均采用二進(jìn)制格式保存,無(wú)論是執(zhí)行指令、需要處理的數(shù)據(jù),還是顯示的文字符號(hào)。例如,文字處理時(shí),在屏幕某個(gè)位置顯示字母“A”,實(shí)際是將65這個(gè)數(shù)據(jù)的二進(jìn)制格式送給了顯卡,則由顯卡根據(jù)65對(duì)應(yīng)的字母A的點(diǎn)陣特征,輸出視頻信號(hào)給顯示器,從而在顯示器的某個(gè)位置“畫”出字母“A”。 從第一臺(tái)電子計(jì)算機(jī)開(kāi)始,就采用二

2、進(jìn)制格式存儲(chǔ)計(jì)算機(jī)指令,這種格式的指令稱為機(jī)器語(yǔ)言,是CPU唯一能夠識(shí)別的內(nèi)容。例如,將數(shù)18送給普通微機(jī)CPU內(nèi)部的某個(gè)寄存器BX(寄存器是CPU內(nèi)部用于存放數(shù)據(jù)的單元),其機(jī)器語(yǔ)言格式如下: 這樣以若干0和1組成的指令不利于記憶,一般人往往無(wú)法記住CPU某個(gè)指令的二進(jìn)制格式,為此,引入了助記符的概念,即采用便于記憶的英文單詞或其縮寫格式代表相應(yīng)的機(jī)器語(yǔ)言,如,對(duì)上面的機(jī)器語(yǔ)言,采用下面格式表示: MOV BX,18 用“MOV”這樣的縮寫表示傳送數(shù)據(jù),一般程序員只要了解代表指令的這樣助記符,就可以編寫程序。 但是,這樣書寫的計(jì)算機(jī)程序,計(jì)算機(jī)的CPU是沒(méi)法識(shí)別的,為此需要把助記符格式的程序

3、翻譯成對(duì)應(yīng)的機(jī)器語(yǔ)言,這個(gè)過(guò)程稱為編譯(Compile),是由專門的工具實(shí)現(xiàn)的,如微軟公司提供的MASM工具就可以進(jìn)行編譯工作。 采用助記符格式的編程語(yǔ)言,稱為匯編語(yǔ)言,所有的CPU系統(tǒng)都具有自己的匯編語(yǔ)言。匯編語(yǔ)言雖然解決了程序設(shè)計(jì)的基本問(wèn)題(不需要記憶那些0、1的組合),但仍然存在如下問(wèn)題:匯編語(yǔ)言需要程序員了解CPU的結(jié)構(gòu)和基本工作原理。如果需要計(jì)算18+20的結(jié)果,必須先將參與計(jì)算的一個(gè)數(shù)送到計(jì)算機(jī)內(nèi)部的某個(gè)寄存器中(如上面的BX寄存器),然后才能執(zhí)行加法指令,加的結(jié)果還需要再送回內(nèi)存的某個(gè)區(qū)域,以便CPU進(jìn)行下一步的計(jì)算。程序員必須知道CPU內(nèi)部有哪些寄存器,其中又有哪些寄存器能夠用

4、于存放參與計(jì)算的數(shù)據(jù)。 上面的例子用匯編書寫如下: MOV BX,18 ADD BX,20 MOV 1000,BX 對(duì)編程人員來(lái)說(shuō),僅僅需要確定讓CPU計(jì)算加法,不想了解其細(xì)節(jié)。基于這樣的目的,發(fā)明了各種高級(jí)編程語(yǔ)言,如Fortran、Basic、C等,它們均采用符合人類自然描述語(yǔ)言的語(yǔ)法書寫計(jì)算機(jī)程序,如Basic語(yǔ)言實(shí)現(xiàn)上述計(jì)算的格式如下: A=10+20 高級(jí)語(yǔ)言簡(jiǎn)化了程序設(shè)計(jì)的難度,程序員不必了解細(xì)節(jié),編寫的程序由專門的編譯工具轉(zhuǎn)換成機(jī)器語(yǔ)言。正是這些高級(jí)語(yǔ)言的產(chǎn)生,才使得計(jì)算機(jī)編程能夠推廣開(kāi)來(lái)。 常見(jiàn)的高級(jí)編程語(yǔ)言包括:* DOS應(yīng)用程序:Fortran、Basic、Pascal、C

5、* Windows應(yīng)用程序:Visual C+、Visual Basic、Delphi、C+ Builder、Java 編程語(yǔ)言除了進(jìn)行簡(jiǎn)單的加、減、乘、除計(jì)算外,有時(shí)還需要進(jìn)行更復(fù)雜的科學(xué)計(jì)算,如三角、指數(shù)、對(duì)數(shù)等函數(shù)計(jì)算,而CPU并沒(méi)有與這些函數(shù)對(duì)應(yīng)的指令,只能采取一些近似的數(shù)值算法。這些數(shù)值算法并非每個(gè)編程人員都清楚,因而每個(gè)編程語(yǔ)言都提供了這些函數(shù)的通用算法,并以庫(kù)函數(shù)的形式提供給程序員,程序員編程時(shí),只需要簡(jiǎn)單地調(diào)用這些標(biāo)準(zhǔn)函數(shù)即可,如Visual Basic采用sin(x)進(jìn)行正弦函數(shù)計(jì)算。 當(dāng)編譯工具把程序員編寫的高級(jí)語(yǔ)言程序(稱為源程序)編譯成機(jī)器語(yǔ)言時(shí),遇到其中的函數(shù),并不能

6、轉(zhuǎn)換成機(jī)器語(yǔ)言。這樣編譯的程序稱為目標(biāo)程序,以.obj為后綴。不管是什么編程語(yǔ)言,編譯后的目標(biāo)程序都是統(tǒng)一的機(jī)器格式。 為了產(chǎn)生真正可以運(yùn)行的程序,還需要將編譯好的目標(biāo)程序與編程語(yǔ)言提供的庫(kù)文件中某些函數(shù)的指令連接在一起。這個(gè)步驟稱為鏈接(Link),只有經(jīng)過(guò)鏈接的程序才能產(chǎn)生可執(zhí)行的.exe文件。 所有語(yǔ)言的編程步驟如下: 編輯(編寫源程序)、編譯(轉(zhuǎn)換成目標(biāo)程序)、鏈接(生成可執(zhí)行程序) 需要說(shuō)明的是,不同語(yǔ)言編譯的方式不同。有的語(yǔ)言是先將所有程序代碼一起編譯成機(jī)器語(yǔ)言,再鏈接生成可執(zhí)行文件,如C語(yǔ)言、Pascal語(yǔ)言,這種語(yǔ)言稱為編譯型語(yǔ)言,最后以可執(zhí)行的exe文件運(yùn)行;有的語(yǔ)言則可以邊

7、編譯邊執(zhí)行,如Basic語(yǔ)言、Java語(yǔ)言,這種語(yǔ)言稱為解釋型語(yǔ)言;也有些語(yǔ)言既提供編譯運(yùn)行的方式,也提供解釋運(yùn)行的方式,如Visual Basic,在調(diào)試程序時(shí)可以采用解釋型,一旦調(diào)試完成,則采用編譯型,將源程序編譯成可執(zhí)行的exe文件。編譯型語(yǔ)言的程序執(zhí)行速度比解釋型語(yǔ)言的程序執(zhí)行速度快。 編程語(yǔ)言種類很多,初學(xué)者究竟應(yīng)該選擇哪種語(yǔ)言?在常用的Windows應(yīng)用程序編程語(yǔ)言中,Visual Basic難度最小,功能也最弱,而Visual C+難度最大,功能也最強(qiáng)大。如果只希望編寫簡(jiǎn)單初級(jí)程序,盡量選擇Visual Basic,如果需要編寫功能強(qiáng)大的程序,特別是需要與計(jì)算機(jī)硬件打交道的程序,

8、則選擇Visual C+。其實(shí),語(yǔ)言本身的語(yǔ)法都比較簡(jiǎn)單,掌握起來(lái)也不難。 Visual Basic將Windows應(yīng)用程序設(shè)計(jì)的許多細(xì)節(jié)都隱藏起來(lái)了,程序員不需要了解其細(xì)節(jié),只要依照其語(yǔ)法編程即可。而采用Visual C+語(yǔ)言編程,必須了解Windows程序設(shè)計(jì)的細(xì)節(jié),以及封裝這些細(xì)節(jié)的幾百個(gè)類(即微軟基本類庫(kù)MFC),而這正是Visual C+學(xué)習(xí)的難點(diǎn)。 雖然Visual Basic隱藏了許多細(xì)節(jié),但了解掌握Windows程序設(shè)計(jì)的細(xì)節(jié)對(duì)學(xué)好Visual Basic也有很大的幫助,還可以應(yīng)用這些細(xì)節(jié)編寫出功能強(qiáng)大的應(yīng)用程序。 本章也將以一定的篇幅介紹Windows程序設(shè)計(jì)的特點(diǎn),更多的細(xì)

9、節(jié)可以參考有關(guān)Windows程序設(shè)計(jì)的書籍。1.1.2 編程語(yǔ)言涉及的主要內(nèi)容 各種編程語(yǔ)言的語(yǔ)法不同,但都涉及以下內(nèi)容:變量定義、賦值語(yǔ)句、條件語(yǔ)句、循環(huán)語(yǔ)句、結(jié)構(gòu)與類等 一、變量與類型 程序設(shè)計(jì)過(guò)程中,往往涉及到大量的數(shù)據(jù),這些數(shù)據(jù)一般都存放在存儲(chǔ)器中(主要是內(nèi)存中)。所謂變量定義,就是在內(nèi)存中申請(qǐng)一個(gè)區(qū)域保存某個(gè)數(shù)據(jù)。內(nèi)存以8位二進(jìn)制為單元保存信息,這樣一個(gè)單元稱為字節(jié)(Byte),實(shí)際申請(qǐng)內(nèi)存時(shí),可能需要一個(gè)或多個(gè)字節(jié)單元,申請(qǐng)的內(nèi)存單元數(shù)量越多,可以保存的數(shù)據(jù)也越大。變量的類型就是申請(qǐng)內(nèi)存時(shí)的單元數(shù)量以及數(shù)據(jù)存放在這些單元中的格式。 編程語(yǔ)言往往都提供一些變量類型存放:整數(shù)、小數(shù)和字

10、符。其中整數(shù)的存放可以申請(qǐng)的內(nèi)存單元一般為1個(gè)、2個(gè)、4個(gè)、8個(gè);小數(shù)的存放可以申請(qǐng)的內(nèi)存單元一般為4個(gè)和8個(gè);而字符的存放一般為1個(gè)和2個(gè)。 以Visual Basic6.0為例,整數(shù)類型分成:字節(jié)型(Byte)、整型(Integer,占2個(gè)單元)、長(zhǎng)整型(Long,占4個(gè)單元);小數(shù)類型分成:?jiǎn)尉龋⊿ingle,4個(gè)單元)、雙精度(Double,8個(gè)單元);字符類型為String。 每一種類型表示的數(shù)據(jù)范圍一定,在定義時(shí)一定要了解數(shù)據(jù)的范圍,再選擇合適的類型。例如:Visual Basic6.0的字節(jié)型(Byte)可以保存0到255的數(shù)據(jù),如果把256賦給它,則保存不下,運(yùn)行程序時(shí)就會(huì)提

11、示出錯(cuò)。 不同的編程語(yǔ)言,各種類型需要的內(nèi)存單元數(shù)量和表示的數(shù)據(jù)范圍不同,例如整數(shù)Integer,Visual Basic6.0采用兩個(gè)內(nèi)存單元,表示數(shù)據(jù)范圍為-32768(2的15次方)到32767;而Visual Basic.NET則采用四個(gè)內(nèi)存單元,表示數(shù)據(jù)范圍為-(2的31次方)到。 計(jì)算機(jī)保存正整數(shù)比較容易,采用其二進(jìn)制格式即可,負(fù)整數(shù)則需要采用特殊的補(bǔ)碼格式保存,對(duì)于n位的負(fù)整數(shù),其表示范圍為。 小數(shù)的存放則比較麻煩,一般采用浮點(diǎn)格式,即把小數(shù)表示為指數(shù)和尾數(shù)的格式分別保存,單精度和雙精度小數(shù)的表示范圍大約為和,它們的有效位數(shù)分別為7位和15位。例如,Visual Basic6.0

12、將某個(gè)變量定義成單精度(Single),則數(shù)據(jù).01保存時(shí),最后的1不能存放,實(shí)際保存為.0。在處理小數(shù)時(shí)一定注意這樣的問(wèn)題。 小數(shù)保存時(shí),先轉(zhuǎn)換成對(duì)應(yīng)的二進(jìn)制格式,再按照指數(shù)和尾數(shù)格式存放。并非所有的十進(jìn)制小數(shù)都能準(zhǔn)確地轉(zhuǎn)換成相應(yīng)的二進(jìn)制格式,如十進(jìn)制小數(shù)0.1表示成二進(jìn)制(乘2取整法,即每次乘以2,將整數(shù)部分提出,保留小數(shù)部分繼續(xù)乘以2,直到結(jié)果為1),為無(wú)限循環(huán),如果保存為單精度,則保存從1向后的23位二進(jìn)制(單精度格式共4個(gè)單元32位,其中1位表示正負(fù),8位表示指數(shù),23位表示尾數(shù))。絕大多數(shù)小數(shù)都是保存的近似值。 對(duì)于同一類型的一批數(shù)據(jù),可以采用數(shù)組形式進(jìn)行定義,這樣就可以使用循環(huán)結(jié)

13、構(gòu)進(jìn)行處理。 程序執(zhí)行時(shí),可以申請(qǐng)的內(nèi)存區(qū)域有三處: 程序中定義的數(shù)據(jù)段。每個(gè)應(yīng)用程序保存其特定數(shù)據(jù)的區(qū)域,在應(yīng)用程序進(jìn)入內(nèi)存開(kāi)始運(yùn)行時(shí),就已經(jīng)確定了其位置和大小。其中保存什么樣的數(shù)據(jù),每個(gè)數(shù)據(jù)存放在哪兒,都是固定的。這段內(nèi)存在應(yīng)用程序執(zhí)行的整個(gè)過(guò)程中都是有效的,任何別的應(yīng)用程序都不能占用它,只有應(yīng)用程序結(jié)束后才可以釋放它們?cè)俜峙浣o其它應(yīng)用程序。只要在這個(gè)區(qū)域定義的變量,在整個(gè)應(yīng)用程序執(zhí)行過(guò)程中都有效,這樣的變量稱為全局變量。實(shí)際上,應(yīng)用程序在開(kāi)始執(zhí)行時(shí),就是按照全局變量的定義情況來(lái)分配數(shù)據(jù)段的。另外,子程序或函數(shù)中定義的靜態(tài)變量也是在數(shù)據(jù)段內(nèi)申請(qǐng)內(nèi)存,因而它們?cè)谧映绦蚧蚝瘮?shù)結(jié)束后數(shù)據(jù)仍然有效

14、。靜態(tài)變量與全局變量的區(qū)別在于靜態(tài)變量只能由某個(gè)子程序或函數(shù)訪問(wèn),而全局變量可以由所有的子程序和函數(shù)訪問(wèn)。 程序中定義的堆棧段(Stack)。每個(gè)應(yīng)用程序保存其臨時(shí)數(shù)據(jù)的區(qū)域,該區(qū)域的位置和大小也是確定的,但程序開(kāi)始運(yùn)行時(shí)并不確定其中保存什么數(shù)據(jù)。在應(yīng)用程序運(yùn)行過(guò)程中,根據(jù)需要把特定數(shù)據(jù)保存在其中。保存在這里的數(shù)據(jù)按照先進(jìn)后出的方式管理,在不同的時(shí)刻,其中的數(shù)據(jù)代表的含義不同。定義在這里的變量稱為局部變量,只在某個(gè)特定范圍內(nèi)有效。一般,在子程序或函數(shù)內(nèi)部定義的普通變量都是定義在堆棧中的,進(jìn)入子程序時(shí)申請(qǐng)堆棧中的內(nèi)存存放這些變量,數(shù)據(jù)有效,一旦子程序運(yùn)行結(jié)束,系統(tǒng)自動(dòng)釋放這些內(nèi)存,則數(shù)據(jù)無(wú)效。

15、當(dāng)前系統(tǒng)剩余的內(nèi)存。應(yīng)用程序執(zhí)行時(shí)根據(jù)需要從系統(tǒng)剩余內(nèi)存申請(qǐng),這種內(nèi)存往往稱為堆(Heap),只要系統(tǒng)還有空閑內(nèi)存,就可以申請(qǐng)。數(shù)據(jù)段和堆棧段的大小是固定的,而堆內(nèi)存則不固定。需要注意的,從堆中申請(qǐng)內(nèi)存后,系統(tǒng)以后能夠再次申請(qǐng)的內(nèi)存數(shù)量就減少,隨著堆內(nèi)存申請(qǐng)?jiān)龆啵到y(tǒng)內(nèi)存越來(lái)越少,最終導(dǎo)致使用硬盤代替內(nèi)存,降低執(zhí)行速度,甚至有可能導(dǎo)致系統(tǒng)崩潰。有時(shí)候,計(jì)算機(jī)系統(tǒng)感染病毒后,病毒程序不斷申請(qǐng)內(nèi)存,導(dǎo)致堆中可以申請(qǐng)的內(nèi)存越來(lái)越少,可以明顯感覺(jué)到程序執(zhí)行速度變慢,甚至很長(zhǎng)時(shí)間沒(méi)有反應(yīng),就像死機(jī)一樣。編寫程序時(shí),對(duì)于從堆中申請(qǐng)的內(nèi)存,使用后應(yīng)該立即釋放。二、變量賦值 賦值是將具體的數(shù)據(jù)保存到定義該變量

16、時(shí)申請(qǐng)的那段內(nèi)存區(qū)域內(nèi)。如果賦值數(shù)據(jù)超過(guò)所申請(qǐng)的區(qū)域,不同語(yǔ)言處理方法不同:Visual Basic提示出錯(cuò),而Visual C+則以能夠存放進(jìn)去的部分作為數(shù)據(jù),超過(guò)部分放棄。例如,對(duì)于占用1個(gè)單元的正整數(shù),Visual Basic中賦值256則出錯(cuò),Visual C+中賦值256時(shí)只把其中的8位部分保存到該單元中,高8位部分放棄,實(shí)際存放數(shù)據(jù)為1。 三、程序控制結(jié)構(gòu) 大多數(shù)應(yīng)用程序并不是按照指令存放的順序執(zhí)行程序,往往需要根據(jù)條件改變指令的執(zhí)行順序,常用的程序控制結(jié)構(gòu)包括:轉(zhuǎn)移、條件、循環(huán)。 轉(zhuǎn)移結(jié)構(gòu)一般采用Goto語(yǔ)句進(jìn)行,只要條件滿足,就轉(zhuǎn)移到指定的位置執(zhí)行程序,程序中需要定義轉(zhuǎn)移的目標(biāo)

17、位置。轉(zhuǎn)移語(yǔ)句會(huì)導(dǎo)致程序結(jié)構(gòu)混亂,多次轉(zhuǎn)移后,往往不能夠清晰看出程序執(zhí)行的流程,應(yīng)該盡量少用Goto語(yǔ)句,實(shí)際上絕大多數(shù)使用Goto語(yǔ)句的代碼都可以用條件和循環(huán)語(yǔ)句替代。 條件結(jié)構(gòu)一般采用If語(yǔ)句進(jìn)行,有的語(yǔ)言提供了更好的分支結(jié)構(gòu),如C和C+的switch以及Visual Basic的Select語(yǔ)句。條件的判斷以0和非0為準(zhǔn)則,非0則條件滿足,0則條件不滿足;有些語(yǔ)言(Visual Basic 、Visual C+)以True表示條件滿足,F(xiàn)alse表示條件不滿足。不同的條件可以采用邏輯“與”(兩個(gè)條件都滿足)、“或”(只要有一個(gè)條件滿足)、“異或”(兩個(gè)條件只能有一個(gè)滿足)進(jìn)行組合。 循環(huán)

18、結(jié)構(gòu)一般采用For、Do、While等語(yǔ)句進(jìn)行。實(shí)際上,循環(huán)是一種特殊的條件。滿足條件時(shí)循環(huán)執(zhí)行部分代碼,不滿足條件就結(jié)束循環(huán)。常用的For循環(huán)包含四個(gè)參量:循環(huán)變量、初值、終值、步長(zhǎng),循環(huán)開(kāi)始時(shí),把初值賦值給循環(huán)變量,然后比較循環(huán)變量與終值,如果循環(huán)變量大于終值(循環(huán)步長(zhǎng)為正時(shí))或循環(huán)變量小于終值(循環(huán)步長(zhǎng)為負(fù)時(shí)),則不循環(huán),否則進(jìn)入循環(huán)執(zhí)行循環(huán)體內(nèi)的代碼,每次循環(huán)體內(nèi)代碼執(zhí)行完成后,循環(huán)變量自動(dòng)加或減步長(zhǎng),然后再比較判斷是否結(jié)束循環(huán)。對(duì)于如下的Visual Basic循環(huán)語(yǔ)句: For i=1 to 10 Step 1 Next i 循環(huán)變量i,初值1,終值10,步長(zhǎng)1。當(dāng)i變成11時(shí),循

19、環(huán)正常結(jié)束。在循環(huán)體內(nèi)可以采用語(yǔ)句提前結(jié)束(Visual Basic用Exit For;C和C+用break)。 如果希望利用For循環(huán)查找數(shù)據(jù),則可以根據(jù)循環(huán)結(jié)束后循環(huán)變量的值進(jìn)行判斷。例如: For i=1 to 10 Step 1 If a(i)=100 Then Exit for Next i If i=10 Then Print “找到” Else Print “沒(méi)有找到” End 每次循環(huán)后,F(xiàn)or循環(huán)自動(dòng)變化循環(huán)變量,一般在循環(huán)體內(nèi)不要再改變循環(huán)變量,否則可能導(dǎo)致循環(huán)次數(shù)不正確,嚴(yán)重時(shí)可能導(dǎo)致進(jìn)入死循環(huán)(無(wú)限循環(huán)),例如: For i=1 to 10 Step 1 i=i-1 N

20、ext i 循環(huán)變量初值為1,F(xiàn)or循環(huán)本身每次自動(dòng)加1,而循環(huán)體內(nèi)則每次減1,循環(huán)變量永遠(yuǎn)也不可能大于10, 導(dǎo)致無(wú)限循環(huán),程序停頓在這個(gè)循環(huán)內(nèi)。 無(wú)論是什么類型的循環(huán)格式,都需要慎重地考慮其循環(huán)結(jié)束的條件,特別是一些循環(huán)條件隱含的情況,例如讀取文件或數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),一般根據(jù)是否到達(dá)結(jié)尾來(lái)判斷循環(huán)是否結(jié)束,如果循環(huán)體內(nèi)沒(méi)有讀取下一個(gè)數(shù)據(jù)的語(yǔ)句,則永遠(yuǎn)也不會(huì)到達(dá)結(jié)尾,形成無(wú)限循環(huán)。 四、子程序與函數(shù) 一般程序中往往存在某些代碼需要重復(fù)執(zhí)行,這些代碼可以編寫在一起,以函數(shù)或子程序形式供程序的其它代碼調(diào)用(Call)。子程序與函數(shù)沒(méi)有本質(zhì)區(qū)別,甚至有些語(yǔ)言合二為一(如C和C+語(yǔ)言統(tǒng)一采用函數(shù))。一般

21、語(yǔ)言的函數(shù)具有結(jié)果,即通過(guò)函數(shù)的調(diào)用,可以得到一個(gè)結(jié)果,稱為返回值,而子程序沒(méi)有返回值。 無(wú)論是函數(shù)還是子程序,其程序結(jié)構(gòu)都是一致的。編寫子程序時(shí)需要指定參數(shù)個(gè)數(shù)以及每個(gè)參數(shù)的類型(稱為形參),而在調(diào)用子程序時(shí)則要按照定義時(shí)的參數(shù)個(gè)數(shù)和類型提供具體數(shù)值(稱為實(shí)參)。調(diào)用時(shí)提供的實(shí)參通過(guò)堆棧傳遞給子程序使用。 如果參數(shù)大于1個(gè),不同語(yǔ)言把實(shí)參傳送到子程序或函數(shù)的順序不同,C或C+按照從右到左的順序,而Visual Basic則按照從左到右的順序。 將實(shí)參數(shù)據(jù)傳遞給子程序或函數(shù)時(shí),有兩種方式:一種是把具體的數(shù)傳遞過(guò)去,稱為按值傳送;另一種是把數(shù)據(jù)在內(nèi)存中的存放位置(地址)傳遞過(guò)去,稱為按地址傳送。

22、按值傳送的參數(shù)在子程序或函數(shù)內(nèi)部不能再改變,而按地址傳送的參數(shù)在子程序或函數(shù)內(nèi)部可以改變。C和C+函數(shù)的參數(shù)默認(rèn)按值傳送,其指針?lè)绞綖榘吹刂穫魉?;Visual Basic的參數(shù)默認(rèn)按地址傳送,只有用ByVal修飾的參數(shù)才是按值傳送。 五、結(jié)構(gòu)與類 每種語(yǔ)言都提供了一定的變量類型,它們能夠存放數(shù)據(jù)的范圍是固定的。特定情況下需要存放的數(shù)據(jù)可能超過(guò)了已有的類型,則需要自己定義變量類型,即以已有變量類型組合起來(lái)定義新的類型,這種方式稱為結(jié)構(gòu)(Structure)或自定義類型。結(jié)構(gòu)中的每個(gè)基本類型稱為其成員。只要定義過(guò)某個(gè)結(jié)構(gòu),就可以像基本類型一樣用于定義變量。 如果在結(jié)構(gòu)的成員中引入函數(shù),則形成了類(

23、Class),這是面向?qū)ο缶幊蹋∣OP)思想的基礎(chǔ),從C+語(yǔ)言開(kāi)始引入。由于類的成員既有變量(可以用于描述某個(gè)對(duì)象的特征),又有函數(shù)(可以用于執(zhí)行對(duì)象的某種功能或動(dòng)作),能夠形象地表示某種類型的事物(Object)。類是某種類型對(duì)象的公共描述,具體到某個(gè)具體對(duì)象則需要一個(gè)具體化過(guò)程(也稱為實(shí)例化過(guò)程),就像用普通類型定義變量一樣,也需要用類定義對(duì)象,只有經(jīng)過(guò)定義過(guò)的具有對(duì)象才能夠?qū)ζ溥M(jìn)行操作。比如,“車”是一個(gè)類,不能直接描述其顏色、排量,只有具體化到某一輛實(shí)物車,才可以評(píng)價(jià)其顏色、動(dòng)力性能等。 Windows操作系統(tǒng)是由大量的對(duì)象組成,每個(gè)窗口就是一個(gè)對(duì)象,窗口中的各種組成元件也都是對(duì)象。不

24、論是Visual Basic還是Visual C+,編寫Windows應(yīng)用程序都離不開(kāi)對(duì)象。只不過(guò),Visual Basic淡化了類的概念(但也提供了類的操作方法),而Visual C+則完全是采用各種類組成應(yīng)用程序。 1.1.3 Windows程序設(shè)計(jì)特點(diǎn) 無(wú)論什么語(yǔ)言編寫的程序,總是由操作系統(tǒng)加載后才能執(zhí)行。在DOS系統(tǒng)下,通過(guò)輸入執(zhí)行文件名稱再回車方式加載程序,而Windows系統(tǒng)則通過(guò)雙擊執(zhí)行文件或其快捷方式加載程序(也可以輸入執(zhí)行文件名稱加載)。 Windows操作系統(tǒng)與DOS操作系統(tǒng)在加載執(zhí)行文件后的處理方式上存在很大的區(qū)別。 DOS加載應(yīng)用程序后,將控制權(quán)交給應(yīng)用程序,只有應(yīng)用程

25、序執(zhí)行完成后再將控制權(quán)交還DOS操作系統(tǒng)。在某個(gè)應(yīng)用程序運(yùn)行過(guò)程中,無(wú)論是鍵盤的輸入,還是外部數(shù)據(jù)的到達(dá),都需要通過(guò)該程序本身的代碼去讀取處理,如果應(yīng)用程序編寫的代碼中沒(méi)有鍵盤輸入處理,則此過(guò)程中的鍵盤輸入都沒(méi)有辦法處理,這就要求編寫程序時(shí)考慮有關(guān)的硬件輸入輸出處理。 Windows加載應(yīng)用程序后,并不是將全部控制權(quán)交給應(yīng)用程序,而是采用交互方式,即Windows操作系統(tǒng)與應(yīng)用程序之間合理分工、各司其職:Windows操作系統(tǒng)負(fù)責(zé)處理輸入輸出、窗口維護(hù)等工作,而應(yīng)用程序則負(fù)責(zé)具體功能的實(shí)現(xiàn),它們之間通過(guò)消息(message)進(jìn)行信息交換。例如,Windows系統(tǒng)檢測(cè)鍵盤和鼠標(biāo)的輸入并進(jìn)行處理,

26、然后給應(yīng)用程序發(fā)送鍵盤或鼠標(biāo)消息通知應(yīng)用程序,應(yīng)用程序中的各種對(duì)象接收到消息后,再進(jìn)行相應(yīng)的處理。Windows應(yīng)用程序的主要功能就是接收消息、對(duì)各種消息進(jìn)行處理,是一種消息驅(qū)動(dòng)機(jī)制。 由于這些區(qū)別,編寫Windows應(yīng)用程序與DOS應(yīng)用程序存在很大的不同,程序結(jié)構(gòu)也由以往的結(jié)構(gòu)化設(shè)計(jì)變成了面向?qū)ο笤O(shè)計(jì)。 Windows編程的主要特點(diǎn)包括: 一、圖形用戶界面 以往的DOS操作系統(tǒng)采用字符方式,所有的命令和應(yīng)用程序都是通過(guò)在命令提示行下輸入再回車的方式運(yùn)行,如果用戶不清楚命令和應(yīng)用程序的可執(zhí)行文件名稱,則無(wú)從下手;而Windows系統(tǒng)則由各種圖形對(duì)象(圖標(biāo),ICON)組成,每個(gè)圖形對(duì)象代表某個(gè)應(yīng)

27、用程序,通過(guò)鼠標(biāo)雙擊,就能夠運(yùn)行某個(gè)應(yīng)用程序。 顯示器的顯示方式是由顯卡控制的,包括兩種顯示方式:字符方式和圖形方式。計(jì)算機(jī)啟動(dòng)后直接進(jìn)入字符方式,再由Windows系統(tǒng)將其切換到圖形方式。 DOS程序設(shè)計(jì)時(shí),運(yùn)行結(jié)果的顯示一般采用字符方式(也可以運(yùn)用一些制表符號(hào)在屏幕上顯示簡(jiǎn)單圖形),如果需要繪圖(如畫線、圓),則必須轉(zhuǎn)換到圖形方式(如采用Turbo C的initgraphics函數(shù)切換到圖形),這些圖形的繪制采用屏幕坐標(biāo),是直接繪制在屏幕上的,程序執(zhí)行結(jié)束后再切換回字符方式。 由于Windows操作系統(tǒng)直接采用圖形方式,運(yùn)行結(jié)果的輸出就是圖形方式,字符和圖形的處理方法是統(tǒng)一的,均是繪制方式

28、。由于Windows系統(tǒng)的屏幕上包含許多的窗口和各種對(duì)象,圖形的繪制是針對(duì)具體對(duì)象,即字符和圖形是繪制在某個(gè)對(duì)象上的,可以在窗口上繪制,也可以在窗口上的某個(gè)對(duì)象上繪制,還可以在打印機(jī)上繪制。Windows程序設(shè)計(jì)對(duì)繪圖的處理包含以下幾個(gè)方面工作: 1)繪制對(duì)象的準(zhǔn)備。在Windows系統(tǒng)中,把繪制圖形的區(qū)域稱為DC(Device Context,設(shè)備環(huán)境或稱為設(shè)備上下文),每次繪制圖形前,先準(zhǔn)備好DC,DC可以是桌面、某個(gè)窗口、某個(gè)窗口的客戶區(qū)、某個(gè)對(duì)象的可繪制區(qū)域或打印機(jī),然后可以把繪制工具選進(jìn)指定的DC,再開(kāi)始繪制圖形。 2)繪制工具的準(zhǔn)備,包括筆(Pen)、填充畫刷(Brush)等 3)

29、具體繪制命令,包括字符、直線、圓的繪制 Visual Basic6.0處理圖形操作時(shí),將DC和繪制工具都轉(zhuǎn)換成某個(gè)對(duì)象的屬性(Property),而把具體的繪制命令轉(zhuǎn)換成某個(gè)對(duì)象所具有的方法(Method)。 二、多任務(wù)運(yùn)行機(jī)制與動(dòng)態(tài)鏈接技術(shù) 前面已經(jīng)提過(guò),程序設(shè)計(jì)分成編輯、編譯和鏈接三個(gè)步驟。在以往的DOS程序設(shè)計(jì)時(shí),鏈接是將庫(kù)中某些函數(shù)的代碼與目標(biāo)代碼真正鏈接在一起,生成的可執(zhí)行文件中就包含了這些函數(shù)的代碼,這種鏈接方法稱為靜態(tài)鏈接。由于DOS操作系統(tǒng)是單任務(wù)系統(tǒng),同一時(shí)刻系統(tǒng)只能運(yùn)行一個(gè)應(yīng)用程序,內(nèi)存中某個(gè)函數(shù)的代碼只有一份。 Windows操作系統(tǒng)則采用多任務(wù)運(yùn)行機(jī)制,同一時(shí)刻不但可以

30、運(yùn)行多個(gè)應(yīng)用程序,同一應(yīng)用程序也可以運(yùn)行多份,如果仍然采用原來(lái)的靜態(tài)鏈接,則內(nèi)存中就會(huì)出現(xiàn)同一函數(shù)代碼的多個(gè)拷貝,這就導(dǎo)致內(nèi)存利用率降低。為了解決這個(gè)問(wèn)題,使得內(nèi)存的使用更加高效,Windows程序設(shè)計(jì)時(shí)往往采用動(dòng)態(tài)鏈接技術(shù),即:在鏈接時(shí)不是將有關(guān)函數(shù)的代碼與目標(biāo)代碼鏈接,而是標(biāo)記為從哪個(gè)文件尋找所需要的函數(shù)代碼,在應(yīng)用程序執(zhí)行時(shí),則根據(jù)標(biāo)記查找指定的文件,如果內(nèi)存中該文件已經(jīng)加載,則由函數(shù)名稱或函數(shù)序號(hào)找到指定函數(shù),執(zhí)行相應(yīng)的代碼,如果內(nèi)存中該文件沒(méi)有加載,則由系統(tǒng)按照特定的搜索路徑查找文件并加載,如果該文件不存在,則提示找不到,應(yīng)用程序也沒(méi)法運(yùn)行。 動(dòng)態(tài)鏈接技術(shù)需要采用動(dòng)態(tài)鏈接庫(kù),以.dl

31、l為后綴,安裝Windows操作系統(tǒng)后,系統(tǒng)提供了大量的動(dòng)態(tài)鏈接庫(kù),一般保存在C:WindowsSystem32文件夾下,其中有幾個(gè)動(dòng)態(tài)鏈接庫(kù)是系統(tǒng)運(yùn)行所必須的,如:Gdi32.dll提供了圖形操作有關(guān)的函數(shù),Kernel32.dll提供了系統(tǒng)內(nèi)核操作有關(guān)函數(shù),User32.dll提供了用戶接口有關(guān)的函數(shù)等。Windows系統(tǒng)中每安裝一個(gè)應(yīng)用程序,如Word、AutoCAD等,均安裝相應(yīng)的動(dòng)態(tài)鏈接庫(kù)。 采用動(dòng)態(tài)鏈接庫(kù)技術(shù)后,應(yīng)用程序的運(yùn)行需要有關(guān)動(dòng)態(tài)鏈接庫(kù)的支持,這樣的應(yīng)用程序不能通過(guò)拷貝直接運(yùn)行,需要采用安裝方式。應(yīng)用程序開(kāi)發(fā)完成后,通過(guò)專門的打包安裝程序,如InstallShield、Se

32、tup Factory以及Visual Basic自帶的安裝打包工具,將應(yīng)用程序以及相關(guān)的動(dòng)態(tài)鏈接庫(kù)等打包成一個(gè)安裝程序Setup.exe,用戶運(yùn)行此安裝程序,把應(yīng)用程序和有關(guān)動(dòng)態(tài)鏈接庫(kù)和資源文件拷貝到硬盤上,并對(duì)動(dòng)態(tài)鏈接庫(kù)等進(jìn)行注冊(cè),注冊(cè)的目的是在系統(tǒng)注冊(cè)表中存放動(dòng)態(tài)鏈接庫(kù)的相關(guān)信息,以便操作系統(tǒng)能夠識(shí)別該動(dòng)態(tài)鏈接庫(kù)。 如果某個(gè)應(yīng)用程序在運(yùn)行時(shí)提示缺少某個(gè)動(dòng)態(tài)鏈接庫(kù),可以從其它計(jì)算機(jī)上拷貝該文件,并復(fù)制到C:WindowsSystem32文件夾下,再人工注冊(cè)。注冊(cè)方法:點(diǎn)擊“開(kāi)始”按鈕,選擇“運(yùn)行”,輸入“regsvr32 xxx.dll”,點(diǎn)“確定”即可,如圖1.1所示。 如果在開(kāi)發(fā)應(yīng)用程

33、序過(guò)程中,采用靜態(tài)鏈接方式,或只使用了Windows系統(tǒng)提供的動(dòng)態(tài)鏈接庫(kù)中有關(guān)函數(shù),則不需要安裝,可以直接拷貝,這樣的應(yīng)用程序稱為綠色軟件。 動(dòng)態(tài)鏈接庫(kù)除了高效利用內(nèi)存外,還是Windows系統(tǒng)下各種編程語(yǔ)言之間實(shí)現(xiàn)資源共享的手段。動(dòng)態(tài)鏈接庫(kù)可以由各種編程語(yǔ)言開(kāi)發(fā),編譯后形成的.dll文件為機(jī)器語(yǔ)言格式,與具體開(kāi)發(fā)語(yǔ)言無(wú)關(guān)。例如:Visual Basic語(yǔ)言簡(jiǎn)單易學(xué),但提供的函數(shù)較少,功能較弱,編程時(shí)如果缺乏必須的功能,可以采用Visual C+編寫相應(yīng)的動(dòng)態(tài)鏈接庫(kù),由Visual Basic進(jìn)行調(diào)用,正是因?yàn)橛辛藙?dòng)態(tài)鏈接庫(kù)技術(shù),才使得采用Visual Basic也能夠開(kāi)發(fā)出功能強(qiáng)大的應(yīng)用程序

34、。 三、面向?qū)ο缶幊?Windows操作系統(tǒng)采用圖形化用戶界面,組成Windows界面的是包含各種各樣圖形化對(duì)象的窗口。應(yīng)用程序運(yùn)行時(shí),由Windows系統(tǒng)給應(yīng)用程序發(fā)送各種消息,再由應(yīng)用程序把這些消息派送給指定的窗口,由窗口有關(guān)函數(shù)進(jìn)行處理,應(yīng)用程序的核心內(nèi)容就是針對(duì)每個(gè)對(duì)象處理各種消息的代碼。 Visual C+將程序設(shè)計(jì)有關(guān)的各種資源封裝成各種類(MFC,Microsoft Fundation Class),如CMainFrame類用于創(chuàng)建主窗口,CDialog類用于創(chuàng)建對(duì)話框,CMenu類用于創(chuàng)建菜單等,掌握Visual C+的關(guān)鍵就在于掌握這些類的用途、基本成員等。 Visual B

35、asic則是將這些編程資源封裝成各種控件(Control),由這些控件組成窗口界面,掌握Visual Basic的關(guān)鍵就在于掌握這些控件的屬性、方法等。與Visual C+的類比較而言,掌握這些控件要容易得多。Visual Basic把Windows系統(tǒng)發(fā)送給應(yīng)用程序的各種消息轉(zhuǎn)換成相應(yīng)的事件,并且規(guī)定了各個(gè)對(duì)象對(duì)每個(gè)事件處理的子程序名稱,程序員需要做的工作就是編寫各個(gè)對(duì)象的事件處理子程序。這個(gè)程序的結(jié)構(gòu)由Visual Basic自己處理。圖1.2即為由各種控件組成的窗口界面。其中的主要控件功能如下: 檢查框:用于選擇某個(gè)選項(xiàng) 單選按鈕:用于從多個(gè)選項(xiàng)中選擇一項(xiàng) 命令按鈕:用于執(zhí)行某個(gè)動(dòng)作,如

36、保存參數(shù)、繪制圖形等 文本框(編輯框):用于輸入、顯示動(dòng)態(tài)文本 組合框:提供多個(gè)選項(xiàng)供用戶下拉選擇 標(biāo)簽(靜態(tài)文本):用于顯示靜態(tài)文本 上下按鈕:用于遞增遞減數(shù)字輸入 選項(xiàng)卡:用于選擇不同的參數(shù)組四、使用應(yīng)用程序接口API Windows操作系統(tǒng)安裝后,除了提供各種操作功能:文件瀏覽、網(wǎng)絡(luò)瀏覽等,還提供了大量的函數(shù),這些函數(shù)以統(tǒng)一的格式提供給各種編程語(yǔ)言使用。這些函數(shù)稱為API函數(shù)(Application Programming Interface,應(yīng)用程序編程接口),是以動(dòng)態(tài)鏈接庫(kù)形式提供的,主要的API動(dòng)態(tài)鏈接庫(kù)包括:User32.dll、Gdi32.dll、Kernel32.dll,它們

37、的使用方法與使用動(dòng)態(tài)鏈接庫(kù)的方法一致。只要在程序設(shè)計(jì)中加入了對(duì)這些函數(shù)的說(shuō)明,就可以像普通函數(shù)一樣使用。例如,某應(yīng)用程序中需要隱藏鼠標(biāo),Visual Basic6.0中沒(méi)有這樣的函數(shù),而User32.dll中提供了API函數(shù)ShowCursor。只要在Visual Basic6.0的項(xiàng)目中添加如下函數(shù)說(shuō)明: Public Declare Function ShowCursor Lib user32 Alias ShowCursor (ByVal bShow As Long) As Long 則在該項(xiàng)目中就可以調(diào)用這個(gè)函數(shù)隱藏鼠標(biāo)。 掌握API是提高程序員編程水平的關(guān)鍵,各種高級(jí)功能的實(shí)現(xiàn),如特

38、殊形狀窗口、播放聲音等都需要采用API函數(shù)。Visual C+的大量類實(shí)際就是對(duì)API函數(shù)的封裝。 Windows系統(tǒng)提供的API數(shù)量很多,達(dá)1000多個(gè),且隨著Windows版本的升級(jí),API函數(shù)數(shù)量也隨之增加。為了幫助程序員了解這些函數(shù)如何使用,Visual Basic6.0提供了一個(gè)輔助工具API Text Viewer(API文本瀏覽器),該工具可以提供如上述ShowCursor函數(shù)的各個(gè)API函數(shù)說(shuō)明。但是,這個(gè)工具并不能對(duì)所有的API函數(shù)提供說(shuō)明,特別是隨之Windows系統(tǒng)升級(jí)后新增加的API函數(shù),例如,Windows2000以上版本增加了一個(gè)新的API函數(shù)SetLayeredW

39、indowAttributes用于設(shè)置窗口的透明度,API文本瀏覽器中就沒(méi)有它的說(shuō)明。 了解掌握常用的API函數(shù),可以閱讀一些關(guān)于Visual Basic6.0高級(jí)應(yīng)用或技巧的書籍,也可以通過(guò)網(wǎng)絡(luò)搜索。 五、支持ActiveX控件OCX AcviveX是微軟對(duì)能夠插入到各種應(yīng)用程序以及網(wǎng)頁(yè)中的對(duì)象定義,如表格控件,既可以用于某個(gè)窗口上,也可以用于網(wǎng)頁(yè)上顯示數(shù)據(jù)。AcviveX的前身稱為OLE(Object Link & Embbed,對(duì)象鏈接與嵌入)。這些AcviveX控件可以用于各種編程語(yǔ)言,作為組成窗口界面的元素。它們的來(lái)源可能是安裝有些軟件或編程語(yǔ)言時(shí)安裝的(如安裝Visual Basi

40、c6.0時(shí)會(huì)同時(shí)安裝大量的ActiveX控件),也可以從Internet網(wǎng)上下載安裝。 AcviveX控件文件以.ocx為后綴,安裝在C:WindowsSystem32文件夾下。如果是拷貝來(lái)的.ocx文件,需要采用與前面.dll文件相同的注冊(cè)方法注冊(cè)。 各種編程語(yǔ)言也提供了ActiveX控件的設(shè)計(jì)方法。 使用Visual Basic6.0設(shè)計(jì)應(yīng)用程序,除了利用本身提供的各種控件外,還需要使用大量的AcviveX控件,例如,對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)與數(shù)據(jù)顯示,需要使用Adodc控件和DataGrid控件。常用ActiveX控件的屬性、方法以及可以處理的事件也是必須掌握的。1.1.4 Windows程序設(shè)計(jì)

41、的基本結(jié)構(gòu) Windows程序設(shè)計(jì)最早采用基本C或C+語(yǔ)言進(jìn)行,這種方式稱為SDK(System Developed Kits)方式,其程序基本結(jié)構(gòu)如下: 一、注冊(cè)窗口類型。大多數(shù)的Windows應(yīng)用程序都具有窗口,Windows操作系統(tǒng)在創(chuàng)建某個(gè)應(yīng)用程序時(shí),首先需要注冊(cè)某種類型的窗口,然后可以根據(jù)該類型窗口的注冊(cè)信息創(chuàng)建特定的窗口。注冊(cè)窗口類型時(shí)需要指定的信息包括: 1)窗口類型名稱,用于創(chuàng)建窗口或查找窗口時(shí)指定 2)該類型窗口創(chuàng)建時(shí)的圖標(biāo)、光標(biāo)、窗口背景顏色以及菜單 3)該類型窗口所屬的應(yīng)用程序 4)該類型窗口的所有消息由哪個(gè)函數(shù)處理,即所謂的窗口處理函數(shù)。這樣,當(dāng)應(yīng)用程序接收到某個(gè)消息后

42、,系統(tǒng)能夠確定調(diào)用哪個(gè)函數(shù)處理該消息。Windows系統(tǒng)中的每一類窗口背后都有一個(gè)窗口處理函數(shù)。 5)該類型窗口的有關(guān)樣式 窗口類型采用API函數(shù)RegisterClassEx進(jìn)行。 二、創(chuàng)建主窗口。根據(jù)注冊(cè)的窗口類型,調(diào)用API函數(shù)CreateWindow創(chuàng)建應(yīng)用程序的主窗口。創(chuàng)建時(shí)可以指定窗口的標(biāo)題、位置、大小,并指定該窗口的風(fēng)格。再調(diào)用API函數(shù)ShowWindow顯示創(chuàng)建的窗口,然后調(diào)用API函數(shù)UpdateWindow通知窗口處理函數(shù)進(jìn)行其它繪圖工作。 三、建立消息循環(huán)。應(yīng)用程序進(jìn)入一個(gè)無(wú)限循環(huán)結(jié)構(gòu),循環(huán)過(guò)程中,不斷檢測(cè)應(yīng)用程序的消息隊(duì)列,分析獲得的消息,進(jìn)行必要的轉(zhuǎn)換,再送給相關(guān)的

43、窗口,由其窗口處理函數(shù)進(jìn)行處理。如果檢測(cè)到一個(gè)退出消息,則結(jié)束循環(huán),應(yīng)用程序也隨之結(jié)束。 四、處理各種消息。窗口對(duì)應(yīng)的消息處理函數(shù)根據(jù)消息類型,進(jìn)行相應(yīng)的處理。沒(méi)有處理的所有消息由API函數(shù)DefWindowProc處理。 以下代碼即為采用C語(yǔ)言編寫的Windows應(yīng)用程序。對(duì)于這個(gè)程序,沒(méi)有必要弄明白具體的語(yǔ)句含義,這里也不做解釋,希望通過(guò)它,能夠了解整個(gè)Windows程序的結(jié)構(gòu)。 #include stdafx.h #include resource.h HINSTANCE hInst; TCHAR szTitle100; TCHAR szWindowClass100; LRESULT C

44、ALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) MSG msg; HACCEL hAccelTable; WNDCLASSEX wcex; HWND hWnd; strcpy(szTitle,我的程序); strcpy(szWindowClass,WinClass1); /以下代碼注冊(cè)窗口類型 wcex.cbSize = sizeof(WNDCLASSEX);

45、 wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc;/該類型窗口消息處理函數(shù) wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION ); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) GetStockObject (WHITE

46、_BRUSH); wcex.lpszMenuName =NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm =LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); if (!RegisterClassEx(&wcex) reture 0; hInst = hInstance; /以下代碼創(chuàng)建并顯示主窗口 hWnd=CreateWindow(szWindowClass,szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0, CW_USEDEFAULT, 0, NUL

47、L, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); /以下代碼建立消息循環(huán),并處理派送消息給相關(guān)窗口 while (GetMessage(&msg, NULL, 0, 0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wParam; /下面的函數(shù)為主窗口的消息處理函數(shù) LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARA

48、M wParam, LPARAM lParam) PAINTSTRUCT ps; HDC hdc; switch (message) case WM_COMMAND: /處理命令消息 break; case WM_PAINT: /處理繪圖消息 hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_DESTROY: /處理關(guān)閉窗口消息 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); retur

49、n 0; 對(duì)于每個(gè)Windows應(yīng)用程序來(lái)說(shuō),上述的前三個(gè)步驟都是類似的(即主函數(shù)WinMain中的所有內(nèi)容),每個(gè)應(yīng)用程序的區(qū)別僅僅在于窗口類型名稱和窗口處理函數(shù)名稱不同,完全沒(méi)有必要由每個(gè)程序員都書寫一遍,可以由編程語(yǔ)言自動(dòng)給窗口類型和窗口處理函數(shù)取一個(gè)默認(rèn)名稱。所以,各種編程語(yǔ)言都對(duì)這三個(gè)步驟進(jìn)行了適當(dāng)處理:Visual C+將它們封裝成CWinApp類,由該類創(chuàng)建主窗口,再通過(guò)消息映射機(jī)制處理各種消息;Visual Basic則完全隱藏了前三個(gè)步驟,程序員只需要編寫處理各種消息的子程序,Visual Basic內(nèi)部已經(jīng)規(guī)定了這些子程序的名稱。1.2 Windows系統(tǒng)的窗口和消息機(jī)制

50、窗口是屏幕上的特定區(qū)域,是Windows應(yīng)用程序的基本操作單元,在該區(qū)域內(nèi)顯示各種數(shù)據(jù)和文字,可以接收鍵盤按鍵和鼠標(biāo)點(diǎn)擊輸入。窗口中還包含其它各種對(duì)象,組成應(yīng)用程序的用戶界面。Windows系統(tǒng)中窗口的概念非常廣泛:各種普通窗口是窗口;窗口中包含的按鈕、文本框等也是窗口;Windows系統(tǒng)本身的桌面也是一個(gè)窗口;Windows系統(tǒng)桌面最低部的任務(wù)欄、開(kāi)始按鈕和系統(tǒng)托盤(Tray)都是窗口。每個(gè)窗口都屬于注冊(cè)過(guò)的某個(gè)窗口類型,Windows系統(tǒng)本身也已經(jīng)注冊(cè)過(guò)大量的窗口類型,程序員可以由這些窗口類型直接創(chuàng)建需要的窗口,例如,可以采用下面代碼在窗口上創(chuàng)建一個(gè)按鈕(其窗口類型為BUTTON): hW

51、nd=CreateWindow(“BUTTON”, “命令按鈕1”,WS_CHILD|WS_VISIBLE, 100,100,500,200,hWndParent,NULL,hInstance,NULL)1.2.1 Windows窗口組成 Windows窗口由標(biāo)題欄、邊框和客戶區(qū)以及菜單、工具欄和狀態(tài)欄組成。標(biāo)題欄的主要作用包括:顯示圖標(biāo)、顯示標(biāo)題、拖動(dòng)窗口、顯示最大化最小化和關(guān)閉按鈕;邊框用于區(qū)分每個(gè)窗口;客戶區(qū)則是由用戶自己使用,可以在其中安排各種對(duì)象,顯示數(shù)據(jù)等,客戶區(qū)的坐標(biāo)原點(diǎn)在其左上角,各種圖形都是繪制在窗口的客戶區(qū)。標(biāo)題欄和邊框統(tǒng)稱為非客戶區(qū),由Windows操作系統(tǒng)負(fù)責(zé)對(duì)其進(jìn)行繪

52、制與維護(hù) 圖1.3是Windows記事本的運(yùn)行主窗口,它包含了Windows窗口的主要組成元素。其中的客戶區(qū)部分被三個(gè)子窗口占滿,分別為顯示文字的文本框以及水平和垂直滾動(dòng)條。 Windows窗口的標(biāo)題欄以及邊框是由系統(tǒng)按統(tǒng)一尺寸繪制的,這些尺寸可以通過(guò)顯示屬性進(jìn)行設(shè)置,設(shè)置方法為:桌面任意位置點(diǎn)擊鼠標(biāo)右鍵,從彈出的菜單中選擇“屬性”,彈出“顯示屬性”對(duì)話框,選擇“外觀”選項(xiàng)卡中的“高級(jí)”,則彈出如圖1.4所示的Windows重要尺寸設(shè)置對(duì)話框,在這里可以設(shè)置標(biāo)題欄、邊框、圖標(biāo)、菜單的大小、字體、顏色等尺寸參數(shù)。只要修改這些參數(shù),其后打開(kāi)的所有Windows窗口均按新的尺寸繪制標(biāo)題欄等。 Win

53、dows系統(tǒng)對(duì)窗口非客戶區(qū)的繪制提供了統(tǒng)一的標(biāo)準(zhǔn),但不限制程序員的個(gè)性化風(fēng)格,程序員完全可以自己繪制出不同風(fēng)格的窗口非客戶區(qū)。圖1.5中窗口就具有個(gè)性化的窗口非客戶區(qū)。許多軟件具有所謂的換膚功能,就是可以根據(jù)指定的圖片產(chǎn)生個(gè)性化的窗口非客戶區(qū),一些媒體播放器軟件、輸入法軟件等都具有換膚功能,換膚是一種時(shí)尚的程序界面。 1.2.2 窗口分類 Windows系統(tǒng)具有各種各樣的窗口,它們的功能和作用各有不同,可以按照以下幾種方式進(jìn)行分類。 一、按窗口風(fēng)格分類,可以分成重疊窗口、子窗口和彈出窗口。重疊窗口(OVERLAPPED)通常用于建立應(yīng)用程序主窗口,有時(shí)也叫做“主窗口”或者“框架”窗口,前面用CreateWindow函數(shù)創(chuàng)建的應(yīng)用程序主窗口就是重疊窗口;彈出窗口(POPUP)通常以對(duì)話框和消息框的形式與用戶對(duì)話,如應(yīng)用程序中的各種參數(shù)或選項(xiàng)設(shè)置;子窗口(CHILD)是包含在主窗口或彈出窗口中的各種窗口,它們的存在依賴于

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論