VC++深入詳解--之複習筆記(一)
1. API與SDK
Windows作業系統提供給應用程式程式設計的介面(Application Programming Interface簡稱為API函式)。主要的Windows函式都在Windows.h標頭檔案中進行了宣告。
Windows作業系統大約有1000多種API函式,提供的API函式大多是有意義的單詞的組合,每個單詞首字母大寫,如: CreateWindow,從函式的名字上看,它是用來為程式建立一個視窗的。沒有必要死記硬背API函式的呼叫語法和引數資訊,能從MSDN中找到所需的資訊就可以了,使用次數多了,這些函式自然也就記住了。
我們常說Win32 SDK開發,那麼什麼是SDK呢。SDK是Software Development Kit,中文譯為軟體開發包, 即Windows 32位平臺下的軟體開發包,包括了API函式、幫助文件、微軟提供的一些輔助開發工具。如開發呼叫中心,在購買語音卡時,廠商提供語音卡SDK開發包,方便我們對語音卡的程式設計操作。這個開發包會包含語音卡的API函式庫、幫助文件、使用手冊、輔助工具等資源。
提示:API和SDK是一種廣泛使用的專業術語,並沒有專指某一種特定的API和SDK,例如,語音卡API、語音卡SDK、Java API、Java SDK等。
2. 視窗和控制程式碼
視窗,一個Windows應用程式至少要有一個視窗,稱為主視窗。視窗是螢幕上的一塊矩形區域,是Windows應用程式與使用者進行互動的介面。視窗可以有一個父視窗,有父視窗的視窗稱為子視窗。利用視窗,可以接收使用者的輸入,以及顯示輸出。
在應用程式中,視窗是通過視窗控制程式碼(HWND)來標識的。要對某個視窗進行操作,首先要得到這個視窗的控制程式碼(HANDLE)。在Windows程式中,有各種各樣的資源(視窗、圖示、游標等),系統在建立這些資源時會為它們分配記憶體,並返回標識這些資源的標識號,即控制程式碼。例如:圖示控制程式碼(HICON )
3. 訊息和訊息佇列
Windows程式設計是一種事件驅動方式的程式設計模式,主要是基於訊息的。例如,當使用者在視窗中畫圖時,按下左鍵,作業系統會感知這一事件,並將這一事件包裝成一個訊息,投遞到應用程式的訊息佇列中,然後應用程式從訊息佇列中取出訊息並進行響應。在這個處理過程中,作業系統也會給應用程式“傳送訊息”。所謂“傳送訊息”,實際上是作業系統呼叫程式中一個專門負責處理訊息的函式,這個函式稱為視窗過程。
訊息
在Windows程式中,訊息是由MSG結構體來表示的。MSG結構體的定義如下(參見MSDN):
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
第一個成員變數hwnd表示訊息所屬的視窗,一個訊息一般都是與某個視窗相關聯的。例如,在某個視窗中按下滑鼠左鍵,產生的按鍵訊息就是發給該視窗的。
第二個成員變數message指定了訊息的識別符號。訊息是由一個數值來表示的,不同的訊息對應不同的數值。訊息對應的數值定義為WM_XXX巨集(WM是Window Message),XXX對應某種訊息的英文拼寫的大寫。例如,滑鼠左鍵按下訊息是WM_LBUTTONDOWN,鍵盤按下訊息是WM_KEYDOWN,字元訊息是WM_CHAR等。
提示:WM_XXX訊息對應的具體數值,可在VC++開環境中選中WM_XXX,單擊右鍵,彈出選單中選goto definition,即可看到該巨集的定義。
第三、第四個成員變數wParam和lParam,用於指定訊息的附加資訊。
例如,當我們收到一個字元訊息的時候,message成員變數的值就是WM_CHAR,但使用者到底輸入的是什麼字元,那麼就由wParam和lParam來說明。wParam、lParam表示的資訊隨訊息的不同而不同。這兩種型別實際上就是unsigned int和long的巨集定義。
最後兩個變數分別表示訊息投遞到訊息佇列中的時間和滑鼠的當前位置。
訊息佇列
每一個Windows應用程式開始執行後,系統都會為該程式建立一個訊息佇列,這個訊息佇列用來存放該程式建立的視窗的訊息。例如,當按下左鍵時,會產生WM_LBUTTONDOWN訊息,系統會將這個訊息放到視窗所屬的應用程式的訊息佇列中,等待應用程式的處理。Windows將產生的訊息依次放到訊息佇列中,而應用程式則通過一個訊息迴圈不斷地從訊息佇列中取出訊息,並進行響應。
進隊訊息和不進隊訊息
Windows程式中的訊息可以分為“進隊訊息”和“不進隊訊息”。進隊的訊息將由系統放入到應用程式的訊息佇列中,然後由應用程式取出併傳送。不進隊的訊息在系統呼叫視窗過程時直接傳送給視窗。不管是進隊訊息還是不進隊訊息,最終都由系統呼叫視窗過程函式對訊息進行處理。
相關文章
- VC++深入詳解--之複習筆記(二)C++筆記
- VUE複習筆記30(vue-router詳解進階)Vue筆記
- MIT 6.824 學習筆記(一)--- RPC 詳解MIT筆記RPC
- VC++學習筆記---配置檔案(一) ini檔案和propritiesC++筆記
- OCP 複習筆記之PL/SQL (1)筆記SQL
- OCP 複習筆記之PL/SQL (3)筆記SQL
- OCP 複習筆記之PL/SQL (2)筆記SQL
- OCP 複習筆記之PL/SQL (4)筆記SQL
- OCP 複習筆記之PL/SQL (5)筆記SQL
- 【學習筆記】CSS深入理解之margin筆記CSS
- 【學習筆記】CSS深入理解之overflow筆記CSS
- 【學習筆記】CSS深入理解之relative筆記CSS
- Go學習筆記-GMP詳解Go筆記
- git reset 命令詳解(一)—— Git 學習筆記 07Git筆記
- Redis 複習筆記Redis筆記
- MyBatis複習筆記MyBatis筆記
- SpringMVC複習筆記SpringMVC筆記
- Android學習筆記之AndroidManifest.xml檔案解析(詳解)Android筆記XML
- OpenFeign深入學習筆記筆記
- JVM學習筆記(3)---OutOfMemory詳解JVM筆記
- JavaScript之原型深入詳解JavaScript原型
- C++複習筆記C++筆記
- FFT & NTT 複習筆記FFT筆記
- 【學習筆記】CSS深入理解之vertical-align筆記CSS
- 大資料學習筆記之Hadoop安裝步驟詳解大資料筆記Hadoop
- Django筆記三十之log日誌記錄詳解Django筆記
- Nginx變數詳解(學習筆記十九)Nginx變數筆記
- mysql學習筆記-底層原理詳解MySql筆記
- 複習電商筆記-1筆記
- html+css複習筆記HTMLCSS筆記
- 動態dp複習筆記筆記
- 康託の複習筆記筆記
- 深入 Redis 主從複製的原理詳解Redis
- 深入詳解Redis 主從複製的原理!Redis
- 學習筆記 詳解一種高效位反轉演算法筆記演算法
- git checkout 命令詳解—— Git 學習筆記 16Git筆記
- JavaWeb學習筆記_Day03_JavaScript詳解Web筆記JavaScript
- 【opencv學習筆記】027之直方圖反向投影 - calcBackProject函式詳解OpenCV筆記直方圖Project函式