主题:前面看到一个VB程序,不太懂,麻烦大家解释下
笑十三狼
[专家分:1040] 发布于 2008-01-26 17:39:00
看到一个读取鼠标坐标的程序
作者这样写的:
新建个模块
里面写这个
Option Explicit
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
x As Long
y As Long
End Type
然后添加个窗体
再添一个计时器(INTERVAL属性为1)和一个标签
通用里输入
Option Explicit
Dim pos As POINTAPI
在计时器里输入
GetCursorPos pos
Label1.Caption = "当前鼠标的坐标:(" & pos.x & "," & pos.y & ")"
然后运行就好了
这里的模块是什么东西,翻了下我们的教科书,里面没提到这个模块,作者的这个模块又是什么意思呢,如果可以的话,一句一句解释下好吗?
回复列表 (共7个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-01-26 18:38:00
在正是回答你的问题以前,我先说说,上面的内容存在一个问题:[quote]再添一个计时器(INTERVAL属性为1)和一个标签[/quote]计时器的计时事件每秒只能发生18次,也就是说,这个属性设置50左右就是最高标准了。
再说,就算每毫秒标签内容更新一次,又有谁能看得清?所以一般多采用100毫秒。精密点的用50毫秒。
好了,下面说你的问题。
所谓的模块,在vb里(别的语言里是否这样,我不知道)主要指可以供个窗体自由调用的公共声明、公共过程、公共函数。
至于语句的理解,和窗体里的语句是一模一样的。
Option Explicit '模块里所有变量必须先声明后使用,防止拼写错误。
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
'上行是一个声明,说正文里要引用系统函数GetCursorPos
Public Type POINTAPI '定义一个变量类型
x As Long '这个变量第一部分(元素)是长整形
y As Long '这个变量第二部分(元素)是长整形
End Type '定义结束
窗体里:
Option Explicit '窗体里所有变量必须先声明后使用,防止拼写错误。
Dim pos As POINTAPI '声明pos是一个模块里定义的变量
privat sub timer1_timer() '计时器的时间到了
GetCursorPos pos
'调用一次模块里声明过的那个系统函数,这个函数可以返回一个pos变量的值(包括两个元素)
Label1.Caption = "当前鼠标的坐标:(" & pos.x & "," & pos.y & ")"
'把从系统函数取得的变量的两个元素和固定字符组成字符串,写到标签上
end sub '事件结束
板凳
笑十三狼 [专家分:1040] 发布于 2008-01-26 19:23:00
太谢谢了
那Option Explicit 这句其实是可以省略的对吧
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
还有这句语句能不能详细解释下呢
3 楼
merry05 [专家分:8920] 发布于 2008-01-26 19:27:00
这是winAPI的声明语句
把它当成一个函数来看待吧~!~(函数名、参数列表、返回值)
4 楼
老大徒伤悲 [专家分:29120] 发布于 2008-01-26 19:43:00
有意个函数叫做GetCursorPos,但它不是vb本身的“库函数”,而是windows的函数。
这个声明,告诉vb,程序要使用这个函数,这个函数的位置在windows的user32里面。
这个函数的值是一个长整形值。
如果不声明,或者声明错误,vb找不到这个函数,正文里引用,就会出错。
实际上,你把它理解为别人编制好的函数,就行了。
这个函数的参数、函数值等的意义如下:
GetCursorPos:
VB声明:Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
说明: 获取鼠标指针的当前位置
返回值:Long,非零表示成功,零表示失败。会设置GetLastError
参数: lpPoint;类型:POINTAPI;说明:随同指针在屏幕像素坐标中的位置载入的一个结构
5 楼
我是大喊三 [专家分:3010] 发布于 2008-01-26 22:24:00
[quote]太谢谢了
那Option Explicit 这句其实是可以省略的对吧
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
还有这句语句能不能详细解释下呢[/quote]
我来作个没有多少技术含量的补充吧,"Option Explicit "最好保留,因为它强制变量声明后才可以使用,可以避免因输入错误造成的难以追查的BUG。后面的那个函数调用是WINDOWS的API,在C可以调,汇编里可以调,当然在VB里也同样可以。
6 楼
一江秋水 [专家分:9680] 发布于 2008-01-27 09:52:00
老大:
“计时器的计时事件每秒只能发生18次,也就是说,这个属性设置50左右就是最高标准了。”
在前几天一个贴子中也看到过老大的这句话,当时没在意,这次特地到网上查了一下,查到了一篇文章,也是这么说的:“Timer控件是基于Windows消息WM_TIME的时钟脉冲发生器,系统每秒生成18个时钟信号,所以即使用毫秒衡量Interval属性,间隔的实际精度不会超过1/18秒,换句话说,Timer控件能够精确设置的最短时间是65.6毫秒”
我马上做了一个试验:让一个窗体从屏幕右外方水平移到屏幕左外方,INTERVAL属性分别设置为50和10,可以看到设置为10的明显比设为50的要快许多。
是不是“计时器的计时事件每秒只能发生18次”是VB5以前的现象?提出这点与老大商榷。
7 楼
bcahzvip [专家分:6040] 发布于 2008-01-27 09:58:00
Public Type POINTAPI '定义一个变量类型
不算变量把!~
我来回复