面向過程的MS-DOS編程:編程
傳統的DOS程序都有並且只有一個main函數,能夠在main函數中調用其它的函數,完成各類各樣的功能和過程。全部函數的調用以及執行都是按照用戶預約好的順序進行的。設計模式
在面向過程的程序中,整個程序按照必定順序進行;它是一系列預先定義好的操做序列的組合,且該過程徹底佔用着CPU,控制整個程序執行的過程。併發
面向用戶的事件驅動編程:函數
當Windows操做系統出現以後,面向過程的編程方式已經不能知足用戶的需求。一方面,隨着程序代碼量的逐步增大,面向過程編程的開發與維護工做也愈來愈困難;另外一方面,面向過程的程序設計方式只能適合於在單任務的操做系統上運行。所以,必須有一種新的程序設計模式,即事件驅動編程方式。spa
Windows是一種多任務的操做系統,能夠同時運行多個程序。每個程序都不能獨佔系統資源,而是共享各類系統資源,好比CPU和存儲器等。事件驅動程序剛好適合於Windows的多任務特色。操作系統
事件驅動編程方式徹底不一樣於面向過程的程序設計方式,它是由事件的產生來驅動的。事件的產生是隨機的、不肯定的,沒有預約順序的。所以,各類事件能夠以各類不一樣的、合理的順序出現,那麼,依賴於事件驅動的程序也能夠按各類不一樣的、合理的流程來執行。也正是這一點,使得多個程序共享系統資源成爲可能。設計
事件驅動的程序設計是一種面向用戶的程序設計方式。相對於面向過程的程序設計方式來講,事件驅動的程序設計方式是一種被動的程序設計方式。指針
面向過程的程序須要主動地去查詢用戶操做,並根據用戶操做調用相應的處理函數。而事件驅動的程序設計方式是一種被動的程序設計方式。程序老是處於等待用戶輸入事件狀態,而後被動地等待用戶操做;用戶的各類操做被稱之爲事件,事件驅動的程序設計方式須要事先爲各類須要處理的事件編寫事件響應函數;當某個用戶操做產生,即某個事件發生時,相應的響應函數就會被調用。程序取得事件並作出反應,處理完畢並返回後,又處於等待事件狀態。隊列
Windows消息機制:事件
要更好地使用Visual C++進行Windows編程,就須要進一步瞭解其消息機制。在Windows應用程序中,事件驅動是圍繞着消息的產生和處理展開的,消息是對發生的事件的描述信息。消息通知程序有關事件的發生。一條消息包含有消息的名字、標識、消息發生時的一些參數,以及處理這條消息的函數入口指針。
每當用戶進行某種操做,好比鼠標單擊或鍵盤按鍵,就會觸發相應的事件。而事件是以消息的方式通知Windows應用程序的。一旦應用程序得到某條消息,就根據消息映射表查找相應消息的響應函數的入口地址,調用該函數處理消息,完成用戶預期的功能。
在Windows操做系統中,應用程序主要以窗口的形式存在。窗口是一個可視的人機交互界面,用來接收各類事件,如用戶鍵盤/鼠標事件、外設的請求事件、定時器的請求事件、信號量的請求事件等。所以,它也就成爲應用程序控制消息的發送端和接收端。即Windows應用程序是圍繞窗口進行的,窗口不只提供了可視化的應用程序的界面,也是Windows消息的產生和響應的地方。
消息的產生是因爲相應的事件被觸發;消息的發送以隊列形式進行;消息響應遵循必定的順序。MFC類庫爲這種消息響應機制提供了完整的處理功能。MFC類庫中的不少類都具備處理相應消息的功能。在面向過程的程序設計方式中,對外設,好比鼠標、鍵盤等的控制是經過輪詢方式進行,即分別定時查詢這些設備的輸入請求來完成的。而在Windows環境中,這些控制是經過消息機制完成的。所以,Windows也被稱爲「基於事件驅動的、消息機制的」操做系統。消息機制是Windows能進行多任務併發處理的基礎,它保證了Windows下同時運行的程序可以協同做業。
在Windows中,應用程序都包含一個消息循環。該消息循環持續反覆檢測消息隊列,查看是否有用戶事件消息,這些用戶事件消息包括鼠標移動、單擊、雙擊、鍵盤操做和計時器到達等。
事實上,這些事件首先被Windows系統接收到。當Windows接收到這些事件後,會產生一些相應的描述事件的消息,而且將這些消息分發到相應的應用程序。應用程序接到這些消息後,根據不一樣的消息查詢消息映射,調用其相應的消息響應函數,完成必定的功能與過程。這一系列動做稱之爲消息響應。