Public Const MAX_PATH = 260 Public Const SHGFI_DISPLAYNAME = &H200 Public Const SHGFI_EXETYPE = &H2000 Public Const SHGFI_SYSICONINDEX = &H4000 'system icon index Public Const SHGFI_LARGEICON = &H0 'large icon Public Const SHGFI_SMALLICON = &H1 'small icon Public Const SHGFI_SHELLICONSIZE = &H4 Public Const SHGFI_TYPENAME = &H400 Public Const ILD_TRANSPARENT = &H1 'display transparent Public Const BASIC_SHGFI_FLAGS = SHGFI_TYPENAME Or _ SHGFI_SHELLICONSIZE Or _ SHGFI_SYSICONINDEX Or _ SHGFI_DISPLAYNAME Or _ SHGFI_EXETYPEPublic Type SHFILEINFO hIcon As Long iIcon As Long dwAttributes As Long szDisplayName As String * MAX_PATH szTypeName As String * 80 End TypePublic Declare Function SHGetFileInfo Lib _ "shell32.dll" Alias "SHGetFileInfoA" _ (ByVal pszPath As String, _ ByVal dwFileAttributes As Long, _ psfi As SHFILEINFO, _ ByVal cbSizeFileInfo As Long, _ ByVal uFlags As Long) As LongPublic Declare Function ImageList_Draw Lib "comctl32.dll" _ (ByVal himl As Long, ByVal i As Long, _ ByVal hDCDest As Long, ByVal x As Long, _ ByVal y As Long, ByVal flags As Long) As LongPublic shinfo As SHFILEINFO 在form中:
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2End Sub Private Sub Command2_Click() Unload MeEnd Sub Private Sub Command1_Click()
Dim hImgSmall as Long 'the handle to the system image list Dim fName As String 'the file name to get icon from Dim fnFilter As String 'the file name filter Dim r As Long
没有问题呀?这是我的代码:Private Declare Function LoadIcon Lib "user32" Alias "LoadIconA" _ (ByVal hInstance As Long, ByVal lpIconName As Long) As Long Const IDI_QUESTION = 32514&Private Sub Command1_Click() Dim h As Long
h = LoadIcon(0, IDI_QUESTION) Debug.Print h End Sub可以正确返回Icon的ID
常数对吗?
是不是有一个LoadStandardIcon呀
没做过,电脑也坏了,所以帮不上忙。
Option Explicit
Public Const MAX_PATH = 260
Public Const SHGFI_DISPLAYNAME = &H200
Public Const SHGFI_EXETYPE = &H2000
Public Const SHGFI_SYSICONINDEX = &H4000 'system icon index
Public Const SHGFI_LARGEICON = &H0 'large icon
Public Const SHGFI_SMALLICON = &H1 'small icon
Public Const SHGFI_SHELLICONSIZE = &H4
Public Const SHGFI_TYPENAME = &H400
Public Const ILD_TRANSPARENT = &H1 'display transparent
Public Const BASIC_SHGFI_FLAGS = SHGFI_TYPENAME Or _
SHGFI_SHELLICONSIZE Or _
SHGFI_SYSICONINDEX Or _
SHGFI_DISPLAYNAME Or _
SHGFI_EXETYPEPublic Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End TypePublic Declare Function SHGetFileInfo Lib _
"shell32.dll" Alias "SHGetFileInfoA" _
(ByVal pszPath As String, _
ByVal dwFileAttributes As Long, _
psfi As SHFILEINFO, _
ByVal cbSizeFileInfo As Long, _
ByVal uFlags As Long) As LongPublic Declare Function ImageList_Draw Lib "comctl32.dll" _
(ByVal himl As Long, ByVal i As Long, _
ByVal hDCDest As Long, ByVal x As Long, _
ByVal y As Long, ByVal flags As Long) As LongPublic shinfo As SHFILEINFO
在form中:
在form中添加2个按钮(Command1 & Command2),两个label(Label1 & Label2), 两个picture boxe (pixSmall and pixLarge). 保证form和两个picturebox的scale modes设置为1(Twips)
设置两个picture box的属性如下:
Appearance = 0 (flat)
AutoRedraw = True
AutoResize = False
BorderStyle = 0 (none)
设置pixSmall的属性:
Height = 240 twips
Width = 240 twips 设置pixLarge的属性:
Height = 480 twips
Width = 480 twips 把下面的代码放在Form中Option ExplicitPrivate Sub Form_Load()
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2End Sub
Private Sub Command2_Click() Unload MeEnd Sub
Private Sub Command1_Click()
Dim hImgSmall as Long 'the handle to the system image list
Dim fName As String 'the file name to get icon from
Dim fnFilter As String 'the file name filter
Dim r As Long
On Local Error GoTo Command1ErrorHandler
fnFilter = "All Files (*.*)|*.*|"
fnFilter = fnFilter & "Applications (*.exe)|*.exe|"
fnFilter = fnFilter & "Windows Bitmap (*.bmp)|*.bmp|"
fnFilter = fnFilter & "Icon Files (*.ico)|*.ico" CommonDlg1.CancelError = True
CommonDlg1.Filter = fnFilter
CommonDlg1.ShowOpen fName = CommonDlg1.FileName
hImgSmall& = SHGetFileInfo(fName, 0&, _
shinfo, Len(shinfo), _
BASIC_SHGFI_FLAGS Or SHGFI_SMALLICON) hImgLarge& = SHGetFileInfo(fName, 0&, _
shinfo, Len(shinfo), _
BASIC_SHGFI_FLAGS Or SHGFI_LARGEICON)
Label1.Caption = Left$(shinfo.szDisplayName, _
InStr(shinfo.szDisplayName, Chr$(0)) - 1) Label2.Caption = Left$(shinfo.szTypeName, _
InStr(shinfo.szTypeName, Chr$(0)) - 1)
pixSmall.Picture = LoadPicture()
pixSmall.AutoRedraw = True pixLarge.Picture = LoadPicture()
pixLarge.AutoRedraw = True
Call ImageList_Draw(hImgSmall&, shinfo.iIcon, pixSmall.hDC, 0, 0, ILD_TRANSPARENT)
Call ImageList_Draw(hImgLarge&, shinfo.iIcon, pixLarge.hDC, 0, 0, ILD_TRANSPARENT)
pixSmall.Picture = pixSmall.Image
pixLarge.Picture = pixLarge.Image
Exit SubCommand1ErrorHandler:
Exit SubEnd Sub
说明:
运行这个工程, 任意选择文件。在关闭common dialog时, 和所选文件关联的大小图标(或系统默认图标)就会显示, 条件是,该文件在注册表中有关联图标.
你误会了。
我只是要调用系统的错误、警告、问题、消息等图标
我不想在程序中加入这些图标,所以需要用API调用它。
(ByVal hInstance As Long, ByVal lpIconName As Long) As Long
Const IDI_QUESTION = 32514&Private Sub Command1_Click()
Dim h As Long
h = LoadIcon(0, IDI_QUESTION)
Debug.Print h
End Sub可以正确返回Icon的ID
但Win2000中呢?