?? chapter2.txt
字號:
第二章 windows編程基礎
第一節 引言
為了跟上潮流,我們拋棄了已快被淘汰的DOS操作系統,所有的講解和例程都是基于微
軟的Windows操作系統的。考慮到很多的用戶并沒有Windows編程基礎,所以我們設置了這
一專門講述、討論Windows的術語、概念的部分,以使這部分用戶能較快地理解和掌握我們
所講述、討論的編程思想和編程方法。這一部分中主要講述的是Windows中十分基本的東西
,所以用戶應根據自己的情況有選擇的進行學習。好!現在就讓我們進入艱苦而又精彩有
趣的游戲編程之路吧!
第二節 windows的介紹
Windows應用程序可以采用面向過程的實現方法。也可以使用面向對象的結構。所有的實現方法都集成了點擊控制和彈出菜單,能夠運行特別為Windows編寫的應用程序。
Windows是一種基于圖形界面的多任務操作系統。為這個環境開發的程序(那些專門為Windows設計的)有著相同的外觀和命令結構。對用戶來說,這使得學習使用Windows應用程序變得容易了。為了幫助開發Windows應用程序,Windows提供了大量的內建函數以方便地使用彈出菜單、滾動條、對話框、圖標和其他一些友好的用戶界面應該具有的特性。
Windows運行應用程序以硬件無關的方式來處理視頻顯示、鍵盤、鼠標、打印機、串行口以及系統時鐘。
最值得注意的Windows特性就是其標準化的圖形用戶界面。統一的界面使用圖片或圖標來代表磁盤驅動器、文件、子目錄以及其它操作系統的命令和動作。 統一的用戶界面也為程序員帶來了好處。例如,你可以很方便地使用常見菜單和對話框的內建函數。所有的菜單都具有相同風格的鍵盤和鼠標接口,因為是Windows而不是程序員在實現它。
Windows的多任務環境允許用戶在同一時刻運行多個應用程序或同一個應用程序的多個實例。一個應用程序可能處于激活狀態。激活的應用程序是指它正接收用戶的輸入。因為每一個瞬間僅有一個程序能夠被處理,因此同一時間也只能有一個應用程序處于激活狀態。但是,可以有任意個數的并行運行的任務。
第三節 windows的基本概念
Windows消息和面向對象編程
Windows實現了一種仿OOP(面向對象編程)環境。Windows下的消息系統負責在多任務環境中分解信息。從應用程序的角度來看,消息是關于發生的事件的通知。用戶可以通過按下或移動鼠標來產生這些事件,也可以是通過改變窗口大小或選擇一個菜單項等。這些事件也可以由應用程序本身產生。Windows本身也能產生消息。如“關閉Windows”消息,Windows通過這個消息來通知所有的應用程序,Windows將被關閉。
內存管理
在Windows系統中系統內存是最重要的共享資源之一。當同一時刻有多個應用程序在運行時,為了不耗盡系統資源,每個應用程序必須合作以共享內存。同時,當啟動新的程序和關閉老的程序時,內存會變得碎片化。通過移動內存中的代碼和數據塊,Windows能夠使內存空閑空間連起來。在Windows下也有可能超量使用內存。例如,應用程序可以比內存容量大。Windows能夠廢棄當前不使用的代碼,在以后需要時再從應用程序中將之讀入內存。Windows應用程序可以共享可執行文件中的例程。包含可共享的例程的文件稱為動態鏈接庫(DLL)。Windows包括了運行時將DLL例程鏈入程序的機制。
硬件無關性
Windows同時提供了硬件或設備無關性,使你免于在生成程序的時候不得不考慮所有可能使用的顯示器、打印機或輸入設備。在Windows下面,每種硬件設備的驅動程序只編寫一次。硬件無關性使編程對應用程序開發者來說更為簡單。應用程序與Windows而不是各種設備打交道。
動態鍵接庫
動態鍵接庫提供了更多的Windows功能。它們通過一個有力而靈活的圖形用戶界面增強了基本的操作系統。動態鍵接庫包括一些預定義的函數,它們可以在一個應用程序被調入時與之鍵接(動態地),而不是在應用程序被創建時(靜態地)。動態鍵接庫使用DLL后綴。函數庫將每一個程序員從重復開發諸如讀取字符或格式化輸出之類的通用例程中解放出來。程序員可以方便地構造它們自己的庫以包含更多的功能,比如改變字體或檢驗文本。把函數變為通用工具減少了冗余設計,這是OOP的一個關鍵特性。
Windows的庫是被動態地鍵接的。或者說,鍵接器并不把函數拷貝到程序的可執行文件中去。相反,當程序運行時,它產生對庫函數的調用。自然,這樣做節約了內存。不管有多少應用程序在運行,在RAM中總是只有庫的一份考貝,而這個庫可以被共享。
Windows的可執行文件格式
Windows具有一種新的可執行文件的格式,稱為New Excutable格式。它包括新型的文件頭,能夠保存有關DLL函數的信息。
第四節 windows的窗口
Windows的窗口
窗口看起來就是顯示設備中的一個矩形區域,它的外觀與特定的應用程序無關,可是,對于一個應用程序來說,窗口是屏幕上應用程序能夠直接控制的矩形區域。應用程序能夠創建并控制主窗口的一切,如大小和形狀。當用戶啟動一個程序時,一個窗口就被創建了。用戶每次單擊窗口,應用程序作出響應。關閉一個窗口會使應用程序結束。多窗口帶給用戶Windows的多任務能力。通過將屏幕分為不同的窗口,用戶能夠使用鍵盤或鼠標選擇一個并行運行的應用程序,以此對多任務環境中的一個特定程序進行輸入,Windows截取了用戶的輸入并分配必要的資源(例如微處理器)。
Windows的布局
所有的Windows應用程序都具有諸如邊框、控制菜單、About對話框之類的共同特征。這些特征使得各個Windows應用程序非常類似。
邊框
Windows的窗口被邊框所包圍。邊框由圍出窗口的線條組成。對于新手而言,邊框看起來僅僅是為了將一個應用程序的屏幕視口與其它的區別開。但是,對于熟練者,邊框有著不同的作用。例如,如果將鼠標指針放在邊框上并按下鼠標的左鍵,用戶就可以改變窗口的大小。
標題條
應用程序的名字顯示在窗口頂部的標題條中。標題條總是在相關窗口頂部的中央。標題條非常有用,它可以幫助你記住正在運行哪個應用程序。活動應用的標題條以不同于非活動應用程序的顏色顯示。
控制圖標
控制圖標是每個窗口左上方的小圖片,每個應用程序都使用它。在控制圖標上單擊鼠標鍵會使Windows顯示系統菜單。
系統菜單
當用鼠標單擊控制圖標時就打開了控制菜單。它提供了諸如Restore,Move,Size,Minimize,Maximize以及Close這樣的標準操作。
最小化圖標
每個Windows 95或Windows NT應用程序都在窗口的右上角顯示三個圖標。最左邊的圖標是一段短下劃線,這就是最小化圖標。它可以使用程序被最小化。
最大化圖標
最大化圖標是三個圖標中中間的那一個,看起來象兩個小窗口。使用最大化圖標可以使用應用程序占滿整個屏幕。如果選擇了這個圖標,其它應用程序窗口都會被蓋住。
垂直滾動條
如果有必要,應用程序可以顯示一個垂直滾動條。垂直流動條顯示在應用程序窗口的右邊,在兩端有兩個方向相反的箭頭。它還有一個著色的棒和一個透明的窗口塊。后者被用于顯示當前顯示內容與整個文檔(著色的棒)的關系。你可以用滾動條來選擇顯示哪一頁。一般在任何一個箭頭上單擊一下會使顯示內容移動一行。單擊向上箭頭下方的窗口塊并拖動它會使屏幕輸出快速更新到應用程序屏幕輸出的任意位置。
水平滾動條
也可以顯示一個水平滾動條。水平滾動條顯示在窗口的底部,具有與垂直滾動條類似的功能。你用它來選擇要顯示哪些列。一般在任何一個箭頭上單擊一個會使顯示內容移動一列。單擊向左箭頭右邊的窗口塊并拖動它會使屏幕輸出快速更新到應用程序屏幕輸出的任意位置。
菜單條
一個可選擇的菜單條可以顯示在標題條的下方。通過菜單條來選擇菜單和子菜單。這種選擇可以通過用鼠標單擊,也可以用熱鍵組合來實現。熱鍵組合經常是ALT與命令中帶下劃線的字母的組合,比如File命令中的“F”。
用戶區
通常用戶區占據了窗口最大的部分。這是應用程序的基本輸出區域。應當由應用程序來復雜管理用戶區。另外,應用程序可以輸出到用戶區。
第五節 windows的類
窗口的基本組件有助于說明應用程序的外觀。有的時候應用程序需要創建兩個外觀和表現都相似的窗口。Windows的Paint就是一個例子。借助于同時運行Paint的兩個實例(或拷貝),Paint允許用戶剪貼或拷貝圖片的一部分。然后信息就可以從一個實例拷貝到另一個實例。Paint的每個運行實例的外觀和表現都與其他的相同。這就需要每個實例創建自己的外觀和功能類似的窗口。
在這種情況下被創建的外觀和功能都很類似的窗口被稱為是屬于同一個窗口類的。但是,你創建的窗口可以有不同的特征。它們可以有不同的大小,不同的位置,不同的顏色或不同的標題,也可以使用不同的光標。
每個被創建的窗都基于一個窗口類。在用C語言開發撕于的基于傳統的函數調用方式的應用程序中,一些窗口為在Windows應用程序初始化的進修注冊。你的應用程序可以注冊屬于自己的窗口類。為了能夠使幾個窗口在同一個窗口類的基礎上創建,Windows定義了一些窗口特征,如CreateWindows()的參數,另一些定義的窗口類的結構。當你注冊一個窗口類的時候,這個類可以被Windows下運行著的任何程序所使用。對于使用MFC的應用程序來說,多數注冊工作已經由預定義的對象完成了。
具有相似的外觀和表現的窗口可以被組合成一個類,以此來減少需要維護的信息。因為每個窗口類都有自己的可共享的類結構,不需要復制不必要的窗口類參數。同時,同類的兩個窗口使用相同的函數以及相關的例程。這樣可以節省時間和空間,因為不存在代碼復制。
第六節 windows中的面向對象編程
在Windows下傳統的C程序吸收了一些面向對象編程的特性。對象是一種包含數據結構和對這些數據結構進行操作的函數的抽象數據類型。而且,對象接收會引起它們不同動作的消息。
比如,一個Windows的圖形對象是可以被作為一個實體來操縱的一些數據的集合,對于用戶它是可視界面的一部分。特別地,一個對象意味這數據和數據的功能。菜單、標題條、控制塊以及滾動條等都是圖形對象的例子。下一部分描述一些影響應用程序外觀的新的圖形對象。
圖標
圖標是用來使用記住特定操作、想法或產品的小圖形對象。比如,一個電子表格程序被最小化時可以顯示一個很小的柱狀圖以提醒用戶這個程序還在運行之中。在柱狀圖上雙擊鼠標會使Windows激活這個應用程序。圖標是非常有力的工具。它很適合用來引起用戶的注意,比如在發出錯誤警告或者是向用戶提供選擇時。
光標
光標是Windows用來跟蹤指點設備的運動的圖形符號。這種圖形符號可以改變形狀以指明特定的Windows操作。比如,當標準的箭頭光標變為沙漏光標時說明Windows正在執行一個命令,需要暫停。
編輯光標
應用程序在窗口中顯示編輯光標以告訴用戶在哪兒輸入。編輯光標與其他屏幕符號顯然不同,因為它是閃爍的。多數時候,鼠標輸入與光標相連,而鍵盤輸入與編輯光標相連。但是,可以用鼠標來改變編輯光標的輸入點。
消息框
消息框是另一類Windows圖形對象。消息框是一種包含標題、圖標和消息的彈出式窗口。圖(?)是關閉Windows Notepad程序時出現的一個標準的消息框。
-------------------------------------------------------------------------
| |
------------------------------------------------------------------------
Windows的對話框
對話框與消息框相似的地方在于它也是一種彈出式窗口。但是對話框主要用于接受用戶輸入而不僅僅是顯示一些輸出。對話框允許應用程序接受輸入,每次一個域或是一個框的內容,而不是每次一個字符。圖(?)顯示了一個典型的Windows對話框。對知框的圖形設計由Windows為你自動完成。對話框的布局通常用編譯器中的資源編輯器完成。
-----------------------------------------------------------------------
| |
-----------------------------------------------------------------------
字體
字體是一種圖形對象或資源,它定義了完整的字符集合的字樣。這些字符都有一個特定的大小和風格,可以使文本具有不同的外觀。字樣是字符的一種基本屬性,它定義了字符的襯線和筆畫寬度。
位圖
位圖是一種顯示圖片(按像素組織),存儲于內存。當應用程序需要快速顯示圖片時可以使用位圖。因為位圖直接從內存中傳送,所以它比用程序重新畫出圖片要快得多。位圖有兩個基本用途。首先,它可以在屏幕上顯示圖片。其次位圖也用于創建刷子。刷子使你可以在屏幕上畫出并填充對象。
使用位圖有兩個缺點。首先,與其尺寸有關,位圖會占據難以預估的大量內存。每個被顯示的像素都要在內存中占據相應的空間。在彩色顯示器上顯示一個像素會比在單色顯示器上占據更多的內存。在單色顯示器上,只需一位(bit)就可以表示出像素的狀態。可是在可以顯示16種顏色的彩色顯示器上,需要四位才能表示一個像素的特征。同樣地,隨著顯示設備分辨率的增加,位圖對內存的需求也增加了。位圖的另一個缺點是它只包括靜態的圖片。比如,如果用位圖來代表一輛汽車,就沒有辦法來訪問圖片的不同部分,如輪踏、頂蓋、窗等。但是,如果汽車是有一系列基本繪圖例程來生成的,應用程序就可以改變向這些例程傳送的數據從而改變圖片的不同部分。例如,應用程序可以修飾頂蓬線并把一輛轎車變為敞蓬車。
畫筆
當Windows在屏幕上顯示一個圖形時,它使用當前畫筆的信息。畫筆用于畫出線條或輪廊。畫筆具有三個基本特征:線寬、線型(虛線、短線、實線)以及顏色。Windows永遠保留著用于畫白線和黑線的畫筆,任何應用程序可以使用它。你也可以創建自己的畫筆。
刷子
Windows用刷子來畫出顏色并以預定義的樣式來填充一個區域。刷子至少有8×8個像素大小。刷子有三個基本特征:樣式和顏色。由于它們至少有8×8的大小,刷子被稱作具有樣式而不象畫筆,稱為線型。樣式可以是純的顏色,也可以是陰影線、斜線或其它用戶自定義的組合
第七節 windows的消息
Windows的消息
在Windows中,應用程序并不直接寫屏幕、處理硬件中斷或直接對打印機輸出。相反,應用程序使用合適的Windows函數或者等待一個適當的消息被發出。
Windows消息系統負責在多任務環境中分派消息。從應用程序的角度來看,消息可以看作是發生的事件的通知,有些需要作出特定的反應,有些就不需要。這些事件可能由用戶產生,比如按下了鼠標或移動了鼠標,改變了窗口的大小或者選擇了一個菜單。同時,這些事件也可能由應用程序本身所產生。
這個過程使你的應用程序必須完全面向消息處理。當接收到消息時,應用程序必須能激活并決定正確的動作,完成這個動作之后回到等待狀態。
通過檢查消息的格式和來源,下一部分將更仔細地討論消息系統。
消息的格式
消息通知一個應用程序發生了一個事件。從技術上來講,消息不僅僅是與應用程序相關,而且是與應用程序的某一特定窗口有關。因此,所有的消息都被發往窗口。
在Windows下只有一個消息系統-即系統消息隊列。但是,每個正在Windows下運行的應用程序都有它自己的消息隊列。系統消息隊列中的每個消息最終都要被USER模塊傳送到應用程序的消息隊列中去。應用程序的消息隊列中存儲了程序的所有窗口的全部消息。
不管消息具有什么類型,它們都有四個參數:一個窗口句柄,一個消息類型,兩個附加的32位參數。窗口消息中定義的第一個參數是消息所關聯的窗口句柄。
在編寫Windows應用程序的時候經常使用句柄。句柄是一個唯一的數字,它被用于標識許多類型的對象,如菜單、圖標、畫筆和刷子、內存分配、輸出設備甚至窗口實例。在Windows 95和Windows NT下面,程序的每個運行著的拷貝叫做實例。
因為Windows 95和Windows NT允許你同時運行一個程序的多個實例,操作系統就有必要保持對這些實例的追蹤。這是通過賦予每個運行實例一個唯一的實例句柄來實現的。
實例句柄通常被用作一個內部維護著的表的索引。通過引用表中的元素而不是實際的內存地址,Windows 95和Windows NT可以動態地調整所有的資源,而只需在此資源所對應的表格位置中插入一個新的地址。
根據一個應用程序的多個實例被處理的方式,內存資源由Windows 95和Windows NT保存。
應用程序的實例具有很重要的作用。應用程序的實例定義了程序的函數所需的所有對象。這包括控件、菜單、對話框以及更多的新Windows類。
消息中的第二個參數是消息類型。這是在Windows獨有的一些頭文件中定義的標識符。這些頭文件可以通過WINDOWS.H來使用。在Windows下,每個消息由兩個字符的助記符開始,跟著是下劃線,最后是一個描述符。
最后的兩個參數提供了解釋消息所需的附加信息。因此最后兩個參數的內容依賴于消息的類型。
產生消息
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -