日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MSG结构体和WndProc窗口过程详解

發布時間:2025/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSG结构体和WndProc窗口过程详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MSG結構體和WndProc窗口過程對于Windows編程非常重要,如果不了解它們,可以說就沒有學會Windows編程。

MSG結構體

MSG 結構體用來表示一條消息,各個字段的含義如下:

  • typedef struct tagMSG{
  • HWND hwnd; //窗口句柄
  • UINT message; //消息類型
  • WPARAM wParam; //附加消息1
  • LPARAM lParam; //附加消息2
  • DWORD time; //消息被傳遞時候的時間
  • POINT pt; //消息被傳遞時光標在屏幕上的位置
  • } MSG;
  • 對各個字段的說明:
    1) 最后兩個字段 time 和 pt 一般由系統使用,我們很少用到。

    2) message 為消息類型,也就是以 WM 開頭的消息(WM 是 Window Message 的縮寫 ),例如 WM_CREATE、WM_PAINT、WM_DESTROY、WM_COMMAND 等。

    2) wParam 和 lParam 是要重點說明的,它們都表示附加消息。例如,當收到一個字符消息的時,message 的值為 WM_CHAR,但用戶到底輸入的是什么字符,那么就由 wParam 和 lParam 來說明。wParam、lParam 表示的信息隨消息類型的不同而不同,具體細節可以到MSDN中查看。

    WPARAM 和 LPARAM 這兩種數據類型的定義分別為:

    typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM;

    在現代操作系統中(32位和64位操作系統),它們一般都表示 32 位的整數。

    但在16位操作系統中,WPARAM 表示16位整數,而 LPARAM 表示32位整數,根據匈牙利命名法,16 位的變量通常以W開頭,32 位變量通常以L開頭。升級到32位操作系統后,WPARAM也被擴展到32位,此時 WPARAM 和 LPARAM 的大小完全相同。

    在 Win32 API 的早期,由于還有很多 Win16 API 的軟件,為了保證和 Win16 API 的代碼可移植性,微軟依然保留了 WPARAM 和 LPARAM 兩個宏。

    不過16位系統早已成為歷史,現在你可以認為這兩個參數的長度相同。讀者可以在 VC / VS 中通過 F12 鍵或者“轉到定義”菜單查看。

    wParam 和 lParam 到底表示什么信息

    可以肯定的是,消息類型 message 不同,wParam 和 lParam 兩個字段表示的附加消息一般也不同。那么,它們到底表示什么呢?其實這個真的不一定,沒有什么規律,它們本來就是一個歷史遺留問題,也不知道微軟到底怎么安排的,只能根據不同的消息類型去 MSDN 中查找。

    一般約定,wParam 用來表示控件的ID,或者高 16 位和低 16 位組合起來分別表示鼠標的位置,如果發送消息時需要附帶某種結構的指針或者是某種類型的句柄時,習慣上用 lParam。

    不過這也不一定是對的,例如對于一個鼠標左鍵按下的消息 WM_LBUTTONDOW,就用 lParam 來表示鼠標的坐標:

  • //point 是一個結構體,表示鼠標坐標
  • //msg 表示一條消息
  • point.x = LOWORD( msg.lParam );
  • point.y = HIWORD( msg.lParam );
  • LOWORD 和 HIWORD 都是宏定義:LOWORD 用來取一個 32 位數的低 16 位,HIWORD 用來取一個32 位數的高 16 位。對于?WM_LBUTTONDOW 消息,低 16 位存放的是 x 坐標,而高 16 位存放的是 y 坐標。

    WndProc 窗口過程

    窗口過程一般定義為如下的形式:

  • LRESULT CALLBACK WndProc(
  • HWND hwnd, //窗口句柄
  • UINT message, //消息類型
  • WPARAM wParam, //附加消息1
  • LPARAM lParam //附加消息2
  • ){
  • // TODO
  • }
  • WndProc 的各個參數和 MSG 結構體的前四個字段是一一對應的。需要銘記的是:每產生一條消息,都會調用一次 WndProc 函數。

    當用戶點擊按鈕、編輯框、下拉列表框等控件的時候,會產生WM_COMMAND消息。對于不同來源的 WM_COMMAND 消息,wParam、lParam 參數也不同,見下表:

    消息來源wParam (高16位)wParam (低16位)lParam
    菜單0菜單ID0
    快捷鍵1快捷鍵ID0
    控件控件通知碼控件ID控件句柄


    注意:

    • 上面說的菜單是指窗口標題下方、客戶區上方的下拉菜單,而不是客戶區的下拉列表框控件。
    • 控件通知碼用來識別控件的操作。例如?Button 控件一般有兩種通知碼,BN_CLICKED 和 BN_DOUBLECLICKED,前者表示 Button 被單擊,后者表示 Button 被雙擊。


    對于 Button 控件,我們可以通過LOWORD(wParam)來獲取它的 ID,這就是上節最后一個例子的原理,請參考上節的代碼體會。

    總結

    以上是生活随笔為你收集整理的MSG结构体和WndProc窗口过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。