Windows操作系統最大的特點就是其圖形化的操作界面,其圖形化界面是建立在其消息處理機制這個基礎之上的。如果不理解Windows消息處理機制,肯定無法深入的理解Windows編程。可惜很多程序員對Windows消息只是略有所聞,對其使用知之甚少,更不了解其內部實現原理,本文試著一步一步向大家披露我理解的Windows消息機制。可以說,掌握了這一部分知識,就是掌握了Windows編程中的神兵利器,靈活運用它,將會極大的提高我們的編程能力。
Windows窗體是怎樣展現在屏幕上的呢?眾所周知,是通過API繪制實現的。Windows操作系統提供了一系列的API函數來實現界面的繪制功能,例如:
DrawText 繪制文字
DrawEdge 繪制邊框
DrawIcon 繪制圖標
BitBlt 繪制位圖
Rectangle 繪制矩形
…
再復雜的程序界面都是通過這個函數來實現的。
那什麼時候調用這些函數呢?顯然我們需要一個控制中心,用來進行“發號施令”,我們還需要一個命令傳達機制,將命令即時的傳達到目的地。這個控制中心,就是一個動力源,就像一顆心髒,源源不斷地將血液送往各處。這個命令傳達機制就是Windows消息機制,Windows消息就好比是身體中的血液,它是命令傳達的使者。
Windows消息控制中心一般是三層結構,其頂端就是Windows內核。Windows內核維護著一個消息隊列,第二級控制中心從這個消息隊列中獲取屬於自己管轄的消息,後做出處理,有些消息直接處理掉,有些還要發送給下一級窗體(Window)或控件(Control)。第二級控制中心一般是各Windows應用程序的Application對象。第三級控制中心就是Windows窗體對象,每一個窗體都有一個默認的窗體過程,這個過程負責處理各種接收到的消息。
消息是以固定的結構傳送給應用程序的,結構如下:
Public Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
其中hwnd是窗體的句柄,message是一個消息常量,用來表示消息的類型,wParam和lParam都是32位的附加信息,具體表示什麼內容,要視消息的類型而定,time是消息發送的時間,pt是消息發送時鼠標所在的位置。
Windows操作系統中包括以下幾種消息:
1、標准Windows消息:
這種消息以WM_打頭。
2、通知消息
通知消息是針對標准Windows控件的消息。這些控個包括:按鈕(Button)、組合框(ComboBox)、編輯框(TextBox)、列表框(ListBox)、ListView控件、TreevIEw控件、工具條(Toolbar)、菜單(Menu)等。每種消息以不同的字符串打頭。
3、自定義消息
編程人員還可以自定義消息。
不是每個控件都能接收消息,轉發消息和繪制自身,只有具有句柄(handle)的控件才能做到。有句柄的控件本質上都是一個窗體(window),它們可以獨立存在,可以作為其它控件的容器,而沒有句柄的控件,如Label,是不能獨立存在的,只能作為窗口控件的子控件,它不能繪制自身,只能依靠父窗體將它繪制來。
句柄的本質是一個系統自動維護的32位的數值,在整個操作系統的任一時刻,這個數值是唯一的。但該句柄代表的窗體釋放後,句柄也會被釋放,這個數值又可能被其它窗體使用。也就是說,句柄的數值是動態的,它本身只是一個唯一性標識,操作系統通過句柄來識別和查找它所代表的對象。