VB动态更改窗口图标的类(支持WinXP的32位图标)

VB动态更改窗口图标的类(支持WinXP的32位图标),第1张

概述Option Explicit   '======== clsIcon.cls ======== Private Type ICONDIRENTRY     bWidth  As Byte     bHeight  As Byte     bColorCount  As Byte     bReserved  As Byte     wPlanes  As Integer     wBitCoun

Option Explicit

'======== clsIcon.cls ========

Private Type ICONDIRENTRY
bWIDth As Byte
bHeight As Byte
bcolorCount As Byte
bReserved As Byte
wPlanes As Integer
wBitCount As Integer
DWBytesInRes As Long
DWImageOffset As Long
End Type

Private Type ICONDIR
IDReserved As Integer
IDType As Integer
IDCount As Integer
IDEntrIEs() As ICONDIRENTRY
End Type

Private Declare Function CreateIconFromresourceEx lib "user32" (presbits As Byte,ByVal DWResSize As Long,ByVal fIcon As Long,ByVal DWVer As Long,ByVal cxDesired As Long,ByVal cyDesired As Long,ByVal uFlags As Long) As Long
Private Declare Function DrawIconEx lib "user32.dll" (ByVal hdc As Long,ByVal xleft As Long,ByVal ytop As Long,ByVal hIcon As Long,ByVal cxWIDth As Long,ByVal cyWIDth As Long,ByVal istepIfAniCur As Long,ByVal hbrFlickerFreeDraw As Long,ByVal diFlags As Long) As Long
Private Declare Function DestroyIcon lib "user32" (ByVal hIcon As Long) As Long
Private Declare Function SendMessageLong lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,ByVal lParam As Long) As Long
Private Declare Sub copyMemory lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any,ByRef Source As Any,ByVal Length As Long)

Private iCount As Integer
Private IDir As ICONDIR
Private lpData() As Byte

Public Property Get Count() As Long
Count = iCount
End Property

Public Property Get Height(Optional ByVal Index As Long) As Long
Height = IDir.IDEntrIEs(Index).bHeight
End Property

Public Property Get WIDth(Optional ByVal Index As Long) As Long
WIDth = IDir.IDEntrIEs(Index).bWIDth
End Property

Public Property Get Length(Optional ByVal Index As Long) As Long
Length = IDir.IDEntrIEs(Index).DWBytesInRes
End Property

Public Property Get Data(Optional ByVal Index As Long) As Byte()
Dim p As Long,l As Long,d() As Byte
p = IDir.IDEntrIEs(Index).DWImageOffset
l = IDir.IDEntrIEs(Index).DWBytesInRes
ReDim d(l - 1)
copyMemory d(0),lpData(p),l
Data = d
End Property

Public Function LoadFromData(Data() As Byte) As Boolean
Dim i As Long
lpData = Data
copyMemory iCount,lpData(4),2 '取得图标个数
If iCount > 0 Then
ReDim IDir.IDEntrIEs(0 To iCount - 1) '图标目录结构数据
For i = 0 To iCount - 1
copyMemory IDir.IDEntrIEs(i),lpData(6 + Len(IDir.IDEntrIEs(i)) * i),Len(IDir.IDEntrIEs(i))
Next
LoadFromData = True
End If
End Function

Public Function LoadFromfile(ByVal lpfilename As String) As Boolean
Dim hfile As Integer
Dim Data() As Byte

If Dir(lpfilename) = "" Then Exit Function

hfile = Freefile
Open lpfilename For Binary As #hfile
ReDim Data(LOF(hfile) - 1)
Get #hfile,Data
Close #hfile

LoadFromfile = LoadFromData(Data)
End Function

Public Property Get hIcon(Optional ByVal Index As Long) As Long
Dim d() As Byte,w As Long,h As Long
d = Data(Index): l = Length(Index)
w = WIDth(Index): h = Height(Index)
hIcon = CreateIconFromresourceEx(d(0),l,1,&H30000,w,h,0)
End Property

Public Function Draw(ByVal hdc As Long,ByVal x As Long,ByVal y As Long,Optional ByVal Index As Long = 0) As Boolean
Dim w As Long,h As Long
w = WIDth(Index): h = Height(Index)
Draw = DrawIconEx(hdc,x,y,hIcon(Index),3) <> 0
DestroyIcon hIcon
End Function

Public Sub SetFormIcon(ByVal lhWnd As Long,Optional ByVal Index As Long = 0)
SendMessageLong lhWnd,&H80,hIcon(Index)
End Sub

Private Sub Class_Terminate()
Erase lpData
End Sub


'使用如下代码更改一个窗口的图标

If Dir(App.Path & "/Icon.ico") = "" Then Exit Sub 'Function Dim ic As New clsIcon ic.LoadFromfile App.Path & "/Icon.ico" ic.SetFormIcon Me.hWnd 'hWnd Of a Window Set ic = nothing

总结

以上是内存溢出为你收集整理的VB动态更改窗口图标的类(支持WinXP的32位图标)全部内容,希望文章能够帮你解决VB动态更改窗口图标的类(支持WinXP的32位图标)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1294620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存