1.1API與SDK
API:Application Programming Interface
SDK:Software Development Kit
1.2視窗與控制代碼
一個Windows應用程式至少要有一個視窗,稱為主視窗。
一個應用程式視窗通常都包含標題列、功能表列、系統功能表、最大最小化框、可調邊框、及捲軸。
視窗分為客戶區和非客戶區。
在Windows應用程式中,視窗是通過視窗控制代碼(HWND)來標識的。控制代碼(HANDLE)。
1.3訊息與訊息佇列
Windows程式設計是一種事件驅動方式的程式設計模式,主要是基於訊息的。
在Windows程式中,訊息是由MSG結構體來表示的。
typedf struct tagMSG{
HWND hwnd;//成員變數hwnd表示訊息所屬視窗
UINT message;//成員變數message指定了訊息的標識符
WPARAM wParam;//用於指定訊息的附加訊息
LPARAM lParam;//用於指定訊息的附加訊息
DWORD time;//訊息投遞到訊息佇列中的時間
POINT pt;//滑鼠當前位置
}MSG;
每一個Windows程式開始執行後,系統都會為該程式建立一個訊息佇列,這個訊息佇列用來存放該程式建立的視窗的訊息。
Windows程式中的訊息可以分為“進隊訊息”和“不進隊訊息”。
進隊的訊息由系統放入到應用程式的訊息佇列中,然後由應用程式取出並發送。
不進隊訊息在系統調用視窗過程時直接發送給視窗。
不論進隊與否,訊息最終都由系統調用視窗過程函數對訊息進行處理。
1.4WinMain函數
WinMain函數是Windows程式的入口函數,當WinMain函數結束或返回時,Windows應用程式結束。
int WINAPI WinMain(
HINSTANCE hInstance,//程式當前啟動並執行執行個體的控制代碼,這是一個數值
HINSTANCE hPrevInstance,//當前執行個體的前一個執行個體的控制代碼
LPSTR lpCmdLine,//指定傳遞給應用程式的命令列參數
int nCmdShow//指定視窗的顯示方式
);
視窗的建立:1.設計視窗;2.註冊視窗;3.建立視窗;4.顯示視窗
設計視窗,Windows已經為我們定義好一個視窗應該具有的基本屬性,我們只需要將要填充的部分填好視窗就設計好了。視窗的特徵是通過結構體
WNDCLASS來定義的。
typedef structure _WNDCLASS{
UINT style;//指定這一類型視窗的樣式
WNDPROC lpfnWndProc;//函數指標,指向視窗過程函數
int cbClsExtra;//Windows為系統中的每一個視窗類別管理一個WNDCLASS結構
int cbWndExtra;//視窗附加記憶體
HANDLE hInstance;//指定包含視窗過程的程式的執行個體控制代碼
HICON hIcon;//指定視窗類別的表徵圖控制代碼
HCURSOR hCursor;//指定視窗類別的游標控制代碼
HBRUSH hbrBackground;//指定視窗類別的背景畫刷控制代碼
LPCTSTR lpszMenuName;//一個以空終止的字串,指定菜單資源的名字
LPCTSTR lpszClassName;//一個以空終止的字串,指定視窗類別的名字
}WNDCLASS;
註冊視窗,視窗類別(WNDCLASS)設計完後,需要調用RegisterClass函數進行註冊。
ATOM RegisterClass(CONST WNDCLASS *lpWndClass);//*lpWndClass即視窗類別對象的指標
建立視窗,設計並註冊好視窗類別之後,就可以用CreateWindow函數產生這種類型視窗。
HWND CreateWindow(
LPCTSTR lpClassName,//指定視窗類別的名稱
LPCTSTR lpWindowName,//指定視窗的名字
DWORD dwStyle,//指定建立的視窗的樣式
int x,//視窗左上方的x座標
int y,//視窗左上方的y座標
int nWidth,//視窗的寬度
int nHeight,//視窗的高度
HWND hWndParent,//指定被建立視窗的父視窗控制代碼
HMENU hMenu,//指定視窗菜單的控制代碼
HANDLE hInstance,//指定視窗所屬應用程式執行個體的控制代碼
LPVOID lpParam//作為WM_CREATE訊息的附加參數lParam傳入的資料指標
);
顯示視窗,調用函數ShowWindow來顯示視窗
BOOL ShowWindow(
HWND hWnd,//成功建立視窗後返回的視窗控制代碼
int nCmdShow//視窗的顯示狀態
);
更新視窗,調用ShowWindow函數後,我們調用UpdateWindow來重新整理視窗
BOOL UpdateWindow(
HWND hWnd//建立成功後的視窗控制代碼
)
訊息迴圈,在建立視窗、顯示視窗、更新視窗後,我們需要編寫一個訊息迴圈,不斷的從訊息佇列中取出訊息並響應。
從訊息佇列中取出訊息,我們調用GetMessage()函數
BOOL GetMessage(
LPMSG lpMsg,//指向一個訊息(MSG)結構體,GetMessage從線程的訊息佇列中取出的訊息資訊將儲存在該結構體對象中
HWND hWnd,//指定接受屬於哪一個視窗的訊息
UINT wMsgFilterMin,//指定要擷取的訊息的最小值
UINTwMsgFiletermax//指定要擷取的訊息的最大值,若min和max都設定為0,則接收所有訊息
);
GetMessage函數接收到除WM_QUIT外的訊息均返回非零值。
對於WM_QUIT訊息,該函數返回零。
如果出現了錯誤,返回-1
Windows應用程式訊息處理機制:(1)作業系統接受到應用程式的視窗訊息,將訊息投遞到該應用程式的訊息佇列中。(2)應用程式在訊息迴圈中調用
GetMessage函數從訊息佇列中取出一條一條的訊息。取出訊息後,應用程式可以對訊息進行一些預先處理,例如放棄對某些訊息的響應,或者調用
TranslateMessage產生新的訊息。(3)應用程式調用DispatchMessage,將訊息回傳給作業系統。(4)系統利用WNDCLASS結構體的lpfnWndProc成員
儲存的視窗過程函數的指標調用視窗過程,對訊息進行處理。
視窗過程函數,用於處理髮送給視窗的訊息。一個Windows應用程式的主要代碼部分就集中在視窗過程函數中。
LRESULT CALLBACK WindowProc(
HWND hwnd,//訊息的視窗控制代碼
UINT uMsg,//訊息代碼
WPARAM wParam,//訊息代碼的附加參數
LPARAM lParam//訊息代碼的附加參數
);