今天在用VB写一个小程序,需要获取鼠标的当前位置,该怎么写呢?
随便看看vb中的一个函数的声明:
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
其实在这个声明中X就是当前的X坐标,Y就是当前的Y坐标,如果要用的话,直接拿来用的就好。不过这里的坐标是以Form为坐标系的,就是Form的左上角是(0,0),如果在别的控件的函数,这里的坐标都是相对该控件的左上角而言的啊。
当然了,不是所有的函数声明中都会有X和Y的声明,如果我们想获得当前鼠标的位置的话就要调用一个windows的API:GetCursorPos
VB深为大家诟病的一点就是VB本身封装的API细节太多了,虽然减轻了程序员的任务量,但是隐藏太多深层次的东西让程序员进行深度的开发就显得被束缚住了手脚。不过对于我这种只需要写一些小软件的个人开发者而言,VB6.0就够用了。VB6.0的确有点落伍,它和我都差不多岁数了,去图书馆借的书也都是2003年左右出版的了,但是还是那句话:IDE还是为人服务的,够用就行,杀鸡何须宰牛刀?(似乎有些说跑偏了啊)
windows的API都是用C/C++写成的,在VB中调用这些API需要用的Declare语句。在工程的General中声明一下这个API:
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
windows最重要的三个系统dll就是user32.dll、gdi32.dll、kernel32.dll,VB对这三个dll中的API支持还是比较好的,但是对于其他用C/C++写的dll,vb就未必能够很好的支持了。前面讲了,这涉及一个代码转换的问题。在VB中用declare调用API会发现Long这个数据类型的“曝光频率”相当的高,这是因为C/C++中“曝光频率”相当高的pointer类型、int类型都是4字节的,VB中需要用4字节的Long和C/C++进行类型匹配(函数参数入栈的需要)。
上面的API里出现了VB中自定义类型POINTAPI,这个类型和用VisualC++中的POINT是相似的,它在VB中的定义如下:
Type POITNAPI
x As Long
y As Long
End Type
声明一个POINTAPI类型的变量,访问x和y就能够得到当前鼠标坐标了。当然了,获得的坐标还与VB的坐标系统有关,VB提供了8中坐标系统(ScaleMode),第一种是User坐标系,自己指定单位刻度,另外七种都是指定不同的单位刻度的,比如inch、pixel以及twip(缇)。美国世界上少有的依然采用10进制和12进制并存的单位制的国家,尤其是pixel、twip这些东西换算到厘米上面还挺麻烦的。好在我很少去做绘图的东西,所以和坐标系这块打交道的比较少。我们平时用的坐标系主要获得相对位置就行了,没有必要对单位进行换算,但是如果真正做绘图的程序,那就得把坐标系这块搞明白。有机会我会对这些单位进行详细的说明。