LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM
wParam,LPARAMIParam);
函數功能, CallWindowProc將指定訊息資訊傳送給指定的視窗過程. lpPrevWndFunc是視窗訊息處理函數指標(函數名),
hWnd為接受表單控制代碼.
DefWindowProc(HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam), 是讓Windows的預設訊息處理函數處理訊息.
函數功能:該函數調用預設的視窗過程來為應用程式沒有處理的任何視窗訊息提供預設的處理。該函數確保每一個訊息得到處理。調用DefWindowProc函數時使用視窗過程接收的相同參數。
二者關鍵的區別有, CallWindowProc 是發送某個訊息給某個處理函數(包括自訂訊息處理函數), 而DefWindowProc 是發送某個訊息給Windows預設(內定)的訊息處理函數.
如果理解了他們這一點的區別, 就能明白,
CalWindowPro(DefWindowProc, hWnd,Msg,wParam, lParam) 和
DefWindowProc(hWnd,Msg ,wParam,lParam);二者此時執行效果一樣
在Windows作業系統裡,當視窗顯示之後,它就可以接收到系統源源不斷地發過來的訊息,然後視窗就需要處理這些訊息,因此就需要一個函數來處理這些訊息。在API裡定義了一個函數為回呼函數,當系統需要向視窗發送訊息時,就會調用視窗給出的回呼函數WindowProc,如果WindowProc函數不處理這個訊息,就可以把它轉向DefWindowProc函數來處理,這是系統的預設訊息處理函數。當你按下菜單,或者點擊視窗時,視窗需要運行這個訊息處理函數。
函數WindowProc聲明如下:
LRESULT CALLBACK WindowProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
hwnd是當前視窗的控制代碼。
uMsg是系統發過來的訊息。
wParam是訊息參數。
lParam是訊息參數。
這個函數一定是靜態函數,也就是全域函數,在編譯時間已經確定了地址。由於它需要設定在註冊的視窗類別型裡,如下:
#008 ATOM MyRegisterClass(HINSTANCE hInstance)
#009 {
#010 WNDCLASSEX wcex;
#011
#012 wcex.cbSize = sizeof(WNDCLASSEX);
#013
#014 wcex.style = CS_HREDRAW | CS_VREDRAW;
#015 wcex.lpfnWndProc = WndProc;
第15行就是設定視窗的訊息處理函數。
函數DefWindowProc聲明如下:
LRESULT DefWindowProc( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
這個函數參數跟上面那個函數是一樣的。
只不過,它是處理所有預設的訊息。
調用這兩個函數的執行個體如下:
#001 //
#002 // 函數: WndProc(HWND, UINT, WPARAM, LPARAM)
#003 //
#004 // 目的: 處理主視窗的訊息.
#005 //
#006 // 蔡軍生 2007/07/12
#007 //
#008 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
#009 {
#010 int wmId, wmEvent;
#011 PAINTSTRUCT ps;
#012 HDC hdc;
#013
#014 switch (message)
#015 {
#016 case WM_COMMAND:
#017 wmId = LOWORD(wParam);
#018 wmEvent = HIWORD(wParam);
#019 // 菜單選項命令響應:
#020 switch (wmId)
#021 {
#022 case IDM_ABOUT:
#023 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
#024 break;
#025 case IDM_EXIT:
#026 DestroyWindow(hWnd);
#027 break;
#028 default:
#029 return DefWindowProc(hWnd, message, wParam, lParam);
#030 }
#031 break;
#032 case WM_PAINT:
#033 hdc = BeginPaint(hWnd, &ps);
#034 //
#035 EndPaint(hWnd, &ps);
#036 break;
#037 case WM_DESTROY:
#038 PostQuitMessage(0);
#039 break;
#040 default:
#041 return DefWindowProc(hWnd, message, wParam, lParam);
#042 }
#043 return 0;
#044 }
第8行定義訊息處理函數
第14行開始根據不同的訊息作處理。
第29行和第41行都是調用DefWindowProc函數來處理未處理的訊息。
有了視窗訊息處理函數,就可以響應不同的訊息,實現各種各樣的功能。