深度解析VC中的訊息(上) (轉)
摘要:和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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深度解析VC中的訊息(中) (轉)
- 深度解析VC中的訊息傳遞機制(上)
- 深度解析VC中的訊息傳遞機制(下)
- VC增加自定義訊息 (轉)
- VC++訊息對映的思考 (轉)C++
- VB與VC混合程式設計中處理訊息的方法 (轉)程式設計
- 解析VC++6中的指標 (轉)C++指標
- 深度剖析訊息反射機制 (轉)反射
- 在VC中,讓動態建立的ActiveX控制元件響應Windows訊息。 (轉)控制元件Windows
- VC自定義訊息postmessage用法(訊息響應函式)函式
- 乾貨分享 | 深度解析雲原生訊息佇列 AMQP佇列MQ
- 在VC++ 6.0下利用訊息實現內部程式通訊 (轉)C++
- mfc中的訊息的應用 (轉)
- iOS 訊息轉發機制Demo解析iOS
- 形形色色的自定義訊息(上) (轉)
- 解析 RocketMQ 業務訊息——“事務訊息”MQ
- 解析 RocketMQ 業務訊息--“順序訊息”MQ
- Objective-C中的訊息轉發Object
- Handler訊息處理機制原始碼解析 上原始碼
- Android訊息機制不完全解析(上) .Android
- 用程式碼理解 ObjC 中的傳送訊息和訊息轉發OBJ
- 用程式碼理解ObjC中的傳送訊息和訊息轉發OBJ
- Netty 中的訊息解析和編解碼器Netty
- VCL中訊息處理初探 (轉)
- VC++基礎 判斷鍵盤訊息C++
- 深入解析MFC訊息響應和訊息路由路由
- VC++ 的串列埠通訊 (轉)C++串列埠
- 從網頁上發訊息給ICQ (轉)網頁
- VC的撥號上網程式 (轉)
- 自定義訊息獲取訊息(轉)
- 訊息佇列深入解析佇列
- 關於VC++中,兩種自定義訊息的傳送與接收的方法實現進行說明。 (轉)C++
- Python中執行緒的MQ訊息佇列實現以及訊息佇列的優點解析Python執行緒MQ佇列
- VC++中STL的使用 (轉)C++
- VC++ 串列埠通訊(轉)C++串列埠
- Handler訊息機制完全解析Handler解析
- Android的Handler訊息機制 解析Android
- 解析微信xml訊息使用的jar包XMLJAR