大家都知道一个图标文件可包含很多个图标
只要图标文件中含有32以下的图标就能添加为窗体的图标(即加到窗体Icon属性里),虽然32位的图标不能显示为窗体图标,但窗体Icon属性里已包含了32位的图标,我是这样认为的,因为生成的EXE图标在XP下就是包含在Icon属性里32位的图标
其实在VB里的控件的Picture属性也是如此,只是没法显示出来,只有通过API才能显示32位的图标请问各位有没办法把这些32位的图标提取出来,生成生的ICON,就可API函数显示出来
(说明一下,不要从图标原文件中提取)

解决方案 »

  1.   

    简单地复制一下代码,就可以看到效果Private 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 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.dll" (ByVal hIcon As Long) As Long               Private Const DI_COMPAT = &H4 'Benutzt das Standard Benutzerdefiniertes Bild
                   Private Const DI_DEFAULTSIZE = &H8 'Zeichnet das Icon/Cursor mit der Standard graae
                   Private Const DI_IMAGE = &H2 'Zeichnet nur die Bilddaten des Icons/Cursors
                   Private Const DI_MASK = &H1 'Zeichnet nur die Maske des Icons/Cursors
                   Private Const DI_NORMAL = &H3 'Zeichnet Maske und Bilddaten               Private hSmallIcons() As Long, hLargeIcons() As Long               Private Sub Form_Load()
                      Dim RetVal As Long, IconNum As Long
                   Form1.AutoRedraw = 1
                      IconNum = ExtractIconEx("c:\windows\system32\pifmgr.dll", -1, 0&, 0&, 0&)   '本文件可抽取38个图标
                      If IconNum = 0 Then
                         MsgBox "Diese Datei hat keine Icons"
                         Exit Sub
                      End If
                      HScroll1.Max = IconNum - 1
                      ReDim hSmallIcons(IconNum - 1)
                      ReDim hLargeIcons(IconNum - 1)
                      RetVal = ExtractIconEx("c:\windows\system32\pifmgr.dll", 0&, hLargeIcons(0), hSmallIcons(0), IconNum)   '抽取多少个图标随意
                   End Sub               Private Sub HScroll1_Change()
                      Me.Cls
                      RetVal = DrawIconEx(Me.hDC, 5, 5, hLargeIcons(HScroll1.Value), 0&, 0&, 0&, 0&, DI_IMAGE)  '有底色
                      DrawIconEx Me.hDC, 5, 40, hSmallIcons(HScroll1.Value), 0&, 0&, 0&, 0&, DI_NORMAL
                      Me.Refresh
                   End Sub               Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
                      On Error Resume Next
                      For i = 0 To UBound(hSmallIcons)
                          DestroyIcon hSmallIcons(i)
                          DestroyIcon hLargeIcons(i)
                      Next i
                   End Sub
      

  2.   

    好的办法有,去我的博客看一下,保证让你满意,vb中加载多个32位图也没问题.
    http://blog.myspace.cn/1307693632/EntryTitleList.aspx
      

  3.   

    你的方法可是可以,就是太麻烦了,对我来说不是很实用,因我的程序本来就包含了资源文件,VB的工程好像不能同时调用多个资源文件,要把XP图标加到我现有资源文件中不方便,要动态添加就更难了,如图标文件包含了32位以下的图标还是不行,只能用纯32位的图标文件
      

  4.   

    32位图标在VB中能用也要一太串代码,不完美,效率也不高
    追求完美的我,唉!
    VB要过时了