大家都知道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
就可以完成自定義鼠標指針的設定了。
|