1. 程式人生 > >面向過程-事件驅動程式設計-訊息機制【VC MFC】

面向過程-事件驅動程式設計-訊息機制【VC MFC】

面向過程的MS-DOS程式設計:

 

傳統的DOS程式都有而且只有一個main函式,可以在main函式中呼叫其它的函式,完成各種各樣的功能和過程。所有函式的呼叫以及執行都是按照使用者預定好的順序進行的。

 

在面向過程的程式中,整個程式按照一定順序進行;它是一系列預先定義好的操作序列的組合,且該過程完全佔用著CPU,控制整個程式執行的過程。

 

 

面向使用者的事件驅動程式設計:

 

當Windows作業系統出現之後,面向過程的程式設計方式已經不能滿足使用者的需求。一方面,隨著程式程式碼量的逐步增大,面向過程程式設計的開發與維護工作也越來越困難;另一方面,面向過程的程式設計方式只能適合於在單任務的作業系統上執行。因此,必須有一種新的程式設計模式,即事件驅動程式設計方式。

 

Windows是一種多工的作業系統,可以同時執行多個程式。每一個程式都不能獨佔系統資源,而是共享各種系統資源,比如CPU和儲存器等。事件驅動程式恰好適合於Windows的多工特點。

 

事件驅動程式設計方式完全不同於面向過程的程式設計方式,它是由事件的產生來驅動的。事件的產生是隨機的、不確定的,沒有預定順序的。因此,各種事件可以以各種不同的、合理的順序出現,那麼,依賴於事件驅動的程式也可以按各種不同的、合理的流程來執行。也正是這一點,使得多個程式共享系統資源成為可能。

 

事件驅動的程式設計是一種面向使用者的程式設計方式。相對於面向過程的程式設計方式來說,事件驅動的程式設計方式是一種被動的程式設計方式。

面向過程的程式需要主動地去查詢使用者操作,並根據使用者操作呼叫相應的處理函式。而事件驅動的程式設計方式是一種被動的程式設計方式。程式總是處於等待使用者輸入事件狀態,然後被動地等待使用者操作;使用者的各種操作被稱之為事件,事件驅動的程式設計方式需要事先為各種需要處理的事件編寫事件響應函式;當某個使用者操作產生,即某個事件發生時,相應的響應函式就會被呼叫。程式取得事件並做出反應,處理完畢並返回後,又處於等待事件狀態。

 

 

Windows訊息機制:

 

 

要更好地使用Visual C++進行Windows程式設計,就需要進一步瞭解其訊息機制。在Windows應用程式中,事件驅動是圍繞著訊息的產生和處理展開的,訊息是對發生的事件的描述資訊。訊息通知程式有關事件的發生。一條訊息包含有訊息的名字、標識、訊息發生時的一些引數,以及處理這條訊息的函式入口指標。

 

每當使用者進行某種操作,比如滑鼠單擊或鍵盤按鍵,就會觸發相應的事件。而事件是以訊息的方式通知Windows應用程式的。一旦應用程式獲得某條訊息,就根據訊息對映表查詢相應訊息的響應函式的入口地址,呼叫該函式處理訊息,完成使用者預期的功能。

 

在Windows作業系統中,應用程式主要以視窗的形式存在。視窗是一個可視的人機互動介面,用來接收各種事件,如使用者鍵盤/滑鼠事件、外設的請求事件、定時器的請求事件、訊號量的請求事件等。因此,它也就成為應用程式控制訊息的傳送端和接收端。即Windows應用程式是圍繞視窗進行的,視窗不僅提供了視覺化的應用程式的介面,也是Windows訊息的產生和響應的地方。

 

訊息的產生是由於相應的事件被觸發;訊息的傳送以佇列形式進行;訊息響應遵循一定的順序。MFC類庫為這種訊息響應機制提供了完整的處理功能。MFC類庫中的很多類都具有處理相應訊息的功能。在面向過程的程式設計方式中,對外設,比如滑鼠、鍵盤等的控制是通過輪詢方式進行,即分別定時查詢這些裝置的輸入請求來完成的。而在Windows環境中,這些控制是通過訊息機制完成的。因此,Windows也被稱為“基於事件驅動的、訊息機制的”作業系統。訊息機制是Windows能進行多工併發處理的基礎,它保證了Windows下同時執行的程式能夠協同作業。

 

在Windows中,應用程式都包含一個訊息迴圈。該訊息迴圈持續反覆檢測訊息佇列,檢視是否有使用者事件訊息,這些使用者事件訊息包括滑鼠移動、單擊、雙擊、鍵盤操作和計時器到達等。

 

事實上,這些事件首先被Windows系統接收到。當Windows接收到這些事件後,會產生一些相應的描述事件的訊息,並且將這些訊息分發到相應的應用程式。應用程式接到這些訊息後,根據不同的訊息查詢訊息對映,呼叫其相應的訊息響應函式,完成一定的功能與過程。這一系列動作稱之為訊息響應。