鼠标指针操作

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 创建动态光标
 

以上是关于鼠标指针操作的主要内容,如果未能解决你的问题,请参考以下文章

如何使Mac上的鼠标指针更大?

第七章 鼠标(CHECKER2)

js如何获取鼠标在某元素移动时~鼠标指针在元素中的坐标?

鼠标指针操作

鼠标指针操作

为啥鼠标不能超过电脑屏幕的左,上边界,而能够超过