鼠标指针操作
Posted VB.Net
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了鼠标指针操作相关的知识,希望对你有一定的参考价值。
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
鼠标指针,鼠标、笔或跟踪球控制其位置在屏幕上的小图片。当用户移动的指针设备时,操作系统将相应地移动鼠标指针。
通常情况下,鼠标指针也称为光标。
1 使用系统默认的鼠标指针
在VB.Net中可以使用窗体或者控件的Cursor属性来设置显示的光标:
图1 在VS编辑器中修改按钮的Cursor属性
图2 鼠标放在按钮上显示的光标
【例 1】修改窗体的光标。
Private Sub btnCustomCursor_Click(sender As Object, e As EventArgs) Handles btnCustomCursor.Click
Me.Cursor = New Cursor("d:\\a\\Arrow1.cur")
End Sub
Private Sub btnDefaultCursor_Click(sender As Object, e As EventArgs) Handles btnDefaultCursor.Click
Me.Cursor = System.Windows.Forms.Cursors.Default
End Sub
运行结果如下图所示:
图3 修改后窗体上显示的光标
以上方法存在的问题:
1、只能将光标修改为系统默认的一系列指针中的一种;
2、只能在窗体范围内有效。
2 Cursor类
Cursor类代表用于绘制光标的图像。
Cursor类常用的两个构造函数:
Public Sub New ( fileName As String )
参数fileName,必须是标准的光标 (.cur) 文件;
Public Sub New ( handle As IntPtr )
参数handle表示要创建的光标的Windows句柄,在代码中使用Bitmap类的GetHicon方法获得该图像对应的句柄。
【例 2】从图片创建光标。
Private Sub btnCustomCursor_Click(sender As Object, e As EventArgs) Handles btnCustomCursor.Click
Dim bmpCursor As New Bitmap(64, 64)
Dim g As Graphics = Graphics.FromImage(bmpCursor)
Dim bmp As New Bitmap("d:\\lessons\\ca1.jpg")
g.DrawImage(bmp, New Point(0, 0))
Dim cur As New Cursor(bmpCursor.GetHicon)
Me.Cursor = cur
g.Dispose()
bmp.Dispose()
bmpCursor.Dispose()
End Sub
运行结果如下图所示:
图4 从图片生成光标
注意:可以直接使用Dim cur As New Cursor(bmp.GetHicon),这里为了演示光标的HotSpot(光标作用点),所以做了些变化,从图中可以看到,光标的作用点,并不是在红色方框的位置,跟踪HotSpot属性可以得知,这个点的坐标(32,32),图片大小为64*64,所以光标作用点是在图片中心位置。
如果需要恢复系统默认的光标,只需要以下代码即可:
Private Sub btnDefaultCursor_Click(sender As Object, e As EventArgs) Handles btnDefaultCursor.Click
Me.Cursor = Cursors.Default
End Sub
HotSpot(光标作用点)是按下鼠标时,光标图片在屏幕上实际“点击”的位置,使用默认箭头状鼠标时,光标作用点在箭头尖上,即光标图片左上角。而正如前面所述,载入图片生成光标的HotSpot的位置在图片的中心位置。
如果指定光标作用点,需要使用到以下一个结构和两个API函数:
1、IconInfo结构:
Public Structure IconInfo
Dim fIcon As Boolean
Dim xHotspot As Integer
Dim yHotspot As Integer
Dim hbmMask As IntPtr
Dim hbmColor As IntPtr
End Structure
成员fIcon:True表示此结构是图标,False表示此结构是光标。
成员xHotspot:光标在横坐标上的作用点坐标。如果是图标则忽略。
成员yHotspot:光标在纵坐标上的作用点坐标。如果是图标则忽略。
成员hbmMask:对光标无影响。图标的掩码图片。
成员hbmColor:对光标无影响。指定一个图标颜色位图的句柄。
2、Public Declare Function GetIconInfo Lib "user32" (ByVal hIcon As IntPtr, ByRef pIconInfo As IconInfo) As Boolean
说明:取得与光标或图标有关的信息。
参数hIcon:光标或图标句柄。
参数pIconInfo:返回与光标或图标有关的IconInfo结构信息。
3、Public Declare Function CreateIconIndirect Lib "user32" (ByRef pIconInfo As IconInfo) As IntPtr
说明:从IconInfo结构创建一个光标或图标,返回的是一个指向光标或图标的句柄。
参数pIconInfo:包含与光标或图标有关的IconInfo结构信息
通过以下代码实现指定光标的作用点位置:
参考对比的代码:
Private Sub btnNoCustomCursorHotSpot_Click(sender As Object, e As EventArgs) Handles btnNoCustomCursorHotSpot.Click
Dim bmp As New Bitmap("d:\\lessons\\cursor.png")
Dim cur As New Cursor(bmp.GetHicon)
Me.Cursor = cur
End Sub
图5 未指定作用点的光标
指定光标作用点的代码:
Private Sub btnCustomCursorHotSpot_Click(sender As Object, e As EventArgs) Handles btnCustomCursorHotSpot.Click
Dim bmp As New Bitmap("d:\\lessons\\cursor.png")
Dim cur As Cursor = CreateCursor(bmp)
Me.Cursor = cur
End Sub
Public Function CreateCursor(ByVal bmp As Bitmap) As Cursor
'指定光标作用点在左上角(0,0)
Dim xHotSpot As Integer = 0
Dim yHotSpot As Integer = 0
Dim hicon As IntPtr
hicon = (bmp.GetHicon)
Dim ii As New IconInfo
GetIconInfo(hicon, ii)
ii.xHotspot = xHotSpot
ii.yHotspot = yHotSpot
ii.fIcon = False
hicon = CreateIconIndirect(ii)
Return New Cursor(hicon)
End Function
图6 指定作用点的光标
对比图5和图6,可以看到光标作用点位置的不同。
3 使用动态的鼠标指针
Cursor类使用的光标(.cur)是一个静态的光标,对于动态光标(.ani)是无效的。但是可以通过变通的方式来使用动态光标,使用系统的API函数LoadCursorFromFile可以获得动态光标的句柄:
Public Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As IntPtr
说明:从光标文件创建光标,返回指向光标的句柄。
参数lpFileName:指定光标文件,它可以是静态光标文件(.cur)也可以是动态光标文件(.ani)。
【例 3】创建动态光标。
Private Sub btnCustomCursor_Click(sender As Object, e As EventArgs) Handles btnCustomCursor.Click
Dim pCursor As IntPtr
pCursor = LoadCursorFromFile("D:\\lessons\\sword.ani")
Dim cur As New Cursor(pCursor)
Me.Cursor = cur
End Sub
运行结果如下图所示:
图7 创建动态光标
以上是关于鼠标指针操作的主要内容,如果未能解决你的问题,请参考以下文章