怎么获取鼠标(光标)图片大小

一如既往哈 2013-12-10 09:57:53
getcursorinfo无法得到鼠标的大小
getsystemmetrics只能得到标准鼠标的大小,对于自定义鼠标无能为力

getcursor得到鼠标指针怎么转换成stdpicture(通过stdpicture好像可以得到大小的)


实在不行,只能用最原始的方法...........


大家有什么好方法么?
...全文
458 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2013-12-11
  • 打赏
  • 举报
回复
hRes = OleCreatePictureIndirect(stcIconInfo, stcCLSID, 0, oNewPic) 把 -1 改为0,搞定。
舉杯邀明月 2013-12-11
  • 打赏
  • 举报
回复
真搞不懂了,如果用“系统光标”,好象就没问题。 就是把 .MousePointer 设置为1到15的值。 只要用了 99,获取一次后,就只能显示为指针光标了。
舉杯邀明月 2013-12-11
  • 打赏
  • 举报
回复
引用 2 楼 Topc008 的回复:
To Chen8013 : 谢谢您的代码,可以执行,但是在测试时发现一个小问题: 为了测试,我自定义text1的光标,用上述代码获取光标大小后,text1就不再是自定义光标了,而变成了默认的箭头鼠标了。这是咋回事?? 如果不用上述代码,text1的自定义光标随时有效。
搞不懂………… 我试了下,在IDE中运行,把鼠标移到不同的地方,让它出现好几种不几的指针,全部正常。 但移动到“自定义指针”的控件上,第一次正确取得。 第二次(Timer事件)时就无法取得光标图像了。 它的 句柄 都没变的呀………… 编译后运行,也是出错的。
Private Sub Timer1_Timer()
   Dim objCurImg As IPictureDisp
   Dim hCursour  As Long
   
   Me.Cls
   hCursour = GetCursor()
   Debug.Print Hex(hCursour)
   If (hCursour) Then
      Set objCurImg = hIconToIcon(hCursour)
      Print "X_size: " & ScaleX(objCurImg.Width, 8, 3)
      Print "Y_size: " & ScaleY(objCurImg.Height, 8, 3)
      PaintPicture objCurImg, 300, 450
   End If
End Sub
一如既往哈 2013-12-11
  • 打赏
  • 举报
回复
算了,不等了,好在一般光标大小都是32*32,至于二班的大小直接无视.....
一如既往哈 2013-12-11
  • 打赏
  • 举报
回复
Chen8013 佩服佩服。。。。。。。。。。
舉杯邀明月 2013-12-10
  • 打赏
  • 举报
回复
楼主试下这个代码吧。
Option Explicit

Private Declare Function GetCursor Lib "user32" () As Long
Private Declare Function OleCreatePictureIndirect Lib "oleaut32.dll" (pDicDesc As TypeIcon, _
                              riID As CLSID, ByVal fown As Long, lpUnk As Object) As Long


Private Type CLSID
   'vID(15)  As Byte              '由16个成员组成的字节数组
   Data1    As Long
   Data2    As Integer
   Data3    As Integer
   Data4(7) As Byte
End Type

Private Type TypeIcon
   cbSize   As Long
   picType  As PictureTypeConstants
   hIcon    As Long
   xExt     As Long
   yExt     As Long
End Type


Private Function hIconToIcon(hIcon As Long) As IPictureDisp
      Dim oNewPic     As IPictureDisp
      Dim stcCLSID    As CLSID
      Dim stcIconInfo As TypeIcon
      Dim hRes        As Long

   stcCLSID.Data1 = &H7BF80980
   stcCLSID.Data2 = &HBF32
   stcCLSID.Data3 = &H101A
   stcCLSID.Data4(0) = &H8B
   stcCLSID.Data4(1) = &HBB
   stcCLSID.Data4(2) = &H0
   stcCLSID.Data4(3) = &HAA
   stcCLSID.Data4(4) = &H0
   stcCLSID.Data4(5) = &H30
   stcCLSID.Data4(6) = &HC
   stcCLSID.Data4(7) = &HAB
   stcIconInfo.cbSize = Len(stcIconInfo)
   stcIconInfo.picType = vbPicTypeIcon
   stcIconInfo.hIcon = hIcon
   hRes = OleCreatePictureIndirect(stcIconInfo, stcCLSID, -1, oNewPic)
   If (hRes = 0) Then Set hIconToIcon = oNewPic
End Function

Private Sub Form_Load()
   Timer1.Interval = 300
   Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
   Dim objCurImg As IPictureDisp
   
   Me.Cls
   Set objCurImg = hIconToIcon(GetCursor())
   Print "X_size: " & ScaleX(objCurImg.Width, 8, 3)
   Print "Y_size: " & ScaleY(objCurImg.Height, 8, 3)
   PaintPicture objCurImg, 300, 450
End Sub
一如既往哈 2013-12-10
  • 打赏
  • 举报
回复
To Chen8013 : 谢谢您的代码,可以执行,但是在测试时发现一个小问题: 为了测试,我自定义text1的光标,用上述代码获取光标大小后,text1就不再是自定义光标了,而变成了默认的箭头鼠标了。这是咋回事?? 如果不用上述代码,text1的自定义光标随时有效。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧