VB API 中级入门(二)
时 间:2008-05-06 08:21:41
作 者:UMVSOFT整理 ID:16 城市:江阴
摘 要:VB API 中级入门(二)
正 文:
好了,废话不多说,接前次文章,此次"中级入门"主要是以消息和子类作讲解,顺带我还会介绍一些其它的知识(纯粹是个人的经历而言),Windows 是一个很丰富的平台,它的包函当然不止这些.在 Windows 编程中,如果你的程序有窗口(Window),那么就一定会和消息打交道!
网友提问时间:"那啥叫消息?"
举个例子,当你的程序运行时,假设这时你的程序带有一个窗口,那么此时会先创建窗口,这时会激发 WM_Create 消息,我上篇文章已经说过,在 Windows 系统中,所以的消息常量都是以 WM_ 为开头的,大家可以打开API 浏览器看看就知道了.再假设如果你用鼠标左键点击所创建的窗口,此时会激发 WM_LBUTTONDOWN 消息,在此我来帮大家分析下这些常量为什么会这么写,首先, WM_ 我们不用去管它,因为后面 LBUTTONDOWN 才是关键,如果你E文OK的话应该可以看得出来,咱们把它进行拆分以后就是这样的:L Button Down ,现在应该明白了吧? L 代表的鼠标左键 Left , Button 自然是按钮的意思, Down 表示鼠标按下的意思,既然这样,那么当鼠标松开时,自然会激发 WM_LBUTTONUP (Left Button Up)消息啦.当然,如果是右键点击的话,那么自然同理,WM_RBUTTONDOWN,折分出来就是: Right Button Down.(俺曰:明白否? 答:所有网友沉默中..)有人可能会问到,为什么要采用这种方式去做常量? 答:因为微软中所有的命名风格都是采用匈牙利命名法,大家可以到网上搜搜"关于匈牙利命名法".
接上面,再再假设如果你的程序要退出了,这时你程序肯定会先关闭窗口,释放相关的资源,然后退出,这时窗口会激发 WM_CLOSE 消息,至于这些个E文我都不用解释了吧?
从上面这些来看,在VB中我们窗口,控件等事件,几乎都是以消息驱动来完成的,所以说,如果你想编写好 Windows 窗口程序,对消息的理解不得忽视.在上一篇API 中级入门中,我给大家讲解了如何使用 SendMessage 等API函数给程序发送消息,如果你在前篇文章不明白为什么那么做,那么我将会在下面为你解答.
附注:前段时间有网友发伊妹儿跟我说不太明白 SendMessage 后面两个参数为什么要根据 Msg 而定义,可能前段时间写的不太详细,这里我再仔细的说明下,还是以实例的方法来解答.
附: 怎么分别 SendMessage 后面两个参数应该传什么值.
首先我们来看看 SendMessage 这个API
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
很显然,这是一个发送消息的API,从字面上的意思我们都可以看出,如: Send = 发送的意思, Message = 自然是消息的意思了.我们说过 Windows 窗口程序大部分都是以消息进行处理的,窗口创建时系统就向程序发送 WM_CRATE 创建消息,窗口绘画时系统就给程序发送 WM_PAINT 消息,窗口点击时系统就给程序发送 WM_LBUTTONDOWN 消息,窗口关闭时系统就给程序发送 WM_CLOSE,消毁窗口时系统就会给程序发送 WM_DESTROY 消息,所以说,一个窗口程序是离不开消息的.当然,微软为了能让我们更好的控制窗口,给我们提供了很多窗口操作接口(这里指API),而 SendMessage 就是其中的一个,通过该函数可以向任何有窗口的程序发送任何消息,只要是所接收对象的窗口能处理的消息.
现在再来说说后面两个参数传递的具体定义,可以说它们完全根据 wMsg 参数而定,说到这里可能网友有些糊涂了,怎么根据 wMsg 参数而定?该怎么定义?咳~~大家别急哈,我会帮大家慢慢搞明白的.
首先,还是以一个例子作以说明,假设这里所有的API和常量你已声明:
SendMessage Form1.hWnd, WM_CLOSE, 0, ByVal 0&
看看上面一段代码,它所执行的功能为关闭我们的 Form1 窗口.
第一个参数自然是句柄了,你要给哪个窗口发送消息,你就传递哪个窗口的句柄,这很容易明白是吧?
第二个参数我前面讲过,自然是给某个窗口发送的消息,这里是 WM_CLOSE 关闭消息,说白了就是向一个窗口发送关闭窗口消息.
现在来看看第三个参数,这里有些人可能搞不明白为什么就传0?怎么不传一,二,三或四呢?如果你有这个疑问可以尝试着把该参数换成100, 1000, 10000 都行,你看看会不会起什么作用?我们来看看 MSDN 的说法:
wParam : This parameter is not used.
翻译过来就是:这个参数不被使用. 那为啥不被使用呢?很简单,你给一个窗口发送关闭消息,当接收窗口收到该消息时就会作出退出操作,而这时的窗口关闭只需要接收到 WM_CLOSE 消息即可,所以这时你传递任何值它都会被忽略掉不处理,所以说,你就算换在 1,2,3,4,5,6 我想都不会发生任何作用.
那这里可能就人要问了,那既然不用的话这个参数还有存在下去的必要吗?我的回答是:当然有必要!后面我会给大家解开这个困惑的.
再看看最后一个参数,这里也有网友向我询问过,问为什么要 ByVal 0& 这样传递呢?
首先我们看看当前API的最后声明是怎么样的:
lParam As Any
可以看出 lParam 参数是以 ByRef 方法声明的,说白的这时所传递的值是一个地址,如果我们在参数前面加上 ByVal 的话VB就会默认向该参数以值的方式传递,说白了这时所传递的就是一个值.如果你还不明白什么是地址什么是值,可以到网上查查相关资料.
再看看后面为什么要加个 & ,这个符号在VB中如果以运算方式来看的话,它是一个链接符,用于链接两个字符串.如果以数据类型来看的话,它所代表的含意相当于 Long 变量.大家可以看看下面这个API声明方式:
Public Declare Function SendMessage
Access软件网QQ交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)