?? modenumres.bas
字號:
Attribute VB_Name = "modEnumResIcons"
'****************************************************************************
'人人為我,我為人人
'枕善居漢化收藏整理
'發布日期:05/05/18
'描 述:從EXE/DLL庫文件中加載圖標資源
'網 站:http://www.mndsoft.com/
'e-mail:mnd@mndsoft.com
'OICQ : 88382850
'****************************************************************************
'---------------------------------------------------------------------------------------
' 模塊 : modEnumResIcons.bas
' 日期 : 03/04/2004 21.52
' 作者 : Giorgio Brausi
' 工程 : EnumResource.vbp
' 用途 : 從EXE/DLL庫文件中加載圖標資源
' 描述 : 本工程演示怎樣從可執行文件中加載Windows XP (32bpp) 圖標
' 注釋 : 參閱'frmEnumRes.frm'中的細節注釋.
' 或者閱讀 README.TXT
'---------------------------------------------------------------------------------------
Option Explicit
Public ghmodule As Long
Public giSize As Integer
Public giColorDepth As Integer
Public gbAllSizeFormat As Boolean
Public arrSize As Long
Private arIcon(1 To 4, 1 To 4)
Private Const SIZE_16 = 1
Private Const SIZE_24 = 2
Private Const SIZE_32 = 3
Private Const SIZE_48 = 4
Private Const COLOR_4 = 1
Private Const COLOR_16 = 2
Private Const COLOR_24 = 3
Private Const COLOR_32 = 4
Public Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long
Public Const DONT_RESOLVE_DLL_REFERENCES = &H1
Public Const LOAD_LIBRARY_AS_DATAFILE = &H2
Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Public Declare Function EnumResourceNames Lib "kernel32" Alias "EnumResourceNamesA" (ByVal ghmodule As Long, ByVal lpType As ResType, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'字符串處理
Public Declare Function StrLen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Declare Function StrCpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Const DIFFERENCE = 11
Public Enum ResType ' 資源類型
RT_FIRST = 1&
RT_CURSOR = 1&
RT_BITMAP = 2&
RT_ICON = 3&
RT_MENU = 4&
RT_DIALOG = 5&
RT_STRING = 6&
RT_FONTDIR = 7&
RT_FONT = 8&
RT_ACCELERATOR = 9&
RT_RCDATA = 10&
RT_MESSAGETABLE = (11)
RT_GROUP_CURSOR = (RT_CURSOR + DIFFERENCE) ' (12)
RT_GROUP_ICON = (RT_ICON + DIFFERENCE) ' (14)
RT_VERSION = (16)
'RT_DLGINCLUDE = (17)
'RT_PLUGPLAY = (19)
'RT_VXD = (20)
'RT_ANICURSOR = (21)
'RT_ANIICON = (22)
'RT_HTML = (23)
RT_LAST = (16)
End Enum
' 圖像處理
'Const IMAGE_BITMAP = 0
'Const IMAGE_ICON = 1
'Const IMAGE_CURSOR = 2
'Const IMAGE_ENHMETAFILE = 3
'Private Const LR_COLOR As Long = &H2
'Private Const LR_COPYDELETEORG As Long = &H8
'Private Const LR_COPYFROMRESOURCE As Long = &H4000
'Private Const LR_COPYRETURNORG As Long = &H4
'Private Const LR_CREATEDIBSECTION As Long = &H2000
'Private Const LR_DEFAULTCOLOR As Long = &H0
'Private Const LR_DEFAULTSIZE As Long = &H40
'Private Const LR_LOADFROMFILE As Long = &H10
Private Const LR_LOADMAP3DCOLORS As Long = &H1000
'Private Const LR_LOADTRANSPARENT As Long = &H20
'Private Const LR_MONOCHROME As Long = &H1
'Private Const LR_SHARED As Long = &H8000
'Private Const LR_VGACOLOR As Long = &H80
'/ mie
Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags 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 GetLastError Lib "kernel32.dll" () As Long
'Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Public Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FindResource Lib "kernel32.dll" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As String) As Long
Private Declare Function FindResourceByNum Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As Long) As Long
Private Declare Function LoadResource Lib "kernel32.dll" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
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 LockResource Lib "kernel32" (ByVal hResData As Long) As Long
Private Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function FreeResource Lib "kernel32" (ByVal hResData As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Type PictDesc
cbSizeofStruct As Long
PicType As Long
hImage As Long
xExt As Long
yExt As Long
End Type
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (lpPictDesc As PictDesc, riid As GUID, ByVal fPictureOwnsHandle As Long, ipic As IPicture) As Long
'Private Declare Function GetBitmapDimensionEx Lib "gdi32.dll" (ByVal hBitmap As Long, lpDimension As SIZE) As Long
Private Type SIZE
cx As Long
cy As Long
End Type
'---------------------------------------------------------------------------------------
' 函數 : GetPictureRes
' 日期 : 04/04/2004 17.47
' 作者 : Giorgio Brausi
' 用途 : 從庫文件中獲取圖標資源
' 描述 : 獲取資源類型并判斷是否需要(ICON)
' 注釋 :
'---------------------------------------------------------------------------------------
Public Function GetPictureRes(ByVal sResType As String, ByVal sResName As String, ByVal iSize As Integer, ByVal iColorDepth As Integer) As StdPicture
Dim hData As Long
Dim arr() As Byte, vRet As Variant
Select Case sResType
Case "1", "3" ' 依賴硬件的光標或圖標.
vRet = GetDataArray(sResType, sResName, iSize, iColorDepth)
If CStr(vRet) = "0" Then
Set GetPictureRes = Nothing
Exit Function
Else
arr = vRet
hData = CreateIconFromResourceEx(arr(0), UBound(arr) + 1, CLng(sResType) - 1, &H30000, 0, 0, LR_LOADMAP3DCOLORS)
End If
Case "2" ' 位圖文件
hData = LoadImage(ghmodule, sResName, 0, 0, 0, LR_LOADMAP3DCOLORS)
Case "12" ' 依賴硬件的光標
hData = LoadImage(ghmodule, sResName, 2, 0, 0, LR_LOADMAP3DCOLORS)
Case "14" ' 依賴硬件的圖標
hData = LoadImage(ghmodule, sResName, 1, 0, 0, LR_LOADMAP3DCOLORS)
End Select
If hData = 0 Then Exit Function
Set GetPictureRes = IconToPicture(hData)
End Function
'---------------------------------------------------------------------------------------
' 函數 : IconToPicture
' 日期 : 04/04/2004 17.46
' 作者 : Giorgio Brausi
' 用途 : 把資源文件中的 ICON 輸出位 PICTURE
' 描述 :
' 注釋 :
'---------------------------------------------------------------------------------------
Private Function IconToPicture(ByVal hIcon As Long) As StdPicture
If hIcon = 0 Then Exit Function
Dim oNewPic As Picture
Dim tPicConv As PictDesc
Dim IGuid As GUID
With tPicConv
.cbSizeofStruct = Len(tPicConv)
.PicType = vbPicTypeIcon
.hImage = hIcon
End With
With IGuid
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With
OleCreatePictureIndirect tPicConv, IGuid, True, oNewPic
Set IconToPicture = oNewPic
End Function
Public Function GetDataArray(ByVal ResType As String, ByVal ResName As String, ByVal iSize As Integer, ByVal iColorDepth As Integer) As Variant
Dim hRsrc As Long
Dim hGlobal As Long
Dim arrData() As Byte
Dim lpData As Long
'Dim arrSize As Long
If IsNumeric(ResType) Then hRsrc = FindResourceByNum(ghmodule, ResName, CLng(ResType))
If hRsrc = 0 Then hRsrc = FindResource(ghmodule, ResName, ResType)
If hRsrc = 0 Then Exit Function
hGlobal = LoadResource(ghmodule, hRsrc)
lpData = LockResource(hGlobal)
arrSize = SizeofResource(ghmodule, hRsrc)
Dim iNDXSize As Integer, iNDXColor As Integer
Select Case iSize
Case 16
iNDXSize = 1
Case 24
iNDXSize = 2
Case 32
iNDXSize = 3
Case 48
iNDXSize = 4
End Select
Select Case iColorDepth
Case 4
iNDXColor = 1
Case 16
iNDXColor = 2
Case 24
iNDXColor = 3
Case 32
iNDXColor = 4
End Select
If Not gbAllSizeFormat Then
' 圖標是否匹配色深
If arrSize <> arIcon(iNDXSize, iNDXColor) Then
GetDataArray = 0
Exit Function
End If
End If
If arrSize = 0 Then
GetDataArray = 0
Exit Function
End If
ReDim arrData(arrSize - 1)
Call CopyMemory(arrData(0), ByVal lpData, arrSize)
Call FreeResource(hGlobal)
GetDataArray = arrData
End Function
Public Function EnumResNameProc(ByVal ghmodule As Long, ByVal lpszType As ResType, ByVal lpszName As Long, ByVal lParam As Long) As Long
Dim sNumber As String, IsNum As Boolean
If (lpszName > &HFFFF&) Or (lpszName < 0) Then
sNumber = PtrToVBString(lpszName)
IsNum = False
Else
sNumber = CStr(lpszName)
IsNum = True
End If
' 16x16
arIcon(SIZE_16, COLOR_4) = 296
arIcon(SIZE_16, COLOR_16) = 1384
arIcon(SIZE_16, COLOR_24) = 872
arIcon(SIZE_16, COLOR_32) = 1128
' 24x24
arIcon(SIZE_24, COLOR_4) = 488
arIcon(SIZE_24, COLOR_16) = 1736
arIcon(SIZE_24, COLOR_24) = 1864
arIcon(SIZE_24, COLOR_32) = 2440
' 32x32
arIcon(SIZE_32, COLOR_4) = 744
arIcon(SIZE_32, COLOR_16) = 2216
arIcon(SIZE_32, COLOR_24) = 3240
arIcon(SIZE_32, COLOR_32) = 4264
' 48x48
arIcon(SIZE_48, COLOR_4) = 1640
arIcon(SIZE_48, COLOR_16) = 3752
arIcon(SIZE_48, COLOR_24) = 7336
arIcon(SIZE_48, COLOR_32) = 9640
If IsNum Then
If lpszType = RT_ICON Then
LoadIconRes lpszType, sNumber, giSize, giColorDepth
End If
End If
EnumResNameProc = 1
End Function
Private Function PtrToVBString(ByVal lpszBuffer As Long) As String
Dim Buffer As String, LenBuffer As Long
LenBuffer = StrLen(lpszBuffer)
Buffer = String(LenBuffer + 1, 0)
StrCpy Buffer, lpszBuffer
PtrToVBString = Left(Buffer, LenBuffer)
End Function
'---------------------------------------------------------------------------------------
' 過程 : LoadIconRes
' 日期 : 04/04/2004 17.50
' 作者 : Giorgio Brausi
' 用途 : 從圖標資源中獲取每個圖像的格式
' 描述 :
' 注釋 : 使用 GetPictureRes函數
'---------------------------------------------------------------------------------------
Public Sub LoadIconRes(ByVal sResType As ResType, ByVal sResNumber As String, ByVal iSize As Integer, ByVal iColorDepth As Integer)
Dim sResName As String
Dim hPicture As StdPicture
sResName = sResNumber
If IsNumeric(sResName) Then sResName = "#" & sResName
' 載入圖標匹配大小
Set hPicture = GetPictureRes(sResType, sResName, iSize, iColorDepth)
Dim h As Long, w As Long
Set frmEnumRes.Image1.Picture = hPicture
w = frmEnumRes.Image1.Width / Screen.TwipsPerPixelX
h = frmEnumRes.Image1.Height / Screen.TwipsPerPixelY
If Not hPicture Is Nothing Then
With frmEnumRes.ImageList1
.ListImages.Add , sResName & " " & CStr(arrSize) & " " & w & "x" & h, hPicture
' 需要知道更多的圖像格式
Select Case arrSize
Case 1640, 744, 488, 296, 3752, 2216, 1736, 1384, 9640, 4264, 2440, 1128, 7336, 3240, 1864, 872
' 這是已知的圖像格式
Case Else
' 常用的圖像格式: 單色, 21x24, ...
' 當想列出所有格式時會出現'無法獲取',請大家一起看看
frmEnumRes.List2.AddItem Format(sResName, "@@@@@") & " " & _
Format(arrSize, "@@@@@") & " " & _
w & "x" & h
End Select
End With
End If
End Sub
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -