大家都知道VB程序的图标不支持颜色超过24位的位图,所以无法在设计时导入真彩色的鼠标图标,那只可能在运行时动态加载了,动态改变鼠标指针要用到Win32的API “SetCursor”,但是在vb里这个函数不能很好的工作,因为vb习惯在不同的时间将指针变回原来的样子,所以需要不停的去调用这个API,也就是说再每给控件的MouseMove事件里都得去调用"SetCursor",所以很麻烦。如是乎在偶一番埋头苦想,经过N此实验之后终于找到了一种方法。我们都知道VB上的每一个控件都是一个窗口(子窗口),那么每个窗口都有一些属性,这些属性中就包括了鼠标在该窗口上的图标,哈哈想到了吧,我们只要改变每个窗口的默认的鼠标图标句柄就行了。这样就肯定要用到一些API,那么让我们来看看需要哪些API吧:
EnumChildWindows(遍历所有的子窗口)
LoadCursor(加载鼠标)
SetClassLong (设置窗口类)
EnumChildWindows这个API一开弄了很久,因为需要自定义的过程,而且参数前要加BYVAL 修饰符,不然就会出错
Public Sub Set_Cursors(hwnd As Long)
'hwnd为主窗口句柄
EnumChildWindows hwnd, AddressOf MyFunc, 0
End Sub
自定过程如下:
Public Function MyFunc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
'这里我们需要的只是hwnd参数,它是每个子窗口的句柄,这个过程会被调用多次
Set_Cursor hwnd
MyFunc = True
End Function
Public Sub Load_Cursor(ByVal hInstance As Long, ByVal lpIconName As Long)
'加载鼠标图标,改函数返回一个鼠标句柄,hinstance为程序的实例句柄,lpIconName为鼠标资源的ID号
我是把资源放进了程序中,当然是编译之后用资源编辑工具导入的,你也可以从文件中加载
CursorHandle = LoadCursor(hInstance, 2)
End Sub
Public Sub Set_Cursor(hwnd As Long)
'更改窗口默认的鼠标样式
SetClassLong hwnd, GCL_HCURSOR, CursorHandle
End Sub
接下来我们只要在一个过程中依次调用:
Load_Cursor
Set_Cursors
就可以完成自定义鼠标指针的设定了。
|