天天看點

對視窗過程函數WndProc()的一點了解

函數原型:

         LRESULTCALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

         視窗過程函數決定了當一個視窗從外界接收到不同的資訊時,所采取的不同反應,即主要用于處理發送給視窗的資訊。hwnd是要處理視窗的句柄;message是消息ID,代表了不同的消息類型;wParam和lParam代表了消息的附加資訊,附加資訊會随着消息類型的不同而不同。

         當鍵盤消息發出時,wParam的值為按下按鍵的虛拟鍵碼,lParam則存儲按鍵的相關狀态資訊。是以,如果視窗對傳入的鍵盤消息處理時,隻需要判斷wParam的值即可。

         當滑鼠消息發出時,wParam值為滑鼠按鍵的資訊,而lParam則儲存滑鼠的坐标,高位元組代表y坐标,低位元組代表x坐标。即g_y =HIWORD(lParam), g_x = LOWORD(lParam)

         常見視窗過程函數架構如下:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)	//根據不同的消息類型進行不同的處理
	{
		case WM_PAINT:	//若是客戶區重繪消息
			Window_Paint();	//調用視窗繪制函數
			ValidateRect(hwnd, NULL);	//更新客戶區的顯示,使無效區域變有效
			break;

		case WM_KEYDOWN:	//若是鍵盤按下消息
			if(wParam == VK_ESCAPE)	//若是ESC鍵
				DestroyWindow(hwnd);	//摧毀視窗并發送一條WM_DESTROY消息
			break;

		case WM_DESTROY:	//若是視窗摧毀消息
			Window_CleanUp();	//先調用資源清理函數清理掉預先的資源
			PostQuitMessage(0);	//向系統表明有個線程有終止請求,用來響應WM_DESTROY消息
			break;
	
	        default:
		        return DefWindowProc(hwnd, message, wParam, lParam);	//調用預設視窗過程為應用程式沒有處理的視窗消息提供預設的處理
        }
        return 0;
}