- 21天學通Visual C++
- 張志美等編著
- 3069字
- 2019-01-09 13:53:31
2.1 基于Windows的應用程序設計
讀者要理解Visual C++應用程序的開發過程,需要先理解Windows程序的運行機制。由于Visual C++是基于Windows操作系統的集成開發環境,需要明白在Windows環境下編程和在其他環境下編程的一些根本性的差別。對于Windows程序運行的一些根本性的概念,是一個Visual C++程序員所必須掌握的。
Windows程序設計是一種完全不同于傳統的DOS方式的程序設計方法。其內部運行原理是一種事件驅動方式的程序設計模式,主要是基于消息的。當用戶需要完成某種功能時會調用操作系統的某種支持,然后操作系統將用戶的需要包裝成消息,并投遞到消息隊列中,最后應用程序從消息隊列中取得消息并進行響應,其流程如圖2-1所示。

圖2-1 Windows程序設計
2.1.1 基于Windows的應用程序接口(API)
Windows程序設計中,應用程序要完成某個功能,通常都是以函數調用的形式實現的。同樣,應用程序也通常以函數調用的方式來通知操作系統執行相應的功能。Windows操作系統將它所能夠完成的功能寫成函數、常量、變量等形式,并提供給應用程序使用,而應用程序開發人員無須考慮其底層的源代碼及其工作機制的內部細節。應用程序對這些函數的調用就叫做系統調用。這些函數、常量、變量等的集合就是Windows操作系統提供的應用程序編程接口(Application Programming Interface),簡稱Windows API。
如果把進行Windows編程看作是程序設計人員在創作一幅藝術作品,比如一幅畫,那么Windows API就是程序員手中的筆。通過這支筆,程序員可以畫出多姿多彩的圖畫,如圖2-2所示。

圖2-2 API
例如,Windows中創建窗口的CreateWindow函數就是一個API函數,在應用程序中調用這個函數,操作系統就會按照該函數提供的參數信息產生一個相應的窗口,如下所示即調用CreateWindow函數。
CreateWindow(szWindowClass,szTitle);
此外,Windows提供了許多API函數,其函數名和參數名通常以英文單詞來命名,用戶通過其英文含義便可清楚地知道該API函數及其每個參數的用途。如顯示窗口用ShowWindow,退出Windows操作系統用ExitWindows等。此外,API函數的正確拼寫格式及各參數的詳細信息都可以在MSDN(Microsoft Developer Network,微軟開發者網絡,專門為開發人員進行軟件開發所提供的一個服務)中快速檢索到。
說明
讀者不要將這里的API與Java API或其他API混淆。API正如其語義一樣,已成為一種被廣泛使用的專業術語。如果某個系統或某個設備提供給某種應用程序,用于對其進行操作的函數、類或組件等的集合,就稱為該系統的API。
2.1.2 句柄的原理
在Windows編程中開發者會經常接觸到一個稱為句柄(HANDLE)的概念,句柄是指使用一個四字節長的整數,用于標識應用程序中的不同對象或同類對象中的不同實例。Windows程序中產生的任何資源(要占用某一塊或大或小的內存),如圖標、光標、位圖、窗口和應用程序的實例(已加載到內存運行中的程序)等,操作系統都要將其放入到相應的內存中,并為這些內存指定一個唯一的標識號,這個標識號即是該資源的句柄。
比如在大街上來來往往的汽車,有許多是相同型號、相同品牌的,也有許多是不同型號、大小的汽車。如何分辨某一輛汽車是屬于誰的呢?就是通過車牌號,因為車牌號是唯一的,那么車牌號就是汽車這個資源的句柄,如圖2-3所示。

圖2-3 句柄
操作系統要管理和操作這些資源,首先都是通過句柄來找到對應的資源的。一般來說,按資源的類型,可以將句柄分成圖標句柄(HICON)、光標句柄(HCURSOR)、位圖句柄(HBITMAP)、窗口句柄(HWND)、應用程序實例句柄(HINSTANCE)等類型。例如,操作系統給每一個窗口指定的一個唯一的標識號即窗口句柄。以指定的標識號作為句柄來創建窗口的語句如下。
hWnd = CreateWindow(szWindowClass,szTitle)
2.1.3 Windows應用程序入口——WinMain()函數
WinMain()函數是所有Win32程序的入口函數,這個函數是應用程序的基礎,類似于DOS下的main()函數。當Windows操作系統啟動一個程序時,其調用的就是該程序的WinMain()函數,當WinMain()函數結束或返回時,Windows應用程序就結束了。
一般來說,WinMain()函數接受4個參數。這些參數都是系統調用WinMain()函數時,傳遞給應用程序的,其原型如下。
int WINAPI WinMain( HINSTANCE hInstance, //當前運行的實例句柄 HINSTANCE hPrevInstance, //當前實例的上一個句柄 LPSTR lpCmdLine, //命令行指針 int nCmdShow, //顯示窗口狀態 );
各參數說明如下。
● hInstance:該應用程序當前實例的句柄。同一臺計算機上可運行同一個應用程序的多個實例。每啟動一個這樣的實例,操作系統都要給該實例分配一個標識號,即實例句柄。隨后系統調用程序中的WinMain函數,并將該實例句柄傳遞給參數hInstance。
● hPrevInstance:由同一個應用程序產生的先前實例的句柄。對于一個32位程序,該參數往往為NULL。
● lpCmdLine:是一個字符串,里面包含有傳遞給應用程序的參數串。例如,在Visual C++開發環境中給應用程序傳遞參數,單擊【Project】|【Settings】菜單項,在彈出的【Project Settings】對話框中選擇【Debug】標簽,在該標簽頁的【Program arguments】編輯框中輸入想要傳遞給應用程序的參數。
● nCmdShow:指定程序窗口應該如何顯示,如參數SW_SHOWMAXIMIZED將激活窗口并將其最大化,SW_MINIMIZE將最小化指定的窗口,SW_HIDE將隱藏窗口,并激活另外一個窗口等。
如果WinMain在消息循環之前返回,程序沒有正常運行,返回值為0。如果在消息循環之后返回,返回值為WM_QIUT消息的wParam參數。
一般來說,一個完整的Win32程序,其實現大致可分為4個步驟。例如,在Windows中創建一個窗口,并在該窗口中響應鍵盤及鼠標消息,其程序實現步驟如下。
1 WinMain函數的定義。
2 創建一個窗口。
3 進行消息循環。
4 完成回調函數。
說明
在Visual C++ 6.0中使用MFC進行Windows編程時,開發者可能找不到WinMain函數,這是因為MFC將WinMain函數隱藏在應用程序的框架中,編譯時會自動將該函數鏈接到可執行文件中。開發者可以重寫WinMain函數,但一般不需要這樣做。
2.1.4 消息及消息隊列機制
在應用程序中,用戶所有的操作都是通過消息機制(Message)來傳遞給操作系統的。操作系統將每個事件都包裝成一個稱為消息的結構體MSG來傳遞給應用程序。例如,用戶在某個程序活動時按了一下鍵盤鍵,操作系統馬上能感知到這一事件,并且能夠知道用戶按下的是哪一個鍵。操作系統并不決定對這一事件如何作出反應,而是將這一事件轉交給應用程序。由應用程序決定如何對這一事件作出反應,對事件作出反應的過程就是消息響應。
比如,有只蚊子叮了某個人一口,神經末梢(相當于操作系統)馬上感知到這個事件,并傳遞給了大腦(相當于應用程序)。大腦最終決定如何對這一事件作出反應。如將蚊子趕走,或是將蚊子拍死。其中蚊子叮人就產生了消息,而用戶的反應就是消息響應。在Windows編程中,消息與應用程序的關系如圖2-4所示。

圖2-4 消息與應用程序的關系
了解了消息的概念后,讀者可以再來看看消息隊列(Queue)的概念。Windows本身維護一個系統消息隊列,對于每一個正在運行的Windows應用程序,系統會為其建立一個“消息隊列”,用于存放該應用程序可能創建的各種消息。消息隊列是一個先進先出的緩沖區,通常是一個某種變量類型的數組。消息隊列里的每一個元素就是一條消息。操作系統將生成的每個消息按先后順序放進消息隊列里。第一條消息放入第一格,第二條消息放入第二格,依此類推。
一般來說,應用程序中包含一段消息循環代碼,用于從消息隊列中檢索這些消息。應用程序總是取走隊列中的第一條消息。消息取走后,第二條消息成為第一條,剩余的消息依次前移。應用程序取得消息后,便能夠知道用戶的操作和程序狀態的變化,并把它們分發到相應的函數中進行處理。
例如,若應用程序從隊列里取到了一條WM_CHAR消息,那一定是用戶輸入了一個字符,并且能夠知道輸入的是哪個字符。應用程序得到消息后,就要對消息進行處理,這就是通常說的消息響應。消息響應是用戶通過編碼實現的,這也是Windows程序的主要代碼。
在消息響應代碼中,很可能又要調用操作系統提供的API函數,以便完成特定的功能。如果用戶收到窗口的WM_CLOSE消息,可以調用API函數DestroyWindow來關閉該窗口,或是用MessageBox函數來提示用戶是否真的要關閉窗口。
因此,使用Visual C++編寫Windows程序時需要掌握以下兩點。
● 不同的消息所代表的用戶操作和程序狀態。
● 要讓操作系統執行某個功能所對應的API函數。
提示
Windows編程的主要代碼都集中在對消息的處理上,或者說編寫消息響應(處理)函數是進行Windows編程的主要工作。
- 構建高質量的C#代碼
- AutoCAD快速入門與工程制圖
- Introduction to DevOps with Kubernetes
- 條碼技術及應用
- CompTIA Network+ Certification Guide
- 新手學電腦快速入門
- 數據通信與計算機網絡
- 中國戰略性新興產業研究與發展·工業機器人
- Unity Multiplayer Games
- 工業機器人實操進階手冊
- 工業機器人入門實用教程
- Microsoft Dynamics CRM 2013 Marketing Automation
- Machine Learning with Spark(Second Edition)
- 穿越計算機的迷霧
- 智能+:制造業的智能化轉型