ExtractIcon VB声明 
Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long 
说明 
判断一个可执行文件或DLL中是否有图标存在,并将其提取出来 
返回值 
Long,如成功,返回指向图标的句柄;如文件中不存在图标,则返回零。如果nIconIndex设为-1,就返回文件中的图标总数 
参数表 
参数 类型及说明 
hInst Long,当前应用程序的实例句柄。也可用GetWindowWord函数取得拥有一个窗体或控件的实例的句柄 
lpszExeFileName String,在其中提取图标的那个程序的全名 
nIconIndex Long,欲获取的图标的索引。如果为-1,表示取得文件中的图标总数 DrawIcon VB声明 
Declare Function DrawIcon Lib "user32" Alias "DrawIcon" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long 
说明 
在指定的位置画一个图标 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
hdc Long,设备场景 
x,y Long,想描绘图标的位置(逻辑坐标) 
hIcon Long,欲描绘图标的句柄 

解决方案 »

  1.   


    Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
    Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As LongPrivate Sub Command1_Click()
    Dim icon As Long
    icon = ExtractIcon(App.hInstance, "c:\winamp.exe", 1)
    DrawIcon Picture1.hdc, 0, 0, icon
    Picture1.Refresh
    End SubPrivate Sub Form_Load()
    Picture1.AutoRedraw = True
    End Sub注意:你若想得到所有的图标,你可以把
    num = ExtractIcon(App.hInstance, "c:\winamp.exe", -1)
    你就可以得到图标的数目
    然后,呵呵不用说了吧
    用for i=0 to num
          icon=ExtractIcon(App.hInstance, "c:\winamp.exe", i)
          DrawIcon Picture1.hdc, 32*i, 0, icon
          Picture1.Refresh
      next
      

  2.   

    如果要对图标进行缩放
    DrawIconEx VB声明 
    Declare Function DrawIconEx Lib "user32" Alias "DrawIconEx" (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 
    说明 
    描绘一个图标或鼠标指针。与DrawIcon相比,这个函数提供了更多的功能 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hdc Long,要在其中画图的一个设备场景的句柄 
    xLeft,yTop Long,图标左上角的位置,用逻辑坐标表示 
    hIcon Long,要描绘的图标的句柄 
    cxWidth,cyWidth Long,希望的图标宽度和高度。图标会自动缩放,与指定的值相符 
    istepIfAniCur Long,如果hIcon是个动画指针,那么该参数指定描绘动画中的哪幅图象。注意Win32不能区分图标和指针 
    hbrFlickerFreeDraw Long,如设为一个刷子句柄,那么函数会将图标画入一幅内存位图,并用背景色填充。随后,将图象直接复制到指定的位置。这样做可绘图时减少闪烁(因为画图过程中重现) 
    diFlags Long,下述常数之一: 
    DI_COMPAT 描绘标准的系统指针,而不是指定的图象 
    DI_DEFAULTSIZE 忽略cxWidth和cyWidth设置,并采用原始的图标大小 
    DI_IMAGE 绘图时使用图标的XOR部分(即图标没有透明区域) 
    DI_MASK 绘图时使用图标的MASK部分(如单独使用,可获得图标的掩模) 
    DI_NORMAL 用常规方式绘图(合并 DI_IMAGE 和 DI_MASK) 
    注解 
    应检查Windows95是否与指定的标志及参数兼容。Win32用户手册宣称函数与Windows 95是兼容的,但在实际运用中发现它有一定的限制
      

  3.   

    如何从文件中提取图标使用下面的示例,你可以方便地从EXE,DLL及ICO文件中提取图标。该示例程序使用ExtractIconEX API函数从文件中提取图标,并返回图标句柄,然后利用该句柄,使用DrawIcon函数将图标绘制到目标设备中。最后清除句柄以释放系统资源。创建新工程后,在工程中添加对Standard OLE Types的引用,然后在工程中添加一个标准模块。将下面的代码粘贴到标准模块中:Option ExplicitPrivate Type PicBmp
       Size As Long
       tType As Long
       hBmp As Long
       hPal As Long
       Reserved As Long
    End Type
    Private Type GUID
       Data1 As Long
       Data2 As Integer
       Data3 As Integer
       Data4(7) As Byte
    End Type
    Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _
    ByVal fPictureOwnsHandle As Long, IPic As IPicture) As LongPrivate Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal _
    nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nIcons As Long) As LongPrivate Declare Function DestroyIcon Lib "user32" (ByVal hicon As Long) As LongPublic Function GetIconFromFile(FileName As String, IconIndex As Long, UseLargeIcon As Boolean) As Picture'参数:
    'FileName - 包含有图标的文件 (EXE or DLL)
    'IconIndex - 欲提取的圉标的索引,从零开始
    'UseLargeIcon-如设置为True,则提取大图标,否则提取小图标
    '返回值: 包含标标的Picture对象Dim hlargeicon As Long
    Dim hsmallicon As Long
    Dim selhandle As Long' IPicture requires a reference to "Standard OLE Types."
    Dim pic As PicBmp
    Dim IPic As IPicture
    Dim IID_IDispatch As GUIDIf ExtractIconEx(FileName, IconIndex, hlargeicon, hsmallicon, 1) > 0 ThenIf UseLargeIcon Then
    selhandle = hlargeicon
    Else
    selhandle = hsmallicon
    End If' Fill in with IDispatch Interface ID.
    With IID_IDispatch
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
    End With
    ' Fill Pic with necessary parts.
    With pic
    .Size = Len(pic) ' Length of structure.
    .tType = vbPicTypeIcon ' Type of Picture (bitmap).
    .hBmp = selhandle ' Handle to bitmap.
    End With' Create Picture object.
    Call OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic)' Return the new Picture object.
    Set GetIconFromFile = IPicDestroyIcon hsmallicon
    DestroyIcon hlargeiconEnd If
    End Function
    在窗体中添加一个PictureBox控件和一个命令按钮,把下面的代码加入到命令按钮的Click事件中:Set Picture1.Picture = GetIconFromFile("c:\windows\moricons.dll", _ 0, True)按F5运行程序,点击命令按钮后,PictureBox会将文件moricons.dll中的图标索引为零的图标画到PictureBox中。