回 帖 发 新 帖 刷新版面

主题:前面看到一个VB程序,不太懂,麻烦大家解释下

看到一个读取鼠标坐标的程序
作者这样写的:
新建个模块
里面写这个
 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个回复)

沙发

在正是回答你的问题以前,我先说说,上面的内容存在一个问题:[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                         '事件结束

板凳

太谢谢了
那Option Explicit 这句其实是可以省略的对吧

Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
还有这句语句能不能详细解释下呢

3 楼

这是winAPI的声明语句

把它当成一个函数来看待吧~!~(函数名、参数列表、返回值)

4 楼

有意个函数叫做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 楼

[quote]太谢谢了
那Option Explicit 这句其实是可以省略的对吧

Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
还有这句语句能不能详细解释下呢[/quote]

我来作个没有多少技术含量的补充吧,"Option Explicit "最好保留,因为它强制变量声明后才可以使用,可以避免因输入错误造成的难以追查的BUG。后面的那个函数调用是WINDOWS的API,在C可以调,汇编里可以调,当然在VB里也同样可以。

6 楼

老大:
“计时器的计时事件每秒只能发生18次,也就是说,这个属性设置50左右就是最高标准了。”
在前几天一个贴子中也看到过老大的这句话,当时没在意,这次特地到网上查了一下,查到了一篇文章,也是这么说的:“Timer控件是基于Windows消息WM_TIME的时钟脉冲发生器,系统每秒生成18个时钟信号,所以即使用毫秒衡量Interval属性,间隔的实际精度不会超过1/18秒,换句话说,Timer控件能够精确设置的最短时间是65.6毫秒”
我马上做了一个试验:让一个窗体从屏幕右外方水平移到屏幕左外方,INTERVAL属性分别设置为50和10,可以看到设置为10的明显比设为50的要快许多。
是不是“计时器的计时事件每秒只能发生18次”是VB5以前的现象?提出这点与老大商榷。

7 楼

Public Type POINTAPI           '定义一个变量类型
不算变量把!~

我来回复

您尚未登录,请登录后再回复。点此登录或注册