CallWindowProc與DefWindowProc的區別

來源:互聯網
上載者:User

 

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函數來處理未處理的訊息。

有了視窗訊息處理函數,就可以響應不同的訊息,實現各種各樣的功能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.