當(dāng)用戶單擊鼠標(biāo)、改變窗口大小或者按下鍵盤上的一個(gè)鍵等用戶動作時(shí),會觸發(fā)點(diǎn)擊,按鍵等事件,而windows系統(tǒng)把這些事件轉(zhuǎn)化為特定的消息,并放置在應(yīng)用程序的消息列隊(duì)中(windows為當(dāng)前運(yùn)行的每一個(gè)windows程序維護(hù)了一個(gè)消息列隊(duì))等待應(yīng)用程序的處理,而應(yīng)用程序不斷從消息列隊(duì)中取出消息,并進(jìn)行響應(yīng)。所以說windows是基于消息的事件驅(qū)動模式。
按照一般寫程序的思維而言,我們希望傳給函數(shù)正確的參數(shù)來調(diào)用這個(gè)函數(shù)。而windows消息可以理解為指定了的函數(shù)的參數(shù),例如:用戶需要關(guān)閉某個(gè)窗口,點(diǎn)擊了右上角的X后,windows便把這個(gè)行為轉(zhuǎn)換為消息加入消息列隊(duì),而這個(gè)消息可能包含了“需要關(guān)閉的是哪一個(gè)窗口(窗口句柄)”,“關(guān)閉窗口的信息”這樣的參數(shù),應(yīng)用程序從消息列隊(duì)中讀取到了這個(gè)消息,并把它交給“關(guān)閉窗口”這個(gè)函數(shù)來進(jìn)行處理,而這個(gè)函數(shù)就叫做“窗口過程”,這樣聽起來不好理解,可以加長的理解為“處理窗口消息的函數(shù)過程”。
而如果沒有對應(yīng)的函數(shù)來處理這個(gè)消息呢?例如,拖動窗口。為此,windows會用默認(rèn)的消息處理函數(shù)(DefWindowProc)來進(jìn)行處理.
消息結(jié)構(gòu)體長這樣
typedef struct tagMSG { HWND hwnd; //消息句柄,理解為窗口的唯一標(biāo)志 UINT message; //消息類型,分為windows消息和用戶自己定義的消息 WPARAM wParam; //消息附加參數(shù) LPARAM lParam; //消息附加參數(shù) DWORD time; //消息產(chǎn)生時(shí)間愛你 POINT pt; //消息被發(fā)送時(shí)的光標(biāo)位置 } MSG;
異步執(zhí)行,發(fā)送到消息列隊(duì)后立即返回?zé)o序等待。
應(yīng)用程序一般是投遞一個(gè)消息來通知指定窗口完成某個(gè)任務(wù)
BOOL PostMessage( HWND hWnd, //目標(biāo)窗口句柄 UINT Msg, //消息類型 WPARAM wParam, //第一個(gè)消息參數(shù) LPARAM lParam //第二個(gè)消息參數(shù));
同步執(zhí)行,需要等到消息的返回碼之后在繼續(xù)。
基本上所有的輸入類消息,都是以投遞的方式抵達(dá)應(yīng)用的,而其他的消息,則大部分是采取了發(fā)送方式。
LRESULT SendMessage( HWND hWnd, //接收消息的目標(biāo)窗口 UINT Msg, //消息類型 WPARAM wParam, //第一個(gè)消息參數(shù) LPARAM lParam //第二個(gè)消息參數(shù));
while(GetMessage (&msg, NULL, 0, 0)) //消息循環(huán),不斷從消息列隊(duì)取出消息
{
TranslateMessage (&msg) ; //翻譯鍵盤消息
DispatchMessage (&msg) ; //把消息發(fā)送給窗口過程
}
//消息過程是一個(gè)CALLBACK回調(diào)函數(shù),每處理一個(gè)消息會返回一個(gè)值給windows
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_CREATE:
PlaySound(TEXT('hello.wav'), NULL, SND_FILENAME | SND_ASYNC); //窗口創(chuàng)建的時(shí)候播放音樂
return 0;
case WM_DESTROY:
PostQuitMessage(0); //把退出窗口的消息插入消息列隊(duì)
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam); //默認(rèn)的消息處理函數(shù)
}
本文轉(zhuǎn)自:簡書
微信號:IdeaofSE