首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

深度解析 VC++ 訊息機制(上):MSG 結構與訊息分類

     編輯:VC 教學

什麼是 Windows 訊息?

訊息系統是 Win32 程式運行的核心動力。一個訊息本質上是一個 32 位元值,唯一標識一個事件,通知應用程式發生了特定事情——如滑鼠點擊、視窗縮放、鍵盤輸入等。Windows 將訊息封裝在 MSG 結構中傳遞給應用程式,包含訊息類型與相關資訊(如滑鼠座標)。

typedef struct tagMsg {
    HWND hwnd;        // 接收訊息的視窗控制代碼
    UINT message;     // 訊息常數識別碼(訊息號)
    WPARAM wParam;    // 32 位元附加資訊,含義視訊息而定
    LPARAM lParam;    // 32 位元附加資訊,含義視訊息而定
    DWORD time;       // 訊息建立時間
    POINT pt;         // 訊息建立時滑鼠/游標螢幕座標
} MSG;

訊息來源與結構詳細

訊息產生來源

  • 系統產生:輸入事件(按鍵、滑鼠移動、點擊控制項)、應用程式引發的系統變更(字體變更、視窗大小調整)。
  • 應用程式產生:讓視窗執行任務、與其他程式視窗通訊。

MSG 結構成員解析

  • hwnd:32 位元視窗控制代碼,Win32 為多數可視物件維護控制代碼(視窗、對話框、按鈕、編輯框等)。
  • message:區分訊息的常數值,包含 Windows 預定義常數與自訂常數。視窗程序依此決定處理方式,如 WM_PAINT 通知客戶區需重繪。符號常數前綴標示處理該類訊息的視窗類型。
  • wParam:通常為與訊息相關的常數值,或視窗/控制項控制代碼。
  • lParam:通常為指向記憶體資料的指標。因 WPARAM、LPARAM 與指標皆為 32 位元,三者可互相轉換。

訊息識別碼數值範圍

  • 系統保留:0x0000 ~ 0x03FF (WM_USER-1),應用程式不可使用。
  • 應用程式自訂:WM_USER (0x0400) ~ 0x7FFF,供程式內部使用。
  • 跨程式通訊:0xC000 ~ 0xFFFF,用於應用程式間通訊。

具體範例:WM_NULL (0x0000) 空訊息;0x0001~0x0087 視窗訊息;0x0100~0x0108 鍵盤訊息;0x0200~0x020A 滑鼠訊息;WM_USER (0x0400)、WM_APP (0x8000) 等。

三大訊息類型

1. 視窗訊息

最常見,由作業系統與控制其他視窗的視窗使用。如 CreateWindow、DestroyWindow、MoveWindow 及滑鼠點擊皆屬此類。

2. 命令訊息

特殊視窗訊息,處理從一個視窗傳送到另一視窗的使用者請求。例如按下按鈕會向主視窗發送命令訊息。處理範圍廣泛,不限視窗類,文件類、文件範本類、應用程式類皆可處理。

3. 控制項通知訊息

子控制項發生事件需通知父視窗。僅適用標準控制項(按鈕、清單方塊、編輯框等)及通用控制項(樹狀檢視、清單檢視等)。類似命令訊息但非為處理使用者命令,而是讓主視窗能改變控制項(如載入、顯示資料)。

常見控制項通知訊息對照表

按鈕控制項

  • BN_CLICKED:使用者單擊按鈕
  • BN_DISABLE:按鈕被禁用
  • BN_DOUBLECLICKED:使用者雙擊按鈕
  • BN_HILITE:使用者高亮按鈕
  • BN_PAINT:按鈕需重繪
  • BN_UNHILITE:移除高亮

下拉式方塊控制項

  • CBN_CLOSEUP:清單方塊關閉
  • CBN_DBLCLK:使用者雙擊字串
  • CBN_DROPDOWN:清單方塊展開
  • CBN_EDITCHANGE:使用者修改編輯框文字
  • CBN_EDITUPDATE:編輯框文字即將更新
  • CBN_ERRSPACE:記憶體不足
  • CBN_KILLFOCUS:失去輸入焦點
  • CBN_SELCHANGE:選擇項目變更
  • CBN_SELENDCANCEL:取消選擇
  • CBN_SELENDOK:確認選擇
  • CBN_SETFOCUS:獲得輸入焦點

編輯框控制項

  • EN_CHANGE:文字已更新
  • EN_ERRSPACE:記憶體不足
  • EN_HSCROLL:點擊水平捲軸
  • EN_KILLFOCUS:正在失去焦點
  • EN_MAXTEXT:插入內容被截斷
  • EN_SETFOCUS:獲得輸入焦點
  • EN_UPDATE:文字將要更新
  • EN_VSCROLL:點擊垂直捲軸

清單方塊控制項

  • LBN_DBLCLK:使用者雙擊項目
  • LBN_ERRSPACE:記憶體不足
  • LBN_KILLFOCUS:正在失去焦點
  • LBN_SELCANCEL:選擇被取消
  • LBN_SELCHANGE:選擇了另一項目
  • LBN_SETFOCUS:獲得輸入焦點

(未完待續...)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved