top
Loading...
“回調”(CallBacks)的實現
所謂回調,就是你自己定義一個函數,并告訴Windows何時為何調用。你可以寫一個有特定數量和類型參數的函數,然后告訴Windows何時調用,并傳遞給它所需的參數.Windows就會調用你定義的函數,處理參數,并給你返回值。

回調的一個典型應用是從Windows獲得連續的數據流。這里是一個需要回調的函數的聲明:

Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

第一個參數是你的回調函數的地址,第二個參數是你想傳遞的的任意數值.該值將被傳遞到你的函數,于是你就知道了它要調用什么。

VB 5.0已經提供了一個很有用的操作符 AddressOf,可以得到一個函數的地址.當你調用一個函數時它只能用在參數的前面,下面這種用法是錯誤的并且會導致出錯:

FuncP = AddressOf MyFunction


因此你必須這樣調用EnumWindows函數:

Success& = EnumWindows(AddressOf cbFunc, 58&)

你必須也要自己寫回調函數.問題是有很多不同類別的回調并且有各種各樣的參數,有關這些參數的描述可以在SDK幫助或MS SDK文檔中找到.這里是一個回調的聲明:

Function cbFunc (ByVal Hwnd, ByVal lParam) as Long

這里是一個回調的例子:

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

這個例子將列出窗口的標題,(不包含子窗體)

窗口程序

Windows并不知道事件。 這些是VB特有的隱藏Windows獲取你的窗口發生事件的真正方法的一種方式.VB很像是一個將Windows語言翻譯成VB語言的解釋器。

但是事實并非如此,你很快就會遇到。設想你想知道用戶何時加亮了菜單選項(不是點擊,只是加亮即選擇了)VB并不提供這種事件,但你可能見到其他的程序,但你瀏覽它的菜單時狀態欄會出現相應的文字.如果他們能,你為何不能?

OK,這里是大致的真實情況.每個窗口都有一個特殊的程序叫做窗口程序。它實際上是一個回調函數.該函數將在你的窗口發生事件的任何時間發送消息。這樣當用戶加亮一個菜單項時就會發送一條消息(WM_COMMAND)。

那為什么我看不到這條消息呢?這是因為是VB創建窗口程序而不是你。當Windows發送消息時,該程序將為之分派特定的事件,并將其參數轉換為比較容易用的事件的參數.但是在有些情況下,它會忽略有些消息而不能收到真實的輸入。.如果你真的想得到這些消息,你必須對你的窗體進行子類處理,我們將在另外一個主題中談到。

這里是一個回調窗口程序的聲明:

Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long

第一個參數指定窗口的句柄,第二個參數是消息的標識符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam時兩個32位的數值,它們的意義依賴于消息的類型。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗