




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第九章、Windows編程指南
9.1Windows編程概念
一、Windows操作系統(tǒng)特點
Windows之所以取得成功,主要在于它具有以下優(yōu)點:直觀、高效的面向?qū)ο蟮膱D形用戶界面,易學(xué)易用:從某種意義上說,Windows用戶界面和開發(fā)環(huán)境都是面向?qū)ο蟮摹S脩舨捎谩斑x擇對象-操作對象”這種方式進行工作。比如要打開一個文檔,我們首先用鼠標或鍵盤選擇該文檔,然后從右鍵菜單中選擇“打開”操作,打開該文檔。這種操作方式模擬了現(xiàn)實世界的行為,易于理解、學(xué)習和使用。用戶界面統(tǒng)一、友好、漂亮:
Windows應(yīng)用程序大多符合IBM公司提出的CUA(CommonUserAcess)標準,所有的程序擁有相同的或相似的基本外觀,包括窗口、菜單、工具條等。用戶只要掌握其中一個,就不難學(xué)會其他軟件,從而降低了用戶培訓(xùn)學(xué)習的費用。豐富的設(shè)備無關(guān)的圖形操作:
Windows的圖形設(shè)備接口(GDI)提供了豐富的圖形操作函數(shù),可以繪制出諸如線、圓、框等的幾何圖形,并支持各種輸出設(shè)備。設(shè)備無關(guān)意味著在針式打印機上和高分辨率的顯示器上都能顯示出相同效果的圖形。多任務(wù):
Windows是一個多任務(wù)的操作環(huán)境,它允許用戶同時運行多個應(yīng)用程序,或在一個程序中同時做幾件事情。每個程序在屏幕上占據(jù)一塊矩形區(qū)域,這個區(qū)域稱為窗口,窗口是可以重疊的。用戶可以移動這些窗口,或在不同的應(yīng)用程序之間進行切換,并可以在程序之間進行手工和自動的數(shù)據(jù)交換和通信。雖然同一時刻計算機可以運行多個應(yīng)用程序,但僅有一個是處于活動狀態(tài)的,其標題欄呈現(xiàn)高亮顏色。一個活動的程序是指當前能夠接收用戶鍵盤輸入的程序。
二、Windows應(yīng)用程序設(shè)計的特點
Windows編程與DOS環(huán)境下編程相比有很大的不同。Windows要求以一種全新的思維方式進行程序設(shè)計,主要表現(xiàn)為以下幾點:1、事件驅(qū)動的程序設(shè)計
傳統(tǒng)的MS-DOS程序主要采用順序的、關(guān)聯(lián)的、過程驅(qū)動的程序設(shè)計方法。一個程序是一系列預(yù)先定義好的操作序列的組合,它具有一定的開頭、中間過程和結(jié)束。程序直接控制程序事件和過程的順序。這樣的程序設(shè)計方法是面向程序而不是面向用戶的,交互性差,用戶界面不夠友好,因為它強迫用戶按照某種不可更改的模式進行工作。它的基本模型如圖1.1所示。事件驅(qū)動程序設(shè)計是一種全新的程序設(shè)計方法,它由事件的發(fā)生來控制,而這種事件的發(fā)生是隨機的、不確定的,并沒有預(yù)定的順序,這樣就允許程序的的用戶用各種合理的順序來安排程序的流程。
對于需要用戶交互的應(yīng)用程序來說,事件驅(qū)動的程序設(shè)計有著過程驅(qū)動方法無法替代的優(yōu)點。它是一種面向用戶的程序設(shè)計方法,它在程序設(shè)計過程中除了完成所需功能之外,更多的考慮了用戶可能的各種輸入,并針對性的設(shè)計相應(yīng)的處理程序。它是一種“被動”式程序設(shè)計方法,程序開始運行時,處于等待用戶輸入事件狀態(tài),然后取得事件并作出相應(yīng)反應(yīng),處理完畢又返回并處于等待事件狀態(tài)。它的框圖如圖1.2所示:
2、消息循環(huán)與輸入
事件驅(qū)動圍繞著消息的產(chǎn)生與處理展開,一條消息是關(guān)于發(fā)生的事件的消息。事件驅(qū)動是靠消息循環(huán)機制來實現(xiàn)的。消息是一種報告有關(guān)事件發(fā)生的通知。
Windows應(yīng)用程序的消息來源有以下四種:
(1)輸入消息:包括鍵盤和鼠標的輸入。這一類消息首先放在系統(tǒng)消息隊列中,然后由Windows將它們送入應(yīng)用程序消息隊列中,由應(yīng)用程序來處理消息。
(2)控制消息:用來與Windows的控制對象,如列表框、按鈕、檢查框等進行雙向通信。當用戶在列表框中改動當前選擇或改變了檢查框的狀態(tài)時發(fā)出此類消息。這類消息一般不經(jīng)過應(yīng)用程序消息隊列,而是直接發(fā)送到控制對象上去。
(3)系統(tǒng)消息:對程序化的事件或系統(tǒng)時鐘中斷作出反應(yīng)。一些系統(tǒng)消息,象DDE消息(動態(tài)數(shù)據(jù)交換消息)要通過Windows的系統(tǒng)消息隊列,而有的則不通過系統(tǒng)消息隊列而直接送入應(yīng)用程序的消息隊列,如創(chuàng)建窗口消息。
(4)用戶消息:這是程序員自己定義并在應(yīng)用程序中主動發(fā)出的,一般由應(yīng)用程序的某一部分內(nèi)部處理。
Windows操作系統(tǒng)包括三個內(nèi)核基本元件:GDI,KERNEL,USER。其中GDI(圖形設(shè)備接口)負責在屏幕上繪制像素、打印硬拷貝輸出,繪制用戶界面包括窗口、菜單、對話框等。系統(tǒng)內(nèi)核KERNEL支持與操作系統(tǒng)密切相關(guān)的功能:如進程加載,文本切換、文件I/O,以及內(nèi)存管理、線程管理等。USER為所有的用戶界面對象提供支持,它用于接收和管理所有輸入消息、系統(tǒng)消息并把它們發(fā)給相應(yīng)的窗口的消息隊列。消息隊列是一個系統(tǒng)定義的內(nèi)存塊,用于臨時存儲消息;或是把消息直接發(fā)給窗口過程。每個窗口維護自己的消息隊列,并從中取出消息,利用窗口函數(shù)進行處理??驁D如下:
3、圖形輸出
Windows程序不僅在輸入上與DOS程序不同,而且在程序輸出上也與DOS有著很大不同,主要表現(xiàn)為:(1).DOS程序獨占整個顯示屏幕,其他程序在后臺等待。而Windows的每一個應(yīng)用程序?qū)ζ聊坏囊徊糠诌M行處理。
DOS程序可以直接往屏幕上輸出,而Windows是一個多窗口的操作系統(tǒng),由操作系統(tǒng)來統(tǒng)一管理屏幕輸出;每個窗口要輸出內(nèi)容時,必須首先向操作系統(tǒng)發(fā)出請求(GDI請求),由操作系統(tǒng)完成實際的屏幕輸出工作。
(2).Windows程序的所有輸出都是圖形。Windows提供了豐富的圖形函數(shù)用于圖形輸出,這對輸出圖形是相當方便的,但是由于字符也被作為圖形來處理,輸出時的定位要比DOS復(fù)雜的多。
比如,在DOS字符方式下,我們可以寫出如下程序用于輸出兩行文字:
printf(“Hello,\n”);
printf(“ThisisDOSprogram.\n”);
而在Windows下要輸出這兩行文字所做的工作要復(fù)雜的多。因為Windows輸出是基于圖形的,它輸出文本時不會象DOS那樣自動換行,而必須以像素為單位精確定位每一行的輸出位置。另外,由于Windows提供了豐富的字體,所以在計算坐標偏移量時還必須知道當前所用字體的高度和寬度。(3).Windows下的輸出是設(shè)備無關(guān)的。Windows下的應(yīng)用程序使用圖形設(shè)備接口(GDI)來進行圖形輸出。GDI屏蔽了不同設(shè)備的差異,提供了設(shè)備無關(guān)的圖形輸出能力,Windows應(yīng)用程序只要發(fā)出設(shè)備無關(guān)的GDI請求(如調(diào)用Rectangle畫一個矩形),由GDI去完成實際的圖形輸出操作。對于一臺具有打印矩形功能的PostScript打印機來說,GDI可能只需要將矩形數(shù)據(jù)傳給驅(qū)動程序就可以了,然后由驅(qū)動程序產(chǎn)生PostScript命令繪制出相應(yīng)的矩形;而對于一臺沒有矩形輸出功能的點陣打印機來說,GDI可能需要將矩形轉(zhuǎn)化為四條線,然后向驅(qū)動程序發(fā)出畫線的指令,在打印機上輸出矩形。當然,這兩種輸出在用戶看來并沒有什么區(qū)別。
Windows的圖形輸出是由圖形設(shè)備接口(GDI)來完成的,GDI是系統(tǒng)原始的圖形輸出庫,它用于在屏幕上輸出像素、在打印機上輸出硬拷貝以及繪制Windows用戶界面。
GDI提供兩種基本服務(wù):創(chuàng)建圖形輸出和存儲圖象。GDI提供了大量用于圖形輸出的函數(shù),這些函數(shù)接收應(yīng)用程序發(fā)出來的繪圖請求、處理繪圖數(shù)據(jù)并根據(jù)當前使用設(shè)備調(diào)用相應(yīng)的設(shè)備驅(qū)動程序產(chǎn)生繪圖輸出。這些繪圖函數(shù)分為三類:一是文字輸出,二是矢量圖形函數(shù),用于畫線、圓等幾何圖形,三是光柵(位圖)圖形函數(shù),用于繪制位圖。
GDI識別四種類型的設(shè)備:顯示屏幕、硬拷貝設(shè)備(打印機、繪圖機)、位圖和圖元文件。前兩者是物理設(shè)備,后兩者是偽設(shè)備。一個偽設(shè)備提供了一種在RAM里或磁盤里存儲圖象的方法。位圖存放的是圖形的點位信息,占用較多的內(nèi)存,但速度很快。圖元文件保存的是GDI函數(shù)的調(diào)用和調(diào)用參數(shù),占用內(nèi)存較少,但依賴于GDI,因此不可能用某個設(shè)備來創(chuàng)建圖元文件,而且速度比位圖要慢。
4、用戶界面對象
Windows支持豐富的用戶接口對象,包括:窗口、圖標、菜單、對話框等等。程序員只需簡單的幾十行代碼,就可以設(shè)計出一個非常漂亮的圖形用戶界面。而在DOS環(huán)境下,則需要大量的代碼來完成同樣的工作,而且效果也沒有Windows提供的那么好。下面我們介紹一下用戶界面對象中的一些術(shù)語和相關(guān)概念。
窗口
窗口是用戶界面中最重要的部分。它是屏幕上與一個應(yīng)用程序相對應(yīng)的矩形區(qū)域,是用戶與產(chǎn)生該窗口的應(yīng)用程序之間的可視界面。每當用戶開始運行一個應(yīng)用程序時,應(yīng)用程序就創(chuàng)建并顯示一個窗口;當用戶操作窗口中的對象時,程序會作出相應(yīng)反應(yīng)。用戶通過關(guān)閉一個窗口來終止一個程序的運行;通過選擇相應(yīng)的應(yīng)用程序窗口來選擇相應(yīng)的應(yīng)用程序。一個典型的窗口外觀如圖1.4所示。邊框
絕大多數(shù)窗口都有一個邊框,用于指示窗口的邊界。同時也用來指明該窗口是否為活動窗口,當窗口活動時,邊框的標題欄部分呈高亮顯示。用戶可以用鼠標拖動邊框來調(diào)整窗口的大小。系統(tǒng)菜單框
系統(tǒng)菜單框位于窗口左上角,以當前窗口的圖標方式顯示,用鼠標點一下該圖標(或按ALT+空格鍵)就彈出系統(tǒng)菜單。系統(tǒng)菜單提供標準的應(yīng)用程序選項,包括:Restore(還原窗口原有的大小),Move(使窗口可以通過鍵盤上的光標鍵來移動其位置),Size(使用光標鍵調(diào)整窗口大小),Minimize(將窗口縮成圖標),Maximize(最大化:使窗口充滿整個屏幕)和Close(關(guān)閉窗口)。標題欄
標題欄位于窗口的頂部,其中顯示的文本信息用于標注應(yīng)用程序,一般是應(yīng)用程序的名字,以便讓用戶了解哪個應(yīng)用程序正在運行。標題欄顏色反映該窗口是否是一個活動窗口,當為活動窗口時,標題欄呈現(xiàn)醒目顏色。鼠標雙擊標題欄可以使窗口在正常大小和最大化狀態(tài)之間切換。在標題欄上按下鼠標器左鍵可以拖動并移動該窗口,按右鍵彈出窗口系統(tǒng)菜單。菜單欄
菜單欄位于標題欄下方,橫跨屏幕,在它上面列出了應(yīng)用程序所支持的命令,菜單欄中的項是命令的主要分類,如文件操作、編輯操作。從菜單欄中選中某一項通常會顯示一個彈出菜單,其中的項是對應(yīng)于指定分類中的某個任務(wù)。通過選擇菜單中的一個項(菜單項),用戶可以向程序發(fā)出命令,以執(zhí)行某一功能。如選擇“文件->打開...”菜單項會彈出一個打開文件對話框,讓用戶選擇一個文件,然后打開這個文件。
一般的,以“...”結(jié)尾的菜單項文本表明選擇該項時會彈出一個對話框,讓用戶輸入信息,然后執(zhí)行操作,如“文件->打開...”。若不以“...”結(jié)尾,則表明選擇該菜單項直接執(zhí)行一個動作,如“編輯”菜單下的“粘貼”菜單項。若一個菜單項呈現(xiàn)灰色,則表明該菜單當前不可用。有時菜單項上還有加速鍵,加速鍵是一種鍵盤組合,它是菜單項的一種替代方式,可以讓用戶通過鍵盤直接發(fā)出命令;在鍵盤上按下這一鍵盤組合,就等效于選擇了相應(yīng)的菜單。如“粘貼(P)CTRL+V”,就表示粘貼操作的加速鍵是CTRL+V,按下CTRL+V就執(zhí)行粘貼操作。工具條
工具條一般位于菜單欄下方,在它上面有一組位圖按鈕,代表一些最常用的命令。工具條可以顯示或隱藏。讓鼠標在某個按鈕上停一會兒,在按鈕下方會出現(xiàn)一個黃色的小窗口,里面顯示關(guān)于該按鈕的簡短說明,叫做工具條提示(ToolTip)。用戶還可以用鼠標拖動工具條將其放在窗口的任何一側(cè)??蛻魠^(qū)
客戶區(qū)是窗口中最大的一塊空白矩形區(qū)域,用于顯示應(yīng)用程序的輸出。例如,字處理程序在客戶區(qū)中顯示文檔的當前頁面。應(yīng)用程序負責客戶區(qū)的繪制工作,而且只有和該窗口相對應(yīng)的應(yīng)用程序才能向該用戶區(qū)輸出。垂直滾動條和水平滾動條
垂直滾動條和水平滾動條分別位于客戶區(qū)的左側(cè)和底部,它們各有兩個方向相反的箭頭和一個深色的長度可變的滾動塊。可以用鼠標選中滾動條的箭頭上下卷滾(選中垂直滾動條時)或水平卷滾(選中水平滾動條時)客戶區(qū)的內(nèi)容。滾動塊的位置表示客戶區(qū)中顯示的內(nèi)容相對于要顯示的全部內(nèi)容的位置,滾動塊的長度表示客戶區(qū)中顯示的內(nèi)容大小相對于全部內(nèi)容大小的比例。狀態(tài)欄
狀態(tài)欄是一般位于窗口底部,用于輸出菜單的說明和其他一些提示信息(如鼠標器位置、當前時間、某種狀態(tài)等)。圖標
圖標是一個用于提醒用戶的符號,它是一個小小的圖象,用于代表一個應(yīng)用程序。當一個應(yīng)用程序的主窗口縮至最小時,就呈現(xiàn)為一個圖標。光標
Windows的光標是顯示屏上的一個位圖,而不是DOS下的一條下劃線。光標用于響應(yīng)鼠標或其他定位設(shè)備的移動。程序可以通過改變光標的形狀來指出系統(tǒng)中的變化。例如,程序常顯示一個計時的光標,用于指示用戶一些漫長的操作正在進行之中。程序也可以通過改變光標讓用戶知道程序進入了一種特殊模式,例如,繪圖程序經(jīng)常改變光標來反映被繪制對象的類型,是直線還是圓或其他。插入符
插入符(caret)是一個微小并閃爍的位圖,作為一個鍵盤控制的指針??刂奇I盤輸入的窗口可以創(chuàng)建一個插入符去通知用戶:窗口現(xiàn)在可以進行鍵盤輸入。在DOS環(huán)境下,一般使用“光標”作為鍵盤指針,而在Windows中,“光標”被作為鼠標指針。
應(yīng)用程序必須維護這個插入符。在Windows中,在一個時間只允許有一個插入符存在。因此,要使用插入符號作為鍵盤指針的應(yīng)用程序必須在取得焦點時創(chuàng)建一個插入符號,并在失去焦點后刪除它。對話框
對話框是一種特殊的窗口,它提供了一種接收用戶輸入、處理數(shù)據(jù)的標準方法。特別的,當用戶輸入了一個需要附加信息
的命令時,對話框是接收輸入的標準方法。比如,假設(shè)用戶要求系統(tǒng)打開一個文件,對話框就可以提供一個讓用戶從一組文件中選擇一個文件的標準方法。如前所述,在一般情況下,在選擇菜單名字后面跟著省略號(...)的菜單項通常會彈出一個對話框。圖1.5給出了查找對話框的一個例子。控件
在圖1.5中,查找對話框是一個獨立的窗口,它顯示信息并接收用戶的輸入。在對話框中,還包含了許多小的窗口,這些窗口被稱為控件??丶菓?yīng)用程序用來獲得用戶特定信息的窗口,比如要打開文件的名字或自動換行的設(shè)置等。應(yīng)用程序也會通過控件獲取所需的信息,以便控制程序的某種屬性,如自動換行特性的開關(guān)。
控件總是與其他窗口連用,典型的是對話框,但也可以用在普通窗口之中。常見的控件有:按鈕、編輯框、列表框、組合框、靜態(tài)文本等等。消息框
消息框是用于給用戶一些提示或警告的窗口。例如,消息框能夠在應(yīng)用程序執(zhí)行某項任務(wù)過程中出現(xiàn)問題時通知用戶。圖1-6所示的對話框警告用戶輸入了一個不合法的文件名。5、資源共享Windows是一個多任務(wù)的操作系統(tǒng),各個應(yīng)用程序共享系統(tǒng)提供的資源,常見的資源包括:設(shè)備上下文,畫刷,畫筆,字體,對話框控制,對話框,圖標,定時器,插入符號,通信端口,電話線等。
Windows要求應(yīng)用程序必須以一種能允許它共享Windows資源的方式進行設(shè)計,它的基本模式是這樣的:
1.向Windows系統(tǒng)請求資源;
2.使用該資源;
3.釋放該資源給Windows以供別的程序使用。
如果忽略了第三步,輕則當時不出錯,但過一會兒出現(xiàn)程序運行出現(xiàn)異常情況,或干擾別的程序正常運行;重則立即死機,比如設(shè)備上下文沒有釋放時。
在Windows應(yīng)用程序設(shè)計中,CPU也是一種非常重要的資源,因此應(yīng)用程序應(yīng)當避免長時間的占用CPU資源(如一個特別長的循環(huán));如果確實需要這樣做,也應(yīng)當采取一些措施,以讓程序能夠響應(yīng)用戶的輸入。主存也是一個共享資源,要防止同時運行的多個應(yīng)用程序因協(xié)調(diào)不好而耗盡內(nèi)存資源。
應(yīng)用程序一般不要直接訪問內(nèi)存或其他硬件設(shè)備,如鍵盤、鼠標、計數(shù)器、屏幕或串口、并口等。Windows系統(tǒng)要求絕對控制這些資源,以保證向所有的應(yīng)用程序提供公平的不中斷的運行。如果確實要訪問串并口,應(yīng)當使用通過Windows提供的函數(shù)來安全的訪問。6、Windows應(yīng)用程序組成
前面介紹了Windows應(yīng)用程序的特點,現(xiàn)在讓我們看看編寫一個Windows程序需要做哪些工作。編寫一個典型的Windows應(yīng)用程序,一般需要:
(1).C,CPP源程序文件:源程序文件包含了應(yīng)用程序的數(shù)據(jù)、類、功能邏輯模塊(包括事件處理、用戶界面對象初始化以及一些輔助例程)的定義。
(2).H,HPP頭文件:頭文件包含了CPP、C源文件中所有數(shù)據(jù)、模塊、類的聲明。當一個CPP、C源文件要調(diào)用另一個CPP、C中所定義的模塊功能時,需要包含那個CPP、C文件對應(yīng)的頭文件。
(3).資源文件:包含了應(yīng)用程序所使用的全部資源定義,通常以.RC為后綴名。注意這里說的資源不同與前面提到的資源,這里的資源是應(yīng)用程序所能夠使用的一類預(yù)定義工具中的一個對象,包括:字符串資源、加速鍵表、對話框、菜單、位圖、光標、工具條、圖標、版本信息和用戶自定義資源等。
程序員在資源文件中定義應(yīng)用程序所需使用的資源,資源編譯程序編譯這些資源并將它們存儲于應(yīng)用程序的可執(zhí)行文件或動態(tài)連接庫中。在Windows應(yīng)用程序中引入資源有以下一些好處:
(1).降低內(nèi)存需求:當應(yīng)用程序運行時,資源并不隨應(yīng)用程序一起裝入內(nèi)存,而是在應(yīng)用程序?qū)嶋H用到這些資源時才裝入內(nèi)存。在資源裝入內(nèi)存時,它們擁有自己的數(shù)據(jù)段,而不駐留于應(yīng)用程序數(shù)據(jù)段中;當內(nèi)存緊張時,可以廢棄這些資源,使其占用的內(nèi)存空間供他用,而當應(yīng)用程序用到這些資源時才自動裝入,這種方式降低了應(yīng)用程序的內(nèi)存需求,使一次可運行更多的程序,這也是Windows內(nèi)存管理的優(yōu)點之一。
(2).便于統(tǒng)一管理和重復(fù)利用:將位圖、圖標、字符串等按資源文件方式組織便于統(tǒng)一管理和重用。比如,將所有的錯誤信息放到資源文件里,利用一個函數(shù)就可以負責錯誤提示輸出,非常方便。如果在應(yīng)用程序中要多次用到一個代表公司的徽標位圖,就可以將它存放在資源文件中,每次用到時再從資源文件中裝入。這種方式比將位圖放在一個外部文件更加簡單有效。(3).應(yīng)用程序與界面有一定的獨立性,有利于軟件的國際化:由于資源文件獨立于應(yīng)用程序設(shè)計,使得在修改資源文件時(如調(diào)整對話框大小、對話框控制位置),可以不修改源程序,從而簡化了用戶界面的設(shè)計。另外,目前所提供的資源設(shè)計工具一般都是采用“所見即所得”方式,這樣就可以更加直觀、可視的設(shè)計應(yīng)用程序界面。由于資源文件的獨立性,軟件國際化工作也非常容易。比如,現(xiàn)在開發(fā)了一個英文版的應(yīng)用程序,要想把它漢化,只需要修改資源文件,將其中的對話框、菜單、字符串資源等漢化即可,而無需直接修改源程序。
但是,應(yīng)用程序資源只是定義了資源的外觀和組織,而不是其功能特性。例如,編輯一個對話框資源,可以改變對話框的安排和外觀,但是卻沒有也不可能改變應(yīng)用程序響應(yīng)對話框控制的方式。外觀的改變可以通過編輯資源來實現(xiàn),而功能的改變卻只能通過改變應(yīng)用程序的源代碼,然后重新編譯來實現(xiàn)。
Windows應(yīng)用程序的生成也要經(jīng)過編譯、鏈接兩個階段,只是增加了資源編譯過程,基本流程如下圖:C、CPP編譯器將C源程序編譯成目標程序,然后使用連接程序?qū)⑺械哪繕顺绦颍òǜ鞣N庫)連接在一起,生成可執(zhí)行程序。在制作Windows應(yīng)用程序時,編譯器還要為引出函數(shù)生成正確的入口和出口代碼。
連接程序生成的可執(zhí)行文件還不能在Windows環(huán)境下運行,必須使用資源編譯器對其進行處理。資源編譯器對可執(zhí)行文件的處理是這樣的:如果該程序有資源描述文件,它就把已編譯為二進制數(shù)據(jù)的資源加入到可執(zhí)行文件中;否則,僅對該可執(zhí)行文件進行相容性標識。應(yīng)用程序必需經(jīng)過資源編譯器處理才可以在Windows環(huán)境下運行。
三、Windows應(yīng)用程序的開發(fā)工具
由于Windows是Microsoft的產(chǎn)品,因而在早期階段,開發(fā)工具只有MicrosoftC和SDK(SoftwareDeveloperKit:軟件開發(fā)工具包)可供使用。利用SDK進行Windows程序的設(shè)計開發(fā)非常繁瑣、復(fù)雜,代碼可重用性差,工作量大,即便一個簡單的窗口也需要幾百行程序,令開發(fā)人員望而生畏。
隨著Windows的逐漸普及,各大軟件公司紛紛推出自己的Windows軟件開發(fā)工具。國內(nèi)用戶比較熟悉的有BorlandC++2.0以上版本以及用于數(shù)據(jù)庫開發(fā)的Foxpro等等。其中BorlandC++支持面向?qū)ο蟮拈_發(fā),在我國具有廣大的用戶群。
可視化技術(shù)和CASE技術(shù)研究的深入為我們帶來了支持可視化編程特性的第三代開發(fā)工具,這一代開發(fā)工具有:VisualBasic,Visual
C++,BorlandC++Builder,Delphi和用于數(shù)據(jù)庫開發(fā)的PowerBuilder、VisualFoxpro等等。
其中,VisualC++是美國Microsoft公司推出的4GL軟件開發(fā)工具,目前已成為國內(nèi)應(yīng)用最廣泛的高級程序設(shè)計語言之一,最新版本為8.0版。同其他軟件開發(fā)工具相比,VisualC++具有以下優(yōu)點:面向?qū)ο?、可視化開發(fā):提供了面向?qū)ο蟮膽?yīng)用程序框架MFC(MicrosoftFoundationClass:微軟基礎(chǔ)類庫),大大簡化了程序員的編程工作,提高了模塊的可重用性。VisualC++還提供了基于CASE技術(shù)的可視化軟件自動生成和維護工具AppWizard、ClassWizard、VisualStudio、WizardBar等,幫助用戶直觀的、可視地設(shè)計程序的用戶界面,可以方便的編寫和管理各種類,維護程序源代碼,從而提高了開發(fā)效率。用戶可以簡單而容易地使用C/C++編程。眾多的開發(fā)商支持以及業(yè)已成為工業(yè)標準的MFC類庫:MFC類庫已經(jīng)成為事實上的工業(yè)標準類庫,得到了眾多開發(fā)商和軟件開發(fā)工具的支持;另外,由于眾多的開發(fā)商都采用VisualC++進行軟件開發(fā),這樣用VisualC++開發(fā)的程序就與別的應(yīng)用軟件有許多相似之處,易于學(xué)習和使用。VisualC++封裝了Windows的API(應(yīng)用程序接口)函數(shù)、USER、KERNEL、GDI函數(shù),幫助我們弄清了許多函數(shù)的組織方法,隱去了創(chuàng)建、維護窗口的許多復(fù)雜的例行工作,簡化了編程。
但是,由于C/C++本身的復(fù)雜性,VisualC/C++對編程人員要求還是相當高的。它首先要求編程者要具有豐富的C/C++語言編程經(jīng)驗,了解面向?qū)ο缶幊痰幕靖拍睿瑫r還必須掌握復(fù)雜的MFC類庫。9.2使用VisualC++6.0一、VisualC++可視化集成開發(fā)環(huán)境
VisualC++提供了一個支持可視化編程的集成開發(fā)環(huán)境,它不僅支持VisualC++,還支持VisualBasic,Visual
J++,VisualInterDev等Microsoft系列開發(fā)工具。DeveloperStudio包含了一個文本編輯器、資源編輯器、工程編譯工具、一個增量連接器、源代碼瀏覽器、集成調(diào)試工具,以及一套聯(lián)機文檔。使用DeveloperStudio,可以完成創(chuàng)建、調(diào)試、修改應(yīng)用程序等的各種操作。
DeveloperStudio采用標準的多窗口Windows用戶界面,并增加了一些新特性,使得開發(fā)環(huán)境更易于使用,用戶很容易學(xué)會它的使用方法。一個典型的DeveloperStudio用戶界面如圖2.1所示。
所謂可視化編程,就是指:在軟件開發(fā)過程中,用直觀的具有一定含義的圖標按鈕、圖形化的對象取代原來手工的抽象的編輯、運行、瀏覽操作,軟件開發(fā)過程表現(xiàn)為鼠標點擊按鈕和拖放圖形化的對象以及指定對象的屬性、行為的過程。這種可視化的編程方法易學(xué)易用,而且大大提高了工作效率。
VisualC++的集成開發(fā)環(huán)境提供了大量的實用工具以支持可視化編程特性,它們包括:項目工作區(qū)、ClassWizard、AppWizard、WizardBar、ComponentGallery等。1、項目工作區(qū)
程序員的大部分工作都在集成開發(fā)環(huán)境中完成。集成開發(fā)環(huán)境使用項目工作區(qū)來組織項目、元素以及項目信息在屏幕上出現(xiàn)的方式。在一個項目工作區(qū)中,可以處理:一個工程和它所包含的文件一個工程的子工程多個相互獨立的工程多個相互依賴的工程
一個項目工作區(qū)可包含由不同的開發(fā)工具包生成的工程,如VisualC++和VisualJ++。在桌面上,項目工作區(qū)以窗口方式組織項目、文件和項目設(shè)置。項目工作區(qū)窗口一般位于屏幕左側(cè),如圖2.2所示。項目工作區(qū)窗口底部有一組標簽,用于從不同的角度(視圖)察看項目中包含的工程和聯(lián)機文檔。每個項目視圖都有一個相應(yīng)的文件夾,包含了關(guān)于該項目的各種元素。展開該文件夾可以顯示該視圖方式下工作區(qū)的詳細信息。項目工作區(qū)包含四種視圖:
FileView(文件視圖):顯示所創(chuàng)建的工程。展開文件夾可以察看工程中所包含的文件。
ClassView(類視圖):顯示項目中定義的C++類,展開文件夾顯示工程中所定義的所有類,展開類可察看類的數(shù)據(jù)成員和成員函數(shù)以及全局變量、函數(shù)和類型定義。
ResourceView(資源視圖):顯示項目中所包含的資源文件。展開文件夾可顯示所有的資源類型。
InfoView(文檔視圖):顯示聯(lián)機文檔目錄表。展開目錄表可以顯示所有的幫助主題,雙擊主題將彈出InfoViewerTopic窗口,顯示關(guān)于該主題的詳細信息。要顯示關(guān)于源程序窗口的關(guān)鍵字的相關(guān)信息,可以將光標移動到該關(guān)鍵字上,然后按下F1鍵。還可以使用InfoViewer顯示來自InternetWWW(萬維網(wǎng))的頁面。
單擊項目工作區(qū)底部的標簽可以從一個視圖切換到另一個視圖。每個視圖都是按層次方式組織的??梢哉归_文件夾和其中的項察看其內(nèi)容,或折疊起來察看其組織結(jié)構(gòu)。
在項目視圖中,如果一項不可以再展開,那么它是可編輯的。雙擊這一項便可以打開相應(yīng)的文檔編輯器進行編輯:對類和源程序文件來說,是打開文本編輯器。對于對話框來說是打開對話框編輯器每個視圖還支持右鍵快捷菜單。
使用文件視圖(FileView)
FileView窗格顯示了工程文件和項目工作區(qū)中所包含的文件的邏輯關(guān)系。一個工作區(qū)可以包含多個工程,其中活動工程以黑體顯示。活動配置決定了編譯活動工程時的編譯選項?;顒庸こ淌鞘褂肂uild或RebuildAll時要編譯的那一個工程??梢杂肂uild菜單上的SetActiveConfiguration選擇不同的活動配置;也可以在Project菜單上用SetActiveProject選擇不同的活動工程。
使用FileView可以:察看文件;管理文件:包括增加、刪除、移動、重命名、拷貝文件等。
要增加一個文件到過程中,可以選擇Project->AddtoProject->Files菜單,彈出文件對話框,選擇相應(yīng)文件即可;要從工程中刪除一個文件,可打開工程文件夾,選擇相應(yīng)文件,然后按DEL鍵。使用類視圖(ClassView)
ClassView顯示所有已定義的類以及這些類中的數(shù)據(jù)成員、成員變量。VisualC++自動從項目工作區(qū)中所包含的源程序文件中分離出類。
在ClassView中,文件夾代表工程文件名。展開ClassView頂層的文件夾后,顯示工程中所包含的所有的類,如圖2.3。雙擊一個類的圖標(或單擊圖標旁的+號)時,ClassView展開該類并顯示其類成員。ClassView使用圖標標識類、類成員和工程中的其他項,圖2.4顯示了所有的圖標和含義。
利用ClassView不僅可以瀏覽應(yīng)用程序所包含的類以及類中的成員,還可以快速跳到一個類或成員的定義,步驟如下:
(1).選擇要查找的定義或聲明的符號
(2).雙擊所選的符號名。
要打開關(guān)于某一個類聲明的頭文件,只需雙擊類名即可。
要想查找某一個變量的參考:
(1).將光標定位在該符號處
(2).按鼠標右鍵,彈出快捷菜單,選擇Reference(此時應(yīng)確保已經(jīng)生成了Browse(瀏覽)文件,關(guān)于Browse文件的選項,可以在Project-Settings中設(shè)置)。2、
AppWizard(應(yīng)用程序向?qū)?
AppWizard是VisualC++提供的一個高級編程工具,它可以產(chǎn)生應(yīng)用的C++源代碼框架。通過與另一個工具ClassWizard一起配合使用,可大大節(jié)省開發(fā)應(yīng)用程序的時間和精力。
AppWizard是一個標準的C++源代碼生成器。它通過一系列的對話框來提示用戶輸入所需創(chuàng)建的程序的信息,如它的名字和位置。用戶還可以指定它是否具有一些特性,如多文檔接口或工具條,對數(shù)據(jù)庫、OLE的支持等。然后AppWizard生成一些文件,這些文件構(gòu)成程序的框架。由AppWizard生成的程序是一個基本的Windows程序,用戶可以編譯并運行——它實際什么也不做。它只是準備好增加那些為程序提供功能性的資源和代碼。這樣就節(jié)省了用戶設(shè)計應(yīng)用程序框架的時間和精力,用戶所要做的工作只是直接往框架中添加自己的處理代碼。3、
ClassWizard(類向?qū)?
ClassWizard是一個交互式工具,用來建立新的類,定制類,把消息映射成類成員函數(shù),或者把控制框映射為類變量成員。在開發(fā)程序時,可用ClassWizard建立程序所需要的類,包括消息處理和消息映射例程(用于定位處理消息的代碼)。
使用ClassWizard,可以將成員函數(shù)或變量加入到一個類中,或修改已經(jīng)存在的函數(shù)和變量。Wizard使函數(shù)或變量放在何處,如何稱呼它們以及其他一些細節(jié)問題大大簡化。
ClassWizard所能識別的類必須在ClassView數(shù)據(jù)庫文件(.CLW)中登記。使用ClassWizard可以:創(chuàng)建新類:從許多框架基類中派生出新類映射消息到函數(shù)新建、刪除消息處理函數(shù)察看已被處理的消息并跳到消息處理代碼處定義成員變量:這些變量會被自動初始化,釋放,執(zhí)行對話框數(shù)據(jù)檢驗創(chuàng)建新類時,自動加入方法和屬性處理現(xiàn)有的類和類庫4、
WizardBar(向?qū)Чぞ邨l)
WizardBar是一個可停泊的工具條,用于快速訪問一些DeveloperStudio最實用的功能,比如ClassWizard或ClassView的一些功能。WizardBar會自動跟蹤用戶程序的上下文——比如,當文本編輯器中的光標從一個函數(shù)移動到另一個函數(shù)時,Wizard的顯示會自動更新。
WizardBar工具條包含了三個相關(guān)的下拉列表框:類(Class)、過濾器(Filter)和成員(Member),如圖2.5所示。類列表框包含了應(yīng)用程序定義的所有類。當前所選擇的類決定可用的過濾器;所選的過濾器決定Member列表中顯示的內(nèi)容。選擇Member中的一項,可以跳到相應(yīng)的成員定義。WizardBar最右邊是一個ActionControl,單擊ActionControl的向下箭頭符號會彈出一個菜單,用于執(zhí)行跳到函數(shù)定義、增加消息處理函數(shù)等操作。9.3
WIN32開發(fā)VisualC++6.0是一個全32位的軟件開發(fā)工具,它完全支持32位的Win32平臺開發(fā)。Win32平臺包括32位的Windows操作系統(tǒng)和軟件開發(fā)系統(tǒng)Win32API。所謂API(應(yīng)用程序接口)指的是一組由操作系統(tǒng)提供的函數(shù)。Win32API是Windows平臺上的一個32位的軟件開發(fā)系統(tǒng),它使應(yīng)用程序可以充分利用32位Windows操作系統(tǒng)的能力。使用Win32API寫成的應(yīng)用程序可以在Windows95或更高版本以及WindowsNT上運行。Win32可以應(yīng)用于特定的操作系統(tǒng),這種系統(tǒng)可以直接控制和處理PC硬件資源,它支持:高性能的搶先式多任務(wù)和多線程連續(xù)的32位地址空間和先進的內(nèi)存管理對所有的可為進程共享的對象,解決了它的安全性問題內(nèi)存映射文件
一、搶先式多任務(wù)和多線程
我們知道Windows是一個多任務(wù)操作系統(tǒng),它提供了一次運行多個應(yīng)用程序的能力。
Windows95的多任務(wù)是一種搶先式多任務(wù)。比如,我們在用資源管理器復(fù)制一個文件的同時,還可以啟動另外一個應(yīng)用程序,如紙牌游戲,而且隨時都可以切換回資源管理器,察看文件復(fù)制進度,系統(tǒng)始終保持較好的響應(yīng)和靈活性。要了解搶先式多任務(wù),我們需要首先了解一下進程和線程的概念。調(diào)入內(nèi)存準備執(zhí)行的應(yīng)用程序叫做進程(process)。每個進程至少有一條線程,叫做主線程(primarythread)。一個進程包含代碼、數(shù)據(jù)和其他屬于應(yīng)用程序的資源。一條線程包含一組指令,相關(guān)的CPU寄存器值和一個堆棧。
在搶先式多任務(wù)操作系統(tǒng)中,系統(tǒng)在所有運行的所有進程之間對CPU時間進行共享,從而保證每個進程都能頻繁的訪問處理器,并且實現(xiàn)指令的連續(xù)執(zhí)行。這樣,每個Win32進程都需要分配一個優(yōu)先級,系統(tǒng)調(diào)度程序利用這種優(yōu)先級來決定哪一時刻該運行哪一個進程。具有高優(yōu)先級的進程(嚴格的說應(yīng)當是線程)就是當前運行的哪一個。更高優(yōu)先級的線程可以中斷當前進程的執(zhí)行。同一優(yōu)先級的線程通過時間片來調(diào)度。一個線程處于以下三種狀態(tài)之一:正在執(zhí)行,掛起,準備運行。在單處理器環(huán)境下(如Windows95),同一時刻只能運行一個線程。在Win32中支持多線程進程結(jié)構(gòu),主要有:對進程以及線程創(chuàng)建、操縱的支持對一個進程內(nèi)線程之間的同步和同步對象的支持一個統(tǒng)一的共享機制。二、連續(xù)的地址空間和先進的內(nèi)存管理
對于各種操作系統(tǒng)和平臺來說,內(nèi)存管理都是一個非常重要的問題。在Windows3.1下,有兩種形式的內(nèi)存管理函數(shù)調(diào)用:局部的和全局的。全局內(nèi)存管理函數(shù)從物理內(nèi)存中分配一段,然后返回一個句柄值。該句柄可以轉(zhuǎn)換為一個GlobalLock函數(shù)所使用的遠指針?;咎幚磉^程如下:
(1)申請一塊可移動的內(nèi)存塊(2)鎖定該內(nèi)存塊。因為Windows引入了虛擬內(nèi)存管理,可以把內(nèi)存塊移動到硬盤交換文件中,所以在使用內(nèi)存塊之前,必須將它鎖定在真正的內(nèi)存RAM之中,也就是告訴操作系統(tǒng),現(xiàn)在這塊內(nèi)存暫時由應(yīng)用程序來管理。(3)對該內(nèi)存塊進行各種操作:如復(fù)制數(shù)據(jù)到內(nèi)存塊。(4)解鎖內(nèi)存,應(yīng)用程序?qū)υ搩?nèi)存的控制交與Windows。下面給出一個程序片段,來說明內(nèi)存管理函數(shù)的用法。HGLOBALmemHandle;//內(nèi)存句柄charfar*lpMem;//假設(shè)長度為memLenmemHandle=GlobalAlloc(GHND,memLen+1);//申請內(nèi)存塊,此處未做返回結(jié)果檢查,//事實上,申請內(nèi)存有時會失敗memcpy(lpMem,string,textLen);//拷貝數(shù)據(jù),//其中string為一字符串變量,//textLen是這個字符串的長度GlobalUnlock(memHandle);//解鎖內(nèi)存...GlobalFree((HGLOBAL)memHandle);//釋放內(nèi)存在Win32下,所有的進程都有自己獨立的地址空間(在進程內(nèi)部的線程仍然共享進程的內(nèi)存變量),全局內(nèi)存不再對所有的Windows應(yīng)用程序都可見。由于每個應(yīng)用程序都有自己的地址空間,一個進程分配的內(nèi)存在該進程的地址之外就不再可見。DDE會話中使用的內(nèi)存對接收者進程來說是透明的。這樣,進程的安全性就得到大大提高,程序更加強壯。一個進程崩潰一般不會影響另外一個進程的執(zhí)行。但是,這也給多個應(yīng)用程序共享內(nèi)存帶來了困難。四、Win32編程基礎(chǔ)
Win32數(shù)據(jù)類型這里的數(shù)據(jù)類型指的是一些關(guān)鍵字,這些關(guān)鍵字定義了Win32中的函數(shù)中的有關(guān)參數(shù)和返回值的大小和意義。Win32常用的數(shù)據(jù)類型見上表句柄是Windows編程的一個關(guān)鍵性的概念,編寫Windows應(yīng)用程序總是要和各種句柄打交道。所謂句柄,就是一個唯一的數(shù),用以標識許多不同的對象類型,如窗口、菜單、內(nèi)存、畫筆、畫刷、電話線路等。在Win32里,句柄是指向一個“無類型對象”(void*)的指針,也就是一個4字節(jié)長的數(shù)據(jù)。無論它的本質(zhì)是什么,句柄并不是一個真正意義上的指針。從構(gòu)造上看,句柄是一個指針,盡管它沒有指向用于存儲某個對象的內(nèi)存位置。事實上,句柄指向一個包含了對該對象進行的引用的位置。句柄的聲明是這樣的:typedefvoid*HANDLE由于Windows是一個多任務(wù)操作系統(tǒng),它可以同時運行多個程序或一個程序的多個副本。這些運行的程序稱為一個實例。為了對同一程序的多個副本進行管理,Windows引入了實例句柄。Windows為每個應(yīng)用程序建立一張表,實例句柄就好象是這張表的一個索引。
Windows不僅使用句柄來管理實例,也用它來管理窗口、位圖、字體、元文件、圖標等系統(tǒng)資源。9.4
MFC編程
微軟基礎(chǔ)類庫(MFC:MicrosoftFoundationClass)是微軟為Windows程序員提供的一個面向?qū)ο蟮腤indows編程接口,它大大簡化了Windows編程工作。使用MFC類庫的好處是:首先,MFC提供了一個標準化的結(jié)構(gòu),這樣開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標準Windows應(yīng)用程序所需的程序,而是“站在巨人肩膀上”,從一個比較高的起點編程,故節(jié)省了大量的時間;其次,它提供了大量的代碼,指導(dǎo)用戶編程時實現(xiàn)某些技術(shù)和功能。MFC庫充分利用了Microsoft開發(fā)人員多年開發(fā)Windows程序的經(jīng)驗,并可以將這些經(jīng)驗融入到你自己開發(fā)的應(yīng)用程序中去。
對用戶來說,用MFC開發(fā)的最終應(yīng)用程序具有標準的、熟悉的Windows界面,這樣的應(yīng)用程序易學(xué)易用;另外,新的應(yīng)用程序還能立即支持所有標準Windows特性,而且是用普通的、明確定義的形式。事實上,也就是在Windows應(yīng)用程序界面基礎(chǔ)上定義了一種新的標準——MFC標準。
一、MFC類庫概念和組成
Microsoft提供了一個基礎(chǔ)類庫MFC,其中包含用來開發(fā)C++和C++Windows應(yīng)用程序的一組類?;A(chǔ)類庫的核心是以C++形式封裝了大部分的WindowsAPI。類庫表示窗口、對話框、設(shè)備上下文、公共GDI對象如畫筆、調(diào)色板、控制框和其他標準的Windows部件。這些類提供了一個面向Windows中結(jié)構(gòu)的簡單的C++成員函數(shù)的接口。
MFC可分為兩個主要部分:(1)基礎(chǔ)類(2)宏和全程函數(shù)。MFC基礎(chǔ)類
MFC中的類按功能來分可劃分為以下幾類:基類應(yīng)用程序框架類應(yīng)用程序類命令相關(guān)類文檔/視類線程類可視對象類窗口類視類對話框類屬性表控制類菜單類設(shè)備描述表繪畫對象類通用類文件診斷異常收集模板收集其他支持類OLE2類OLE基類OLE可視編輯包裝程序類OLE可視編輯服務(wù)器程序類OLE數(shù)據(jù)傳輸類OLE對話框類其他OLE類數(shù)據(jù)庫類宏和全局函數(shù)
若某個函數(shù)或變量不是某個類的一個成員,那么它是一個全程函數(shù)或變量。
Microsoft基本宏和全程函數(shù)提供以下功能:數(shù)據(jù)類型運行時刻對象類型服務(wù)診斷服務(wù)異常處理CString格式化及信息框顯示消息映射應(yīng)用消息和管理對象連接和嵌入(OLE)服務(wù)標準命令和WindowsIDs約定:全程函數(shù)以“Afx”為前綴,所有全程變量都是以“afx”為前綴,宏不帶任何特別前綴,但是全部大寫。
常見的全局函數(shù)和宏有:AfxGetApp,AfxGetMainWnd,AfxMessageBox,DEBUG_NEW等。
從繼承關(guān)系來看,又可將MFC中的類分成兩大類:大多數(shù)的MFC類是從CObject繼承下來;另外一些類則不是從CObject類繼承下來,這些類包括:字符串類CString,日期時間類CTime,矩形類CRect,點CPoint等,它們提供程序輔助功能。
由于MFC中大部分類是從CObject繼承下來的,CObject類描述了幾乎所有的MFC中其他類的一些公共特性,因此我們有必要理解CObject類。
CObject類為派生類提供了下述服務(wù):對象診斷MFC提供了許多診斷特性,它可以:輸出對象內(nèi)部信息:CDumpContext類與CObject的成員函數(shù)Dump配合,用于在調(diào)試程序時輸出對象內(nèi)部數(shù)據(jù)。對象有效性檢查:重載基類的AssertValid成員函數(shù),可以為派生類的對象提供有效性檢查。運行時訪問類的信息:MFC提供了一個非常有用的特性,它可以進行運行時的類型檢查。如果從CObject派生出一個類,并使用了以下三個宏(IMPLEMENT_DYNAMIC,IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL)之一,就可以:運行時訪問類名安全可靠的把通用的CObject指針轉(zhuǎn)化為派生類的指針二、MFC的優(yōu)點
MicrosoftMFC具有以下不同于其它類庫的優(yōu)勢:完全支持Windows所有的函數(shù)、控件、消息、GDI基本圖形函數(shù),菜單及對話框。類的設(shè)計以及同API函數(shù)的結(jié)合相當合理。使用與傳統(tǒng)的WindowsAPI同樣的命名規(guī)則,即匈牙利命名法。進行消息處理時,不使用易產(chǎn)生錯誤的switch/case語句,所有消息映射到類的成員函數(shù),這種直接消息到方法的映射對所有的消息都適用。它通過宏來實現(xiàn)消息到成員函數(shù)的映射,而且這些函數(shù)不必是虛擬的成員函數(shù),這樣不需要為消息映射函數(shù)生成一個很大的虛擬函數(shù)表(V表),節(jié)省內(nèi)存。通過發(fā)送有關(guān)對象信息到文件的能力提供更好的判定支持,也可確認成員變量。支持異常錯誤的處理,減少了程序出錯的機會運行時確定數(shù)據(jù)對象的類型。這允許實例化時動態(tài)操作各域有較少的代碼和較快的速度。MFC庫只增加了少于40k的目標代碼,效率只比傳統(tǒng)的CWindows程序低5%。可以利用與MFC緊密結(jié)合的AppWizard和ClassWizard等工具快速開發(fā)出功能強大的應(yīng)用程序。
另外,在使用MFC時還允許混合使用傳統(tǒng)的函數(shù)調(diào)用。三、MFC對消息的管理
Windows消息的管理包括消息發(fā)送和處理。為了支持消息發(fā)送機制,MFC提供了三個函數(shù):SendMessage、PostMessage和SendDlgItemMessage。而消息處理則相對來說顯得復(fù)雜一些。MFC采用了一種新的機制取代C語言編程時對Windows消息的Switch/Case分支,簡化了Windows編程,使程序可讀性、可維護性大大提高。這種消息映射機制包括一組宏,用于標識消息處理函數(shù)、映射類成員函數(shù)和對應(yīng)的消息等。其中,用afx_msg放在函數(shù)返回類型前面,用以標記它是一個消息處理成員函數(shù)。類若至少包含了一個消息處理函數(shù),那么還需要加上一個DECLARE_MESSAGE_MAP()宏,該宏對程序執(zhí)行部分所定義的消息映射進行初始化。
消息處理函數(shù)例子classCMainFrame:CFrameWnd{public:CMainFrame();protected://{{AFX_MSG(CMainFrame)afx_msg
int
OnCreate(LPCREATESTRUCT
lpCreateStruct);afx_msgvoidOnEditCopy();afx_msgvoidOnClose();//}}AFX_MSGDECLARE_MESSAGE_MAP()};
成員函數(shù)OnCreate,OnEditCopy,OnClose分別用來處理消息WM_CREATE、ID_EDIT_COPY和WM_CLOSE。其中,WM_CREATE和WM_CLOSE是系統(tǒng)預(yù)定義消息,包含在Windows.h中。而ID_EDIT_COPY是菜單Edit->Copy的標識,也就是用戶選擇Edit->Copy菜單項時產(chǎn)生的消息,一般在資源文件頭文件中定義。在類的實現(xiàn)部分給出這三個成員函數(shù)的定義,以及特殊的消息映射宏。上面的例子的消息映射宏定義如下:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_CREATE()ON_COMMAND(ID_EDIT_COPY,OnEditCopy)ON_WM_CLOSE()END_MESSAGE_MAP()
消息映射宏由BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()。其中,BEGIN_MESSAGE_MAP宏包含兩個參數(shù)CMainFrame類和CFrameWnd,分別代表當前定義的類和它的父類。在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之間,包含了主窗口要處理的各個Windows消息的入口。在本例中,包含三個消息。其中ON_WM_CREATE被用來指定缺省的成員函數(shù)OnCreate與WM_CREATE相對應(yīng)。在MFC中,包含了大量的預(yù)定義消息映射宏,用來指定各種成員函數(shù)與各種形如WM_XXXX消息相對應(yīng)。如ON_WM_CLOSE宏指定了WM_CLOSE消息的處理成員函數(shù)為OnClose。這時侯,只需要寫出要處理的消息就夠了,不必再寫出處理函數(shù)。消息映射宏ON_COMMAND則被用來將菜單項和用戶自定義的命令同它們的處理成員函數(shù)聯(lián)系起來。在上例中,用戶選擇Edit->Copy菜單項時,系統(tǒng)執(zhí)行OnEdit
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化學(xué)自主訓(xùn)練第一單元課題人工固氮技術(shù)-合成氨
- 狀語從句-2024年高中英語學(xué)業(yè)水平考試考點歸納與測試(江蘇專用)解析版
- 心靈雞湯 讀后續(xù)寫9 Applying Myself 導(dǎo)學(xué)案2024屆高三英語一輪復(fù)習
- 育嬰員中級習題庫(含參考答案解析)
- 語法填空綜合講練 易錯點(10個)-2025年八年級英語上冊暑假預(yù)習講義(譯林版 )
- 冶金設(shè)備優(yōu)化設(shè)計方法考核試卷
- 建筑智能化照明系統(tǒng)模擬考核試卷
- 渠道市場進入時機選擇策略考核試卷
- 農(nóng)業(yè)信貸與農(nóng)村城鎮(zhèn)化發(fā)展考核試卷
- 中介服務(wù)行業(yè)職業(yè)素養(yǎng)與行業(yè)法規(guī)遵守考核試卷
- 物業(yè)服務(wù)合同模板
- 廚房安全培訓(xùn)
- 2025超聲造影增強劑市場分析
- 焊工培訓(xùn)課件
- 醫(yī)療器械一次性耗材醫(yī)用器械耗材投標供貨方案
- 2025-2030全球集裝箱綁扎系統(tǒng)行業(yè)調(diào)研及趨勢分析報告
- 2025年廣安安農(nóng)發(fā)展集團招聘筆試參考題庫含答案解析
- 2024年度科技成果轉(zhuǎn)化與應(yīng)用合同3篇
- 洗護用品導(dǎo)購員聘用合同
- DB13T 1468-2011 無公害食品 無核克倫生葡萄生產(chǎn)技術(shù)規(guī)程
- xx公路與天然氣管道交叉方案安全專項評價報告
評論
0/150
提交評論