深度解析VC中的訊息(上) (轉)

worldblog發表於2008-01-21
深度解析VC中的訊息(上) (轉)[@more@]

  摘要:和Dos程式設計,一個很大的區別就是,windows程式設計是事件,訊息傳遞的。所以,要做好windows程式設計,必須對訊息機制有一個清楚的認識,本文希望能夠對訊息的傳遞做一個全面的論述,由於小生初學VC,裡面可能有一些錯誤的地方,還往各位大蝦批評、指正。

  訊息是指什麼?
  訊息對於一個來說十分重要,它是一個程式執行的動力源泉。一個訊息,是系統定義的一個32位的值,他唯一的定義了一個事件,向Windows發出一個通知,告訴應用程式某個事情發生了。例如,單擊滑鼠、改變視窗尺寸、按下鍵盤上的一個鍵都會使Windows傳送一個訊息給應用程式。
  訊息本身是作為一個記錄傳遞給應用程式的,這個記錄中包含了訊息的型別以及其他資訊。例如,對於單擊滑鼠所產生的訊息來說,這個記錄中包含了單擊滑鼠時的座標。這個記錄型別叫做MSG,MSG含有來自windows應用程式訊息佇列的訊息資訊,它在Windows中宣告如下:
  typedef struct tagMsg
  {
  HWND  hwnd;  接受該訊息的視窗控制程式碼
  UINT  message;  訊息常量識別符號,也就是我們通常所說的訊息號
  WPARAM  wParam;  32位訊息的特定附加資訊,確切含義依賴於訊息值
  LPARAM  lParam;  32位訊息的特定附加資訊,確切含義依賴於訊息值
  D  time;  訊息建立時的時間
  POINT  pt;  訊息建立時的滑鼠/游標在螢幕座標系中的位置
  }MSG;
  訊息可以由系統或者應用程式產生。系統在發生輸入事件時產生訊息。舉個例子, 當敲鍵, 移動滑鼠或者單擊。系統也產生訊息以響應由應用程式帶來的變化, 比如應用程式改變系統字型改變窗體大小。應用程式可以產生訊息使窗體任務,或者與其他應用程式中的視窗通訊。

  訊息中有什麼?
  我們給出了上面的註釋,是不是會對訊息結構有了一個比較清楚的認識?如果還沒有,那麼我們再試著給出下面的解釋:
  hwnd 32位的視窗控制程式碼。視窗可以是任何型別的螢幕,因為Win32能夠維護大多數可視物件的控制程式碼(視窗、對話方塊、按鈕、編輯框等)。
  message用於區別其他訊息的常量值,這些常量可以是Windows單元中預定義的常量,也可以是自定義的常量。訊息識別符號以常量命名的方式指出訊息的含義。當視窗過程接收到訊息之後,他就會使用訊息識別符號來決定如何處理訊息。例如、WM_PAINT告訴視窗過程窗體客戶區被改變了需要重繪。符號常量指定系統訊息屬於的類別,其字首指明瞭處理解釋訊息的窗體的型別。
  wParam 通常是一個與訊息有關的常量值,也可能是視窗或控制元件的控制程式碼。
  lParam 通常是一個指向中資料的指標。由於WParam、lParam和Pointer都是32位的,因此,它們之間可以相互轉換。

  訊息識別符號的值
  系統保留訊息識別符號的值在0x0000在0x03ff(WM_USER-1)範圍。這些值被系統定義訊息使用。 應用程式不能使用這些值給自己的訊息。應用程式訊息從WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF範圍的訊息由應用程式自己使用;0XC000到0XFFFF範圍的訊息用來和其他應用程式通訊,我們順便說一下具有標誌性的訊息值:
  WM_NULL---0x0000  空訊息。
  0x0001----0x0087  主要是視窗訊息。
  0x00A0----0x00A9  非客戶區訊息
  0x0100----0x0108  鍵盤訊息
  0x0111----0x0126  選單訊息
  0x0132----0x0138  顏色控制訊息
  0x0200----0x020A  滑鼠訊息
  0x0211----0x0213  選單迴圈訊息
  0x0220----0x0230  多文件訊息
  0x03E0----0x03E8  DDE訊息
  0x0400  WM_USER
  0x8000  WM_APP
  0x0400----0x7FFF  應用程式自定義私有訊息

  訊息有哪幾種?
  其實,windows中的訊息雖然很多,但是種類並不繁雜,大體上有3種:視窗訊息、命令訊息和控制元件通知訊息。
  視窗訊息大概是系統中最為常見的訊息,它是指由和控制其他視窗的視窗所使用的訊息。例如CreateWindow、DestroyWindow和MoveWindow等都會激發視窗訊息,還有我們在上面談到的單擊滑鼠所產生的訊息也是一種視窗訊息。
  命令訊息,這是一種特殊的視窗訊息,他用來處理從一個視窗傳送到另一個視窗的使用者請求,例如按下一個按鈕,他就會向主視窗傳送一個命令訊息。
  控制元件通知訊息,是指這樣一種訊息,一個視窗內的子控制元件發生了一些事情,需要通知父視窗。通知訊息只適用於標準的視窗控制元件如按鈕、列表框、組合框、編輯框,以及Windows公共控制元件如樹狀檢視、列表檢視等。例如,單擊或雙擊一個控制元件、在控制元件中選擇部分文字、操作控制元件的捲軸都會產生通知訊息。 她類似於命令訊息,當使用者與控制元件視窗互動時,那麼控制元件通知訊息就會從控制元件視窗傳送到它的主視窗。但是這種訊息的存在並不是為了處理使用者命令,而是為了讓主視窗能夠改變控制元件,例如載入、顯示資料。例如按下一個按鈕,他向父視窗傳送的訊息也可以看作是一個控制元件通知訊息;單擊滑鼠所產生的訊息可以由主視窗直接處理,然後交給控制元件視窗處理。
  其中視窗訊息及控制元件通知訊息主要由視窗類即直接或間接由CWND類派生類處理。相對視窗訊息及控制元件通知訊息而言,命令訊息的處理物件範圍就廣得多,它不僅可以由視窗類處理,還可以由文件類,文件模板類及應用類所處理。
  由於控制元件通知訊息很重要的,人們用的也比較多,但是具體的含義往往令初學者暈頭轉向,所以我決定把常見的幾個列出來供大家參考:
  按扭控制元件
   BN_CLICKED  使用者單擊了按鈕
 BN_DISABLE 按鈕被禁止
 BN_DOUBLECLICKED  使用者雙擊了按鈕
 BN_HILITE  用/戶加亮了按鈕
 BN_PAINT 按鈕應當重畫
 BN_UNHILITE 加亮應當去掉
  組合框控制元件
 CBN_CLOSEUP 組合框的列表框被關閉
 CBN_LCLK 使用者雙擊了一個字串
 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 列表框獲得輸入焦點

未完(待續...)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997956/,如需轉載,請註明出處,否則將追究法律責任。

相關文章