Modest的专栏

专注于Microsoft软件开发技术,分享Microsoft软件开发心得、经验与体会。

原创 VB6中使用32位图标收藏

新一篇: 突破:VB6中使用安全多线程 | 旧一篇: 利用 Microsoft 的 HTML 分析器来获得 Web 站点的数据

    看到带Alpha通道的32位图标那绚丽性感的外表,对于无法逃离“爱美之心人皆有之”这句俗话的人(包括我)早就垂涎三尺了。感谢微软给我们选择美丽的机会,能让我们自己的软件也在外表上成为让别人倾慕甚至以身相许的筹码。想起来容易,做起来才发现整容工作原来还真没那么简单。对于饱读“有志者事竟成,破釜沉舟百二秦关终属楚......”的我......嗯嗯嗯,夸张的天昏地暗、飞沙走石...... 终于皇天不负苦心人(又来了,其实我官方身份是诗人。)一个Very very简单的类诞生了。说了一堆废话,还是贴上源码吧,免得被人唾骂。
(声明:魏滔序原创,转贴请注明出处。)

请到这里下载源码:http://download.csdn.net/source/451058

'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'
  VB6中使用32位图标
'
  Programmed by 魏滔序
'
  WebSite: http://www.chenoe.com
'
  Blog: http://blog.csdn.net/Modest
'
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
Option Explicit

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 ByteByVal dwResSize As LongByVal fIcon As LongByVal dwVer As LongByVal cxDesired As LongByVal cyDesired As LongByVal uFlags As LongAs Long
Private Declare Function DrawIconEx Lib "user32.dll" (ByVal hdc As LongByVal xLeft As LongByVal yTop As LongByVal hIcon As LongByVal cxWidth As LongByVal cyWidth As LongByVal istepIfAniCur As LongByVal hbrFlickerFreeDraw As LongByVal diFlags As LongAs Long
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As LongAs Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private m_Data() As Byte
Private m_iCount As Integer
Private m_iDir As ICONDIR

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

Public Property Get Height(Optional ByVal Index As LongAs Long
    Height 
= m_iDir.idEntries(Index).bHeight
End Property

Public Property Get Width(Optional ByVal Index As LongAs Long
    Width 
= m_iDir.idEntries(Index).bWidth
End Property

Public Property Get Length(Optional ByVal Index As LongAs Long
    Length 
= m_iDir.idEntries(Index).dwBytesInRes
End Property

Public Property Get Data(Optional ByVal Index As LongAs Byte()
    
Dim o As Long, l As Long, d() As Byte
    o 
= m_iDir.idEntries(Index).dwImageOffset
    l 
= m_iDir.idEntries(Index).dwBytesInRes
    
ReDim d(l - 1)
    CopyMemory d(
0), m_Data(o), l
    Data 
= d
End Property

Public Function LoadFromData(Data() As ByteAs Boolean
    
Dim i As Long
    m_Data 
= Data
    CopyMemory m_iCount, m_Data(
4), 2                      '取得图标个数
    If m_iCount > 0 Then
        
ReDim m_iDir.idEntries(0 To m_iCount - 1)          '图标目录结构数据
        For i = 0 To m_iCount - 1
            CopyMemory m_iDir.idEntries(i), m_Data(
6 + Len(m_iDir.idEntries(i)) * i), Len(m_iDir.idEntries(i))
        
Next
        LoadFromData 
= True
    
End If
End Function

Public Function LoadFromFile(ByVal FileName As StringAs Boolean
    
Dim hFile As Integer
    
Dim Data() As Byte

    
If Dir(FileName) = "" Then Exit Function
    
    hFile 
= FreeFile
    Open FileName 
For Binary As #hFile
    
ReDim Data(LOF(hFile) - 1)
    
Get #hFile, , Data
    Close #hFile

    LoadFromFile 
= LoadFromData(Data)
End Function

Public Function Draw(ByVal hdc As LongByVal x As LongByVal y As LongOptional ByVal Index As Long = 0As Boolean
    
Dim d() As Byte, l As Long, r As Long, w As Long, h As Long
    d 
= Data(Index): l = Length(Index)
    w 
= Width(Index): h = Height(Index)
    r 
= CreateIconFromResourceEx(d(0), l, 1&H30000, w, h, 0)
    Draw 
= DrawIconEx(hdc, x, y, r, w, h, 003<> 0
    DestroyIcon r
End Function

Private Sub Class_Terminate()
    
Erase m_Data
End Sub

示例代码:

Private Sub Command1_Click()
    
Dim Icon As New Icon
    
Dim IconIndex As Long
    
    IconIndex 
= 3 '要显示的图标在图标组中的索引
    Icon.LoadFromFile App.Path & "a.ico"
    
    
Me.Cls
    Icon.Draw 
Me.hdc, (Me.ScaleWidth - Icon.Width(IconIndex)) / 2, (Me.ScaleHeight - Icon.Height(IconIndex)) / 2, IconIndex
    
Me.Refresh
    
    
Set Icon = Nothing
End Sub

发表于 @ 2008年05月06日 11:27:00|评论(loading...)|编辑

新一篇: 突破:VB6中使用安全多线程 | 旧一篇: 利用 Microsoft 的 HTML 分析器来获得 Web 站点的数据

评论

#SilenceNet 发表于2008-05-06 17:58:19  IP: 124.228.119.*
好东西!转走了。。
明天把使用位图的按钮改了。。^_^
谢谢分享。。
#myjian 发表于2008-05-06 18:56:55  IP: 117.45.183.*
呃.....这里的SF也没得坐-_-
#crapro 发表于2008-05-06 21:27:13  IP: 218.17.221.*
呵,好。收藏了。
#zzyong00 发表于2008-05-06 21:55:44  IP: 59.46.24.*
顶顶,收了
#penguinMII 发表于2008-05-07 15:24:32  IP: 123.191.249.*
提示下标越界
Width = m_iDir.idEntries(Index).bWidth

是我的ICO有问题吗?????

能不能把程序打包发到我的邮箱一下呢?

penguinworkroom@163.com
#Modest 发表于2008-05-07 16:35:54  IP: 124.65.175.*
请查收邮件
#dingzhihui 发表于2008-05-07 18:11:44  IP: 221.220.31.*
和楼上同样的问题
能给我一份吗.谢谢
hidhid2003@163.com
#Modest 发表于2008-05-07 18:37:55  IP: 124.65.175.*
请楼上也查收一下邮件
#Modest 发表于2008-05-07 18:39:12  IP: 124.65.175.*
说明你的图标组中没有索引3,可以通过Count属性来判断。
更改这句就好了:
IconIndex = 0 '要显示的图标在图标组中的索引
#chyklx 发表于2008-05-11 17:30:26  IP: 123.65.102.*
能给我一份吗.谢谢
chyklx@qq.com
#Modest 发表于2008-05-11 21:23:55  IP: 125.33.238.*
请到这里下载:http://download.csdn.net/source/451058
#zskq1 发表于2008-05-18 22:24:09  IP: 59.58.200.*
能给我来一份吗?老大,谢谢!
zskq520@kq88.com
#Modest 发表于2008-05-19 10:24:13  IP: 124.65.175.*
to 楼上
请到这里下载源码:http://download.csdn.net/source/451058
#zf349057379 发表于2008-05-20 01:45:07  IP: 124.225.43.*
现在下载不了 ,真急死人了 ,楼主看见后能发源码到我
邮箱? zf349057379@126.com 万分感谢啊
#Modest 发表于2008-05-20 09:08:34  IP: 124.65.175.*
请zf349057379查收邮件
#mickey813 发表于2008-09-18 00:44:46  IP: 121.12.9.*
好~~~~
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © Modest