1. 程式人生 > 實用技巧 >windows程式設計——訊息機制

windows程式設計——訊息機制

為什麼會想學習windows程式設計呢?因為目前為止我的所有程式都是在windows平臺下面執行的。為什麼不學習呢?
今天我想記錄一下自己對windows訊息機制的理解。
之前我學習的C/C++程式設計,程式執行都是按照我們的嚴格按照我們編寫的程式碼一步一步執行的。
但是windows程式設計** 訊息處理 **就明顯不是在入口函式裡面我們來呼叫。這裡的區別我們僅僅從程式碼上面就可以看出來。
我們除了在初始化WNDCLASS例項的時候以及在進行訊息迴圈的時候,出現過感覺可以和訊息處理函式相關的程式碼,

  wndClass.lpfnWndProc=WndProc;

  While(GetMessage(&msg,NULL,0,0))
  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
  }

  整個WInMain()裡面我們我們就沒有關於整個訊息處理的相關程式碼。那我們不呼叫,那誰來呼叫呢?
  這個當然不是玄學,Windows除了咱們的使用者模式,還有作業系統模式。如果不是我們自己呼叫,那麼只有是<span style="color:red">作業系統自己在呼叫訊息處理函式</span>。
  理解好了這個到底“誰呼叫誰”的關係後,訊息機制咱們也算理解得差不多了。

  接下來我們進行更加詳細的討論:
  1、我們先對訊息結構進行一個簡單的理解。
  MSG在Windows中宣告如下: 
  typedef struct tagMsg 
  { 
        HWND hwnd;          // 接受該訊息的視窗控制代碼 
        UINT message;         // 訊息常量識別符號,也就是我們通常所說的訊息號 
        WPARAM wParam;     // 32位訊息的特定附加資訊,確切含義依賴於訊息值 
        LPARAM lParam;       // 32位訊息的特定附加資訊,確切含義依賴於訊息值 
        DWORD time;         // 訊息建立時的時間 
        POINT pt;             // 訊息建立時的滑鼠/游標在螢幕座標系中的位置 
  }MSG;  
  現在我們沒有完全理解這些引數的意義,但是我們在使用windows系統的時候我們明顯會有疑問,為什麼windows知道我們操作的是哪一個視窗?MSG裡面我們明顯看到了POINT這個引數,顯然,windows在判斷使用者相關視窗操作的時候,訊息產生的位置是一個重要的參考資訊。
  在WinMain()裡面:

  While(GetMessage(&msg,NULL,0,0))
  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);

  僅僅只有在發生WM_QUIT訊息產生的時候,GetMessage()函式才會返回0。才會停止訊息迴圈。所以我們可以把它當成一個死迴圈。
  DisPatchMessage()會把我們翻譯過來的訊息,分發到我們應用程式裡面。同時作業系統會呼叫相應視窗的回撥函式。