[轉貼] Windows編程和麪向對象技術 chap1

第一課 Windows編程和麪向對象技術

-----Microsoft Windows是一個基於Intel x86微處理芯片的個人計算機上的具有圖形用戶接口的多任務和多窗口的操作系統,它是對MS-DOS操作系統的擴展和延伸。與MS-DOS操作系統相比,它有許多優越之處:首先,它提供了比MS-DOS字符界面更爲直觀、友好的圖形用戶界面;其次,它可以一次運行多個程序,方便了用戶的操作,提高了機器的利用率;再次,Windows環境下的應用程序具有一致的外觀和用戶接口,用戶只需要熟悉其中一兩個程序,就可以觸類旁通學會使用別的Windows應用程序。另外,Windows還具有更好的虛擬內存管理和設備無關特性等等。由於Windows具有以上突出優點,Windows平臺上的軟件開發和程序設計已成主流。這一講首先介紹Windows發展簡史,然後分析Windows操作系統的特點以及Windows程序設計的關鍵概念,最後介紹Windows程序設計的過程及開發工具。

1.1 Windows發展歷史

    Windows起源可以追溯到Xerox公司進行的工作。1970年,美國Xerox公司成立了著名的研究機構Palo Alto Research Center(PARC),從事局域網、激光打印機、圖形用戶接口和麪向對象技術的研究,並於1981年宣佈推出世界上第一個商用的GUI(圖形用戶接口)系統:Star 8010工作站。但如後來許多公司一樣,由於種種原因,技術上的先進性並沒有給它帶來它所期望的商業上的成功。

    當時,Apple Computer公司的創始人之一Steve Jobs,在參觀Xerox公司的PARC研究中心後,認識到了圖形用戶接口的重要性以及廣闊的市場前景,開始着手進行自己的GUI系統研究開發工作,並於1983年研製成功第一個GUI系統:Apple Lisa。隨後不久,Apple又推出第二個GUI系統Apple Macintosh,這是世界上第一個成功的商用GUI系統。當時,Apple公司在開發Macintosh時,出於市場戰略上的考慮,只開發了Apple公司自己的微機上的GUI系統,而此時,基於Intel x86微處理器芯片的IBM兼容微機已漸露崢嶸。這樣,就給Microsoft公司開發Windows提供了發展空間和市場。

    Microsoft公司早就意識到建立行業標準的重要性,在1983年春季就宣佈開始研究開發Windows,希望它能夠成爲基於Intel x86微處理芯片計算機上的標準GUI操作系統。它在1985年和1987年分別推出Windows 1.03版和Windows2.0版。但是,由於當時硬件和DOS操作系統的限制,這兩個版本並沒有取得很大的成功。此後,Microsoft公司對Windows的內存管理、圖形界面做了重大改進,使圖形界面更加美觀並支持虛擬內存。Microsoft於1990年5月份推出Windows3.0並一炮打紅。這個“千呼萬喚始出來”的操作系統一經面世便在商業上取得驚人的成功:不到6周,Microsoft公司銷出50萬份Windows3.0拷貝,打破了任何軟件產品的6周銷售記錄,從而一舉奠定了Microsoft在操作系統上的壟斷地位。

    一年之後推出的Windows3.1對Windows 3.0作了一些改進,引入TrueType字體技術,這是一種可縮放的字體技術,它改進了性能;還引入了一種新設計的文件管理程序,改進了系統的可靠性。更重要的是增加對象鏈接合嵌入技術(OLE)和多媒體技術的支持。Windows3.0和Windows3.1都必須運行於MS DOS操作系統之上。

    隨後,Microsoft借Windows東風,於1995年推出新一代操作系統Windows95(又名Chicago),它可以獨立運行而無需DOS支持。Windows95是操作系統發展史上一個里程碑式的作品,它對Windows3.1版作了許多重大改進,包括:更加優秀的、面向對象的圖形用戶界面,從而減輕了用戶的學習負擔;全32位的高性能的搶先式多任務和多線程;內置的對Internet的支持;更加高級的多媒體支持(聲音、圖形、影像等),可以直接寫屏並很好的支持遊戲;即插即用,簡化用戶配置硬件操作,並避免了硬件上的衝突;32位線性尋址的內存管理和良好的向下兼容性等等。以後我們提到的Windows一般均指Windows95。

1.2  Windows操作系統特點

           Windows之所以取得成功,主要在於它具有以下優點:

  • 直觀、高效的面向對象的圖形用戶界面,易學易用:

從某種意義上說,Windows用戶界面和開發環境都是面向對象的。用戶採用“選擇對象-操作對象”這種方式進行工作。比如要打開一個文檔,我們首先用鼠標或鍵盤選擇該文檔,然後從右鍵菜單中選擇“打開”操作,打開該文檔。這種操作方式模擬了現實世界的行爲,易於理解、學習和使用。

  • 用戶界面統一、友好、漂亮:

Windows應用程序大多符合IBM公司提出的CUA (Common User Acess)標準,所有的程序擁有相同的或相似的基本外觀,包括窗口、菜單、工具條等。用戶只要掌握其中一個,就不難學會其他軟件,從而降低了用戶培訓學習的費用。

  • 豐富的設備無關的圖形操作:

Windows的圖形設備接口(GDI)提供了豐富的圖形操作函數,可以繪製出諸如線、圓、框等的幾何圖形,並支持各種輸出設備。設備無關意味着在針式打印機上和高分辨率的顯示器上都能顯示出相同效果的圖形。

  • 多任務:

Windows是一個多任務的操作環境,它允許用戶同時運行多個應用程序,或在一個程序中同時做幾件事情。每個程序在屏幕上佔據一塊矩形區域,這個區域稱爲窗口,窗口是可以重疊的。用戶可以移動這些窗口,或在不同的應用程序之間進行切換,並可以在程序之間進行手工和自動的數據交換和通信。

雖然同一時刻計算機可以運行多個應用程序,但僅有一個是處於活動狀態的,其標題欄呈現高亮顏色。一個活動的程序是指當前能夠接收用戶鍵盤輸入的程序。

1.3 Windows應用程序設計的特點

    如前所述,Windows操作系統具有MS-DOS操作系統無可比擬的優點,因而受到了廣大軟件開發人員的親睞。但是,熟悉DOS環境下軟件開發的程序員很快就會發現,Windows編程與DOS環境下編程相比有很大的不同。Windows要求以一種全新的思維方式進行程序設計,主要表現爲以下幾點:

1.3.1事件驅動的程序設計

    傳統的MS-DOS程序主要採用順序的、關聯的、過程驅動的程序設計方法。一個程序是一系列預先定義好的操作序列的組合,它具有一定的開頭、中間過程和結束。程序直接控制程序事件和過程的順序。這樣的程序設計方法是面向程序而不是面向用戶的,交互性差,用戶界面不夠友好,因爲它強迫用戶按照某種不可更改的模式進行工作。它的基本模型如圖1.1所示。
    事件驅動程序設計是一種全新的程序設計方法,它不是由事件的順序來控制,而是由事件的發生來控制,而這種事件的發生是隨機的、不確定的,並沒有預定的順序,這樣就允許程序的的用戶用各種合理的順序來安排程序的流程。對於需要用戶交互的應用程序來說,事件驅動的程序設計有着過程驅動方法無法替代的優點。它是一種面向用戶的程序設計方法,它在程序設計過程中除了完成所需功能之外,更多的考慮了用戶可能的各種輸入,並針對性的設計相應的處理程序。它是一種“被動”式程序設計方法,程序開始運行時,處於等待用戶輸入事件狀態,然後取得事件並作出相應反應,處理完畢又返回並處於等待事件狀態。它的框圖如圖1.2所示:
    在圖中,輸入界面1-4並沒有固定的順序,用戶可以隨機選取,以任何合理的順序來輸入數據。

T1_1.tif (69737 bytes)

圖1.1 過程驅動模型

T1_2.tif (200700 bytes)

1.2事件驅動程序模型

1.3.2 消息循環與輸入

    事件驅動圍繞着消息的產生與處理展開,一條消息是關於發生的事件的消息。事件驅動是靠消息循環機制來實現的。
    消息是一種報告有關事件發生的通知。
    消息類似於DOS下的用戶輸入,但比DOS的輸入來源要廣,Windows應用程序的消息來源有以下四種:
    (1)輸入消息:包括鍵盤和鼠標的輸入。這一類消息首先放在系統消息隊列中,然後由Windows將它們送入應用程序消息隊列中,由應用程序來處理消息。
    (2)控制消息:用來與Windows的控制對象,如列表框、按鈕、檢查框等進行雙向通信。當用戶在列表框中改動當前選擇或改變了檢查框的狀態時發出此類消息。這類消息一般不經過應用程序消息隊列,而是直接發送到控制對象上去。
    (3)系統消息:對程序化的事件或系統時鐘中斷作出反應。一些系統消息,象DDE消息(動態數據交換消息)要通過Windows的系統消息隊列,而有的則不通過系統消息隊列而直接送入應用程序的消息隊列,如創建窗口消息。
    (4)用戶消息:這是程序員自己定義並在應用程序中主動發出的,一般由應用程序的某一部分內部處理。
    在DOS應用程序下,可以通過getchar()、getch()等函數直接等待鍵盤輸入,並直接向屏幕輸出。而在Windows下,由於允許多個任務同時運行,應用程序的輸入輸出是由Windows來統一管理的。
    Windows操作系統包括三個內核基本元件:GDI, KERNEL ,USER。其中GDI(圖形設備接口)負責在屏幕上繪製像素、打印硬拷貝輸出,繪製用戶界面包括窗口、菜單、對話框等。系統內核KERNEL支持與操作系統密切相關的功能:如進程加載,文本切換、文件I/O,以及內存管理、線程管理等。USER爲所有的用戶界面對象提供支持,它用於接收和管理所有輸入消息、系統消息並把它們發給相應的窗口的消息隊列。消息隊列是一個系統定義的內存塊,用於臨時存儲消息;或是把消息直接發給窗口過程。每個窗口維護自己的消息隊列,並從中取出消息,利用窗口函數進行處理。框圖如下:

T1_3.tif (207496 bytes)

圖1.3 消息驅動模型

 

 

1.3.3 圖形輸出

    Windows程序不僅在輸入上與DOS程序不同,而且在程序輸出上也與DOS有着很大不同,主要表現爲:
    1.DOS程序獨佔整個顯示屏幕,其他程序在後臺等待。而Windows的每一個應用程序對屏幕的一部分進行處理。DOS程序可以直接往屏幕上輸出,而Windows是一個多窗口的操作系統,由操作系統來統一管理屏幕輸出;每個窗口要輸出內容時,必須首先向操作系統發出請求(GDI請求),由操作系統完成實際的屏幕輸出工作。
    2.Windows程序的所有輸出都是圖形。Windows提供了豐富的圖形函數用於圖形輸出,這對輸出圖形是相當方便的,但是由於字符也被作爲圖形來處理,輸出時的定位要比DOS複雜的多。
    比如,在DOS字符方式下,我們可以寫出如下程序用於輸出兩行文字:
printf(“Hello,/n”);
printf(“This is DOS program./n”);
    而在Windows下要輸出這兩行文字所做的工作要複雜的多。因爲Windows輸出是基於圖形的,它輸出文本時不會象DOS那樣自動換行,而必須以像素爲單位精確定位每一行的輸出位置。另外,由於Windows提供了豐富的字體,所以在計算座標偏移量時還必須知道當前所用字體的高度和寬度。
    3.Windows下的輸出是設備無關的。在DOS下編寫過Foxpro程序的讀者常常會有這樣的體會,在編寫打印報表程序時,要針對不同的打印機在程序中插入不同的打印控制碼,用以控制換頁、字體設置等選項。這樣的程序編寫起來繁瑣,而且不容易移植(因爲換一臺不同型號的打印機就要重新修改程序)。而Windows下的應用程序使用圖形設備接口(GDI)來進行圖形輸出。GDI屏蔽了不同設備的差異,提供了設備無關的圖形輸出能力,Windows應用程序只要發出設備無關的GDI請求(如調用Rectangle畫一個矩形),由GDI去完成實際的圖形輸出操作。對於一臺具有打印矩形功能的PostScript打印機來說,GDI可能只需要將矩形數據傳給驅動程序就可以了,然後由驅動程序產生PostScript命令繪製出相應的矩形;而對於一臺沒有矩形輸出功能的點陣打印機來說,GDI可能需要將矩形轉化爲四條線,然後向驅動程序發出畫線的指令,在打印機上輸出矩形。當然,這兩種輸出在用戶看來並沒有什麼區別。
    Windows的圖形輸出是由圖形設備接口(GDI)來完成的,GDI是系統原始的圖形輸出庫,它用於在屏幕上輸出像素、在打印機上輸出硬拷貝以及繪製Windows用戶界面。
    GDI提供兩種基本服務:創建圖形輸出和存儲圖象。GDI提供了大量用於圖形輸出的函數,這些函數接收應用程序發出來的繪圖請求、處理繪圖數據並根據當前使用設備調用相應的設備驅動程序產生繪圖輸出。這些繪圖函數分爲三類:一是文字輸出,二是矢量圖形函數,用於畫線、圓等幾何圖形,三是光柵(位圖)圖形函數,用於繪製位圖。
    GDI識別四種類型的設備:顯示屏幕、硬拷貝設備(打印機、繪圖機)、位圖和圖元文件。前兩者是物理設備,後兩者是僞設備。一個僞設備提供了一種在RAM裏或磁盤裏存儲圖象的方法。位圖存放的是圖形的點位信息,佔用較多的內存,但速度很快。圖元文件保存的是GDI函數的調用和調用參數,佔用內存較少,但依賴於GDI,因此不可能用某個設備來創建圖元文件,而且速度比位圖要慢。
    GDI的圖形輸出是面向窗口的,面向窗口包含兩層含義:
    (1)每個窗口作爲一個獨立的繪圖接口來處理,有它自己的繪圖座標。當程序在一個窗口中繪圖時,首先建立缺省的繪圖座標,原點(0,0)位於窗口用戶區的左上角。每個窗口必須獨立的維護自己的輸出。
    (2)繪圖僅對於本窗口有效,圖形在窗口邊界會被自動裁剪,也就是說窗口中的每一個圖形都不會越出邊界。即使想越出邊界,也是不可能的,窗口會自動的防止其他窗口傳過來的任何像素。這樣,你在窗口內繪圖時,就不必擔心會偶然覆蓋其他程序的窗口,從而保證了Windows下同時運行多個任務時各個窗口的獨立性。

1.3.4 用戶界面對象

    Windows支持豐富的用戶接口對象,包括:窗口、圖標、菜單、對話框等等。程序員只需簡單的幾十行代碼,就可以設計出一個非常漂亮的圖形用戶界面。而在DOS環境下,則需要大量的代碼來完成同樣的工作,而且效果也沒有Windows提供的那麼好。下面我們介紹一下用戶界面對象中的一些術語和相關概念。

窗口

    窗口是用戶界面中最重要的部分。它是屏幕上與一個應用程序相對應的矩形區域,是用戶與產生該窗口的應用程序之間的可視界面。每當用戶開始運行一個應用程序時,應用程序就創建並顯示一個窗口;當用戶操作窗口中的對象時,程序會作出相應反應。用戶通過關閉一個窗口來終止一個程序的運行;通過選擇相應的應用程序窗口來選擇相應的應用程序。一個典型的窗口外觀如圖1.4所示。

T1_4.jpg (15734 bytes)

圖1.4 窗口

邊框

    絕大多數窗口都有一個邊框,用於指示窗口的邊界。同時也用來指明該窗口是否爲活動窗口,當窗口活動時,邊框的標題欄部分呈高亮顯示。用戶可以用鼠標拖動邊框來調整窗口的大小。

系統菜單框

    系統菜單框位於窗口左上角,以當前窗口的圖標方式顯示,用鼠標點一下該圖標(或按ALT+空格鍵)就彈出系統菜單。系統菜單提供標準的應用程序選項,包括:Restore(還原窗口原有的大小),Move(使窗口可以通過鍵盤上的光標鍵來移動其位置),Size(使用光標鍵調整窗口大小),Minimize(將窗口縮成圖標),Maximize(最大化:使窗口充滿整個屏幕)和Close(關閉窗口)。

標題欄

    標題欄位於窗口的頂部,其中顯示的文本信息用於標註應用程序,一般是應用程序的名字,以便讓用戶瞭解哪個應用程序正在運行。標題欄顏色反映該窗口是否是一個活動窗口,當爲活動窗口時,標題欄呈現醒目顏色。鼠標雙擊標題欄可以使窗口在正常大小和最大化狀態之間切換。在標題欄上按下鼠標器左鍵可以拖動並移動該窗口,按右鍵彈出窗口系統菜單。

菜單欄

    菜單欄位於標題欄下方,橫跨屏幕,在它上面列出了應用程序所支持的命令,菜單欄中的項是命令的主要分類,如文件操作、編輯操作。從菜單欄中選中某一項通常會顯示一個彈出菜單,其中的項是對應於指定分類中的某個任務。通過選擇菜單中的一個項(菜單項),用戶可以向程序發出命令,以執行某一功能。如選擇“文件->打開...”菜單項會彈出一個打開文件對話框,讓用戶選擇一個文件,然後打開這個文件。
    一般的,以“...”結尾的菜單項文本表明選擇該項時會彈出一個對話框,讓用戶輸入信息,然後執行操作,如“文件->打開...”。若不以“...”結尾,則表明選擇該菜單項直接執行一個動作,如“編輯”菜單下的“粘貼”菜單項。若一個菜單項呈現灰色,則表明該菜單當前不可用。有時菜單項上還有加速鍵,加速鍵是一種鍵盤組合,它是菜單項的一種替代方式,可以讓用戶通過鍵盤直接發出命令;在鍵盤上按下這一鍵盤組合,就等效於選擇了相應的菜單。如“粘貼(P) CTRL+V”,就表示粘貼操作的加速鍵是CTRL+V,按下CTRL+V就執行粘貼操作。

工具條

    工具條一般位於菜單欄下方,在它上面有一組位圖按鈕,代表一些最常用的命令。工具條可以顯示或隱藏。讓鼠標在某個按鈕上停一會兒,在按鈕下方會出現一個黃色的小窗口,裏面顯示關於該按鈕的簡短說明,叫做工具條提示(ToolTip)。用戶還可以用鼠標拖動工具條將其放在窗口的任何一側。

客戶區

    客戶區是窗口中最大的一塊空白矩形區域,用於顯示應用程序的輸出。例如,字處理程序在客戶區中顯示文檔的當前頁面。應用程序負責客戶區的繪製工作,而且只有和該窗口相對應的應用程序才能向該用戶區輸出。

垂直滾動條和水平滾動條

    垂直滾動條和水平滾動條分別位於客戶區的左側和底部,它們各有兩個方向相反的箭頭和一個深色的長度可變的滾動塊。可以用鼠標選中滾動條的箭頭上下卷滾(選中垂直滾動條時)或水平卷滾(選中水平滾動條時)客戶區的內容。滾動塊的位置表示客戶區中顯示的內容相對於要顯示的全部內容的位置,滾動塊的長度表示客戶區中顯示的內容大小相對於全部內容大小的比例。

狀態欄

    狀態欄是一般位於窗口底部,用於輸出菜單的說明和其他一些提示信息(如鼠標器位置、當前時間、某種狀態等)。

圖標

    圖標是一個用於提醒用戶的符號,它是一個小小的圖象,用於代表一個應用程序。當一個應用程序的主窗口縮至最小時,就呈現爲一個圖標。

光標

    Windows的光標是顯示屏上的一個位圖,而不是DOS下的一條下劃線。光標用於響應鼠標或其他定位設備的移動。程序可以通過改變光標的形狀來指出系統中的變化。例如,程序常顯示一個計時的光標,用於指示用戶一些漫長的操作正在進行之中。程序也可以通過改變光標讓用戶知道程序進入了一種特殊模式,例如,繪圖程序經常改變光標來反映被繪製對象的類型,是直線還是圓或其他。

插入符

    插入符(caret)是一個微小並閃爍的位圖,作爲一個鍵盤控制的指針。控制鍵盤輸入的窗口可以創建一個插入符去通知用戶:窗口現在可以進行鍵盤輸入。在DOS環境下,一般使用“光標”作爲鍵盤指針,而在Windows中,“光標”被作爲鼠標指針。
    應用程序必須維護這個插入符。在Windows中,在一個時間只允許有一個插入符存在。因此,要使用插入符號作爲鍵盤指針的應用程序必須在取得焦點時創建一個插入符號,並在失去焦點後刪除它。

對話框

    對話框是一種特殊的窗口,它提供了一種接收用戶輸入、處理數據的標準方法。特別的,當用戶輸入了一個需要附加信息     的命令時,對話框是接收輸入的標準方法。比如,假設用戶要求系統打開一個文件,對話框就可以提供一個讓用戶從一組文件中選擇一個文件的標準方法。如前所述,在一般情況下,在選擇菜單名字後面跟着省略號(...)的菜單項通常會彈出一個對話框。圖1.5給出了查找對話框的一個例子。

T1_5.jpg (8482 bytes)

圖1.5 查找對話框

控件

    在圖1.5中,查找對話框是一個獨立的窗口,它顯示信息並接收用戶的輸入。在對話框中,還包含了許多小的窗口,這些窗口被稱爲控件。控件是應用程序用來獲得用戶特定信息的窗口,比如要打開文件的名字或自動換行的設置等。應用程序也會通過控件獲取所需的信息,以便控制程序的某種屬性,如自動換行特性的開關。
    控件總是與其他窗口連用,典型的是對話框,但也可以用在普通窗口之中。常見的控件有:按鈕、編輯框、列表框、組合框、靜態文本等等。

消息框

    消息框是用於給用戶一些提示或警告的窗口。例如,消息框能夠在應用程序執行某項任務過程中出現問題時通知用戶。下圖所示的對話框警告用戶輸入了一個不合法的文件名。

T1_6.tif (100211 bytes)

圖1.6

 

1.3.5 資源共享

    對於DOS程序來說,它運行時獨佔系統的全部資源,包括顯示器、內存等,在程序結束時才釋放資源。而Windows是一個多任務的操作系統,各個應用程序共享系統提供的資源,常見的資源包括:設備上下文,畫刷,畫筆,字體,對話框控制,對話框,圖標,定時器,插入符號,通信端口,電話線等。
    Windows要求應用程序必須以一種能允許它共享Windows資源的方式進行設計,它的基本模式是這樣的:
1.向Windows系統請求資源;
2.使用該資源;
3.釋放該資源給Windows以供別的程序使用。
    即使最有經驗的Windows程序員也常常會忽略第三步。如果忽略了這一步,輕則當時不出錯,但過一會兒出現程序運行出現異常情況,或干擾別的程序正常運行;重則立即死機,比如設備上下文沒有釋放時。
    在Windows應用程序設計中,CPU也是一種非常重要的資源,因此應用程序應當避免長時間的佔用CPU資源(如一個特別長的循環);如果確實需要這樣做,也應當採取一些措施,以讓程序能夠響應用戶的輸入。主存也是一個共享資源,要防止同時運行的多個應用程序因協調不好而耗盡內存資源。
    應用程序一般不要直接訪問內存或其他硬件設備,如鍵盤、鼠標、計數器、屏幕或串口、並口等。Windows系統要求絕對控制這些資源,以保證向所有的應用程序提供公平的不中斷的運行。如果確實要訪問串並口,應當使用通過Windows提供的函數來安全的訪問。

1.3.6 Windows應用程序組成

    前面介紹了Windows應用程序的特點,現在讓我們看看編寫一個Windows程序需要做哪些工作。編寫一個典型的Windows應用程序,一般需要:
    1.C,CPP源程序文件:源程序文件包含了應用程序的數據、類、功能邏輯模塊(包括事件處理、用戶界面對象初始化以及一些輔助例程)的定義。
    2.H,HPP頭文件:頭文件包含了CPP、C源文件中所有數據、模塊、類的聲明。當一個CPP、C源文件要調用另一個CPP、C中所定義的模塊功能時,需要包含那個CPP、C文件對應的頭文件。
    3.資源文件:包含了應用程序所使用的全部資源定義,通常以.RC爲後綴名。注意這裏說的資源不同與前面提到的資源,這裏的資源是應用程序所能夠使用的一類預定義工具中的一個對象,包括:字符串資源、加速鍵表、對話框、菜單、位圖、光標、工具條、圖標、版本信息和用戶自定義資源等。
    其中CPP、C和頭文件同DOS下的類似,需要解釋的是資源文件。在DOS程序設計過程中,所有的界面設計工作都在源程序中完成。而在Windows程序設計過程中,象菜單、對話框、位圖等可視的對象被單獨分離出來加以定義,並存放在資源源文件中,然後由資源編譯程序編譯爲應用程序所能使用的對象的映象。資源編譯使應用程序可以讀取對象的二進制映象和具體數據結構,這樣可以減輕爲創建複雜對象所需要得程序設計工作。
    程序員在資源文件中定義應用程序所需使用的資源,資源編譯程序編譯這些資源並將它們存儲於應用程序的可執行文件或動態連接庫中。在Windows應用程序中引入資源有以下一些好處:
    1.降低內存需求:當應用程序運行時,資源並不隨應用程序一起裝入內存,而是在應用程序實際用到這些資源時才裝入內存。在資源裝入內存時,它們擁有自己的數據段,而不駐留於應用程序數據段中;當內存緊張時,可以廢棄這些資源,使其佔用的內存空間供他用,而當應用程序用到這些資源時才自動裝入,這種方式降低了應用程序的內存需求,使一次可運行更多的程序,這也是Windows內存管理的優點之一。
    2.便於統一管理和重複利用:將位圖、圖標、字符串等按資源文件方式組織便於統一管理和重用。比如,將所有的錯誤信息放到資源文件裏,利用一個函數就可以負責錯誤提示輸出,非常方便。如果在應用程序中要多次用到一個代表公司的徽標位圖,就可以將它存放在資源文件中,每次用到時再從資源文件中裝入。這種方式比將位圖放在一個外部文件更加簡單有效。
    3.應用程序與界面有一定的獨立性,有利於軟件的國際化:由於資源文件獨立於應用程序設計,使得在修改資源文件時(如調整對話框大小、對話框控制位置),可以不修改源程序,從而簡化了用戶界面的設計。另外,目前所提供的資源設計工具一般都是採用“所見即所得”方式,這樣就可以更加直觀、可視的設計應用程序界面。由於資源文件的獨立性,軟件國際化工作也非常容易。比如,現在開發了一個英文版的應用程序,要想把它漢化,只需要修改資源文件,將其中的對話框、菜單、字符串資源等漢化即可,而無需直接修改源程序。
    但是,應用程序資源只是定義了資源的外觀和組織,而不是其功能特性。例如,編輯一個對話框資源,可以改變對話框的安排和外觀,但是卻沒有也不可能改變應用程序響應對話框控制的方式。外觀的改變可以通過編輯資源來實現,而功能的改變卻只能通過改變應用程序的源代碼,然後重新編譯來實現。
    Windows應用程序的生成同DOS下類似,也要經過編譯、鏈接兩個階段,只是增加了資源編譯過程,基本流程如下圖:

T1_7.tif (156126 bytes)

圖1.7 應用程序生成過程

    C、CPP編譯器將C源程序編譯成目標程序,然後使用連接程序將所有的目標程序(包括各種庫)連接在一起,生成可執行程序。在製作Windows應用程序時,編譯器還要爲引出函數生成正確的入口和出口代碼。
    連接程序生成的可執行文件還不能在Windows環境下運行,必須使用資源編譯器對其進行處理。資源編譯器對可執行文件的處理是這樣的:如果該程序有資源描述文件,它就把已編譯爲二進制數據的資源加入到可執行文件中;否則,僅對該可執行文件進行相容性標識。應用程序必需經過資源編譯器處理纔可以在Windows環境下運行。

 

1.4 Windows應用程序的開發工具

    由於Windows是Microsoft的產品,因而在早期階段,開發工具只有Microsoft C和SDK(Software Developer Kit:軟件開發工具包)可供使用。利用SDK進行Windows程序的設計開發非常繁瑣、複雜,代碼可重用性差,工作量大,即便一個簡單的窗口也需要幾百行程序,令開發人員望而生畏。
    隨着Windows的逐漸普及,各大軟件公司紛紛推出自己的Windows軟件開發工具。國內用戶比較熟悉的有Borland C++2.0以上版本以及用於數據庫開發的Foxpro等等。其中Borland C++支持面向對象的開發,在我國具有廣大的用戶羣。
    可視化技術和CASE技術研究的深入爲我們帶來了支持可視化編程特性的第三代開發工具,這一代開發工具有:Visual Basic,Visual C++,Borland C++ Builder,Delphi和用於數據庫開發的PowerBuilder、Visual Foxpro等等。
    其中,Visual C++是美國Microsoft公司推出的4GL軟件開發工具,目前已成爲國內應用最廣泛的高級程序設計語言之一,最新版本爲5.0版。同其他軟件開發工具相比,Visual C++具有以下優點:

  • 面向對象、可視化開發:提供了面向對象的應用程序框架MFC(Microsoft Foundation Class:微軟基礎類庫),大大簡化了程序員的編程工作,提高了模塊的可重用性。Visual C++還提供了基於CASE技術的可視化軟件自動生成和維護工具AppWizard、ClassWizard、Visual Studio、WizardBar等,幫助用戶直觀的、可視地設計程序的用戶界面,可以方便的編寫和管理各種類,維護程序源代碼,從而提高了開發效率。用戶可以簡單而容易地使用C/C++編程。

  • 衆多的開發商支持以及業已成爲工業標準的MFC類庫:MFC類庫已經成爲事實上的工業標準類庫,得到了衆多開發商和軟件開發工具的支持;另外,由於衆多的開發商都採用Visual C++進行軟件開發,這樣用Visual C++開發的程序就與別的應用軟件有許多相似之處,易於學習和使用。
  • Visual C++封裝了Windows的API(應用程序接口)函數、USER、KERNEL、GDI函數,幫助我們弄清了許多函數的組織方法,隱去了創建、維護窗口的許多複雜的例行工作,簡化了編程。

        但是,由於C/C++本身的複雜性,Visual C/C++對編程人員要求還是相當高的。它首先要求編程者要具有豐富的C/C++語言編程經驗,瞭解面向對象編程的基本概念,同時還必須掌握複雜的MFC類庫。

 

1.5 面向對象和Windows編程

  面向對象技術是目前流行的系統設計開發技術,它包括面向對象分析和麪向對象程序設計。面向對象程序設計技術的提出,主要是爲了解決傳統程序設計方法——結構化程序設計所不能解決的代碼重用問題。

  結構化程序設計從系統的功能入手,按照工程的標準和嚴格的規範將系統分解爲若干功能模塊,系統是實現模塊功能的函數和過程的集合。由於用戶的需求和軟、硬件技術的不斷髮展變化,按照功能劃分設計的系統模塊必然是易變的和不穩定的。這樣開發出來的模塊可重用性不高。

  面向對象程序設計從所處理的數據入手,以數據爲中心而不是以服務(功能)爲中心來描述系統。它把編程問題視爲一個數據集合,數據相對於功能而言,具有更強的穩定性。

  面向對象程序設計同結構化程序設計相比最大的區別就在於:前者首先關心的是所要處理的數據,而後者首先關心的是功能。

  面向對象程序設計是一種圍繞真實世界的概念來組織模型的程序設計方法,它採用對象來描述問題空間的實體。關於對象這一概念,目前還沒有統一的定義。一般的認爲,對象是包含現實世界物體特徵的抽象實體,它反映了系統爲之保存信息和(或)與它交互的能力。它是一些屬性及服務的一個封裝體,在程序設計領域,可以用“對象=數據+作用於這些數據上的操作”這一公式來表達。

  類是具有相同操作功能和相同的數據格式(屬性)的對象的集合。類可以看作抽象數據類型的具體實現。抽象數據類型是數據類型抽象的表示形式。數據類型是指數據的集合和作用於其上的操作的集合,而抽象數據類型不關心操作實現的細節。從外部看,類型的行爲可以用新定義的操作加以規定。類爲對象集合的抽象,它規定了這些對象的公共屬性和方法;對象爲類的一個實例。蘋果是一個類,而放在桌上的那個蘋果則是一個對象。對象和類的關係相當於一般的程序設計語言中變量和變量類型的關係。

  消息是向某對象請求服務的一種表達方式。對象內有方法和數據,外部的用戶或對象對該對象提出的服務請求,可以稱爲向該對象發送消息。合作是指兩個對象之間共同承擔責任和分工。

  面向對象的編程方法具有四個基本特徵:

1.抽象:
  抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。比如,我們要設計一個學生成績管理系統,考察學生這個對象時,我們只關心他的班級、學號、成績等,而不用去關心他的身高、體重這些信息。抽象包括兩個方面,一是過程抽象,二是數據抽象。過程抽象是指任何一個明確定義功能的操作都可被使用者看作單個的實體看待,儘管這個操作實際上可能由一系列更低級的操作來完成。數據抽象定義了數據類型和施加於該類型對象上的操作,並限定了對象的值只能通過使用這些操作修改和觀察。

2.繼承:
  繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派生類(子類),而原始類稱爲新類的基類(父類)。派生類可以從它的基類那裏繼承方法和實例變量,並且類可以修改或增加新的方法使之更適合特殊的需要。這也體現了大自然中一般與特殊的關係。繼承性很好的解決了軟件的可重用性問題。比如說,所有的Windows應用程序都有一個窗口,它們可以看作都是從一個窗口類派生出來的。但是有的應用程序用於文字處理,有的應用程序用於繪圖,這是由於派生出了不同的子類,各個子類添加了不同的特性。

3.封裝:
  封裝是面向對象的特徵之一,是對象和類概念的主要特性。封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。一旦定義了一個對象的特性,則有必要決定這些特性的可見性,即哪些特性對外部世界是可見的,哪些特性用於表示內部狀態。在這個階段定義對象的接口。通常,應禁止直接訪問一個對象的實際表示,而應通過操作接口訪問對象,這稱爲信息隱藏。事實上,信息隱藏是用戶對封裝性的認識,封裝則爲信息隱藏提供支持。封裝保證了模塊具有較好的獨立性,使得程序維護修改較爲容易。對應用程序的修改僅限於類的內部,因而可以將應用程序修改帶來的影響減少到最低限度。

4. 多態性:
  多態性是指允許不同類的對象對同一消息作出響應。比如同樣的加法,把兩個時間加在一起和把兩個整數加在一起肯定完全不同。又比如,同樣的選擇編輯-粘貼操作,在字處理程序和繪圖程序中有不同的效果。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行爲共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。

  面向對象程序設計具有許多優點:

  • 開發時間短,效率高,可靠性高,所開發的程序更強壯。由於面向對象編程的可重用性,可以在應用程序中大量採用成熟的類庫,從而縮短了開發時間。

  • 應用程序更易於維護、更新和升級。繼承和封裝使得應用程序的修改帶來的影響更加局部化。

  Windows的最初開發是在80年代早期,在C++出現之前,但是當時已經提出了面向對象式的程序設計思想。Windows的開發者們已經意識到將界面上不同的項看作對象的好處,但是他們仍然被迫採用傳統的C語言來處理這些對象。在Windows的界面設計和軟件開發環境中,可以說處處貫穿着面向對象的思想。

  在Windows中,程序的基本單位不是過程和函數,而是窗口。一個窗口是一組數據的集合和處理這些數據的方法和窗口函數。從面向對象的角度來看,窗口本身就是一個對象。Windows程序的執行過程本身就是窗口和其他對象的創建、處理和消亡過程。Windows中的消息的發送可以理解爲一個窗口對象向別的窗口對象請求對象的服務過程。因此,用面向對象方法來進行Windows程序的設計與開發是極其方便的和自然的。

  採用面向對象的方法來進行Windows程序設計還可以簡化對資源的管理。當我們將資源映射成一個C++對象時,對資源的使用可以翻譯成以下C++順序:

1.創建一個對象:如定義一個畫筆對象

2.使用對象:用畫筆繪圖

3.撤消該對象

  一個對象的創建是對一個對象的定義過程,可以由對象的構造函數處理對資源的請求過程。當某一個對象退出活動範圍時,它的撤消可以由編譯器來自動管理。各種資源和Windows結構都能以這種方式處理,如設備上下文、畫筆、字體、畫刷等等。

 

小 結

  在這一講中,我們主要向讀者介紹了:

  • Windows操作系統的特點:面向對象的圖形用戶界面,一致的用戶接口,設備無關的圖形輸出以及多任務。
  • Windows編程的四個特點:事件驅動、消息循環、圖形輸出、資源共享
  • Windows的基本用戶界面對象:包括窗口、標題欄、圖標、光標、插入符號、對話框、控件等。
  • Windows應用程序的基本組成和生成過程:Windows應用程序包含C、CPP、頭文件和資源文件;Windows應用程序的生成要經過編譯和連接兩個階段。
  • Windows應用程序的開發工具Visual C++
  • 面向對象編程的基礎知識和運用面向對象技術進行Windows編程:對象、類、消息的概念;面向對象的編程特徵:抽象,繼承,封裝和多態性。在Windows編程中,窗口本身就是一個重要的對象。
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章