回調(diào)(CallBacks)
所謂回調(diào),就是你自己定義一個(gè)函數(shù),并告訴Windows何時(shí)為何調(diào)用.你可以寫一個(gè)有特定數(shù)量和類型參數(shù)的函數(shù),然后告訴Windows何時(shí)調(diào)用,并傳遞給它所需的參數(shù).Windows就會(huì)調(diào)用你定義的函數(shù),處理參數(shù),并給你返回值.
回調(diào)的一個(gè)典型應(yīng)用是從Windows獲得連續(xù)的數(shù)據(jù)流.這里是一個(gè)需要回調(diào)的函數(shù)的聲明:
Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
第一個(gè)參數(shù)是你的回調(diào)函數(shù)的地址,第二個(gè)參數(shù)是你想傳遞的的任意數(shù)值.該值將被傳遞到你的函數(shù),于是你就知道了它要調(diào)用什么.
VB 5.0已經(jīng)提供了一個(gè)很有用的操作符 AddressOf ,可以得到一個(gè)函數(shù)的地址.當(dāng)你調(diào)用一個(gè)函數(shù)時(shí)它只能用在參數(shù)的前面,下面這種用法是錯(cuò)誤的并且會(huì)導(dǎo)致出錯(cuò):
FuncP = AddressOf MyFunction
因此你必須這樣調(diào)用EnumWindows函數(shù):
Success& = EnumWindows(AddressOf cbFunc, 58&)
你必須也要自己寫回調(diào)函數(shù).問題是有很多不同類別的回調(diào)并且有各種各樣的參數(shù),有關(guān)這些參數(shù)的描述可以在SDK幫助或MS SDK文檔中找到.這里是一個(gè)回調(diào)的聲明:
Function cbFunc (ByVal Hwnd, ByVal lParam) as Long
這里是一個(gè)回調(diào)的例子:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long
Success& = EnumWindows(AddressOf cbFunc, 58&)
Function cbFunc (ByVal Hwnd, ByVal lParam) as Long
If lParam = 58 then ’enum windows
Str$ = Space(255)
Ret& = GetWindowText(Str$, Len(Str$))
Debug.Print Left(Str$, Ret&)
End If
End Function
這個(gè)例子將列出窗口的標(biāo)題,(不包含子窗體)
窗口程序 Windows并不知道事件. 這些是VB特有的隱藏Windows獲取你的窗口發(fā)生事件的真正方法的一種方式.VB很像是一個(gè)將Windows語言翻譯成VB語言的解釋器.
但是事實(shí)并非如此,你很快就會(huì)遇到.設(shè)想你想知道用戶何時(shí)加亮了菜單選項(xiàng)(不是點(diǎn)擊,只是加亮即選擇了)VB并不提供這種事件,但你可能見到其他的程序,但你瀏覽它的菜單時(shí)狀態(tài)欄會(huì)出現(xiàn)相應(yīng)的文字.如果他們能,你為何不能?
OK,這里是大致的真實(shí)情況.每個(gè)窗口都有一個(gè)特殊的程序叫做窗口程序.它實(shí)際上是一個(gè)回調(diào)函數(shù).該函數(shù)將在你的窗口發(fā)生事件的任何時(shí)間發(fā)送消息.這樣當(dāng)用戶加亮一個(gè)菜單項(xiàng)時(shí)就會(huì)發(fā)送一條消息(WM_COMMAND).
那為什么我看不到這條消息呢?這是因?yàn)槭荲B創(chuàng)建窗口程序而不是你.當(dāng)Windows發(fā)送消息時(shí),該程序?qū)橹峙商囟ǖ氖录?并將其參數(shù)轉(zhuǎn)換為比較容易用的事件的參數(shù).但是在有些情況下,它會(huì)忽略有些消息而不能收到真實(shí)的輸入.如果你真的想得到這些消息,你必須對(duì)你的窗體進(jìn)行子類處理,我們將在另外一個(gè)主題中談到.
這里是一個(gè)回調(diào)窗口程序的聲明:
Function
WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
第一個(gè)參數(shù)指定窗口的句柄,第二個(gè)參數(shù)是消息的標(biāo)識(shí)符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam時(shí)兩個(gè)32位的數(shù)值,它們的意義依賴于消息的類型.
------------------------------------------------
(
http://www.cncfan.com提示:作者未知,感謝作者寫出這么好的文檔,特發(fā)布與大家共享,一起學(xué)習(xí)交流,有知道作者的朋友請(qǐng)給出作者地址,發(fā)布到評(píng)論中,核實(shí)后我們后把來源和作者姓名重新編排到文章中。)