VB 版 (精华区)

发信人: zxfsnow (别怕我伤心), 信区: VB
标  题: 针对API编程初学者的教程第四篇
发信站: 哈工大紫丁香 (2000年05月31日12:18:04 星期三), 转信

发信人: Keri (呵呵2000), 信区: VB
标  题: 针对API编程初学者的教程第四篇
发信站: 虎踞龙蟠 (Fri Mar 31 09:28:56 2000), 转信

回调(CallBacks)
所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定
数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会
调用你定义的函数,处理参数,并给你返回值.
回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明
:
Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lPa
ram 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"(B
yVal 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 L
ong, ByVal lParam As Long) As Long
第一个参数指定窗口的句柄,第二个参数是消息的标识符(如WM_COMMAND或WM_MOUSEMOVE
),wParam和lParam时两个32位的数值,它们的意义依赖于消息的类型.


--
不写了,没什么可说的了.....

※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.7.200]

--
-                          KeriKeriKeriKeriKeri
                          拥                  拒
                          有   不敢奢望太多   绝
                          友   只想珍惜现在   爱
                          情                  情
                           KeriKeriKeriKeriKeri


--

 以科计为本,以产业报国!
  超越自我,飞跃无限!
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.321毫秒