天天看點

消息機制

        首先,你必須已經建立了一個視窗。這時,你在這個視窗内點了一下滑鼠左鍵,Windows系統會将這個“消息(或者說事件)”放入到系統消息隊列裡。之後它會自動分辨出這是哪個視窗所接收的消息,并将這個消息放入到該視窗所對應的應用程式消息隊列裡。

         第二,你的應用程式主函數:WinMain()執行到消息循環後,代碼是:

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

GetMessage()函數從應用程式消息隊列裡邊接收“單擊滑鼠左鍵”這一消息,傳回值不為0,是以進入循環體,第二個函數用來轉換某些鍵盤消息,而我們點的是滑鼠,是以在此直接跳過;第三個函數,将該消息發送回Windows。Windows接收到DispatchMessage()函數發送的消息後,它會自動找到應把消息發往的視窗過程。并把消息向其傳遞。之後,進入WndProc函數。你會感到這是“Windows調用了WndProc()”,是以WndProc()才被稱為“回調函數”。

         進入WndProc()之後,通過switch()邏輯檢測接收的資訊并做出相應的處理和操作。例如,單擊滑鼠左鍵,由WndProc()函數掌管的視窗應該進行怎樣的變化……這些東西要我們自己來寫喽。但其中有些東西幾乎是固定的。比如收到WM_DESTROY消息後,一般調用PostQuitMessage(0)發送WM_QUIT消息,用來結束消息循環,

但也不一定,前不久我才寫過一個雙視窗的程式,當關掉一個視窗後,你應當保證另一個視窗不被關閉……

當WndProc()處理完畢後,DispatchMessage()函數才傳回,這時,又要從GetMessage()函數開始新一輪的循環啦