Windows图标-Icon文件格式分析

最近想做个随时间变化显示为时间的秒数的动态变化图标,查找了很多资料,基本都是使用BitBlt+BuildIcon或CreateIcon等API函数来生成图标,感觉操作过程比较复杂,而且在Picture使用这些函数制造图标的话,运行效果不太理想,因此想到用现有的BMP位图数据换算为ICON文件保存后再用LoadPicture载入后使用还比较合用。找了很多关于图标的资料后,中文的VB构造ICON文件说明都没找到,最后只能自己利用图标制作工具生成些图标分析结合英文的关于C语言的图标构造说明来自己摸索出合适VB使用的ICON文件格式资料,因为在CSDN也没找到VB的图标文件说明,因此将自己的一些分析心得post上来以供大家交流。
+ t7 e) ^. j! }: B+ F/ W4 aICON文件结构有点类似BMP文件,不过因为ICON文件支持多资源,所以比BMP文件多了一个索引目录的结构,以供检索文件内的各个图标资源。图像数据部分除了多一段1bpp的掩码部分以外,剩余的部分和BMP文件的位图信息段及图像信息段是相同的。
1 `4 e1 |6 Q4 ]$ o  B6 z5 z  @ 1.文件头 ' f: P( D! v% I$ f. R. N
C原型定义: $ ^+ o% }3 S' P* b8 G2 M
typedef struct 0 I1 c. [- y( L) p
{ 1 @! F; ~. ]. /$ C9 A" T! U
word           idreserved;   // reserved (must be 0)
/ d1 A: Y0 p8 k: k  C- f# g8 jword           idtype;       // resource type (1 for icons)
3 X4 M& N: J* z1 O& w# `word           idcount;      // how many images?
# E0 // ~$ }" W+ |  S" |1 g! _; /5 k+ Kicondirentry   identries[1]; // an entry for each image (idcount of 'em)
0 U7 T2 q. H5 D) i; {+ L: S' p} icondir, *lpicondir; 1 u, w% f) u% ^' V( I! Y: H
VB定义: 6 c8 H2 I! W& m& _0 t+ A
Public Type icondir
- u, @, c4 }! R; R$ w    idreserved As Integer        '; word   // reserved (must be 0):保留字必须是0: ~" o8 E6 C" G/ I2 G8 v* o
    idtype As Integer          '; word     // resource type (1 for icons):资源类型,1是图标,2就是光标了?
7 X! o2 r/ Z8 f4 S% X4 U: L    idcount As Integer          '; word      // how many images?:有几个图像资源) p. h1 H% f4 n5 w; s+ U% J
    identries() As icondirentry ' [1]'icondirentry; // an entry for each image (idcount of 'em):每个图像的入口定义3 d9 Q% v6 A. O6 ~
End Type % S  v. Y$ O- D2 B
文件内的资源个数由idcount来定义,读取文件的时候,先读入   
1 y3 {( /2 a: g9 @; t* v2 x$ Y    idreserved As Integer      
5 g+ S; E; V3 Z) G6 _" w" Z! j/ C    idtype As Integer            ' X' ]' f: ?% R( I! ~
    idcount As Integer ! c# p" f3 C. S, z7 z; c# k, j
3个变量后,再用idcount来定义identries(idcount)类型的数量。
" }: T4 l' K& D! }1 O" B' q9 Z 1.1 icondirentry结构,图标资源索引目录结构。
) I7 Z7 h3 }$ V1 P# ?( Q* {C原型定义:
9 S0 i" W6 |7 W' C& t9 |' r" N% v/ /typedef struct
& W7 [& y  Q2 }% Y$ s. D4 m{ . t9 T' W( ]" I* S
byte        bwidth;          // width, in pixels, of the image
7 O) T  Q* [/ J  j, Nbyte        bheight;         // height, in pixels, of the image
6 S: {- J1 a$ l# y$ R; obyte        bcolorcount;     // number of colors in image (0 if >=8bpp) 0 X% Y( u$ o2 y) f$ N
byte        breserved;       // reserved ( must be 0) 3 {6 t( _2 /$ E- O
word        wplanes;         // color planes
- v" r6 p9 m# {& x! G: qword        wbitcount;       // bits per pixel 0 b. u+ L' z# v
dword       dwbytesinres;    // how many bytes in this resource? 4 _& j; F. ^) ~% x5 n7 l8 R
dword       dwimageoffset;   // where in the file is this image?
8 y( K: u, s; M2 Y! w0 g} icondirentry, *lpicondirentry;
% A, ^7 E  H8 i% w! ], J VB定义:* P0 P, c1 Y! V6 d$ ]+ W1 W0 F& G" v
Public Type icondirentry
% }# H- K5 q4 z6 P) M+ v3 _    bwidth  As Byte ';byte    // width, in pixels, of the image:图像宽度,以象素为单位。一个字节
- B' ]; O) R, K    bheight  As Byte ';byte   // height, in pixels, of the image:图像高度,以象素为单位。一个字节
3 [! r- @* {4 i% k8 C9 c6 D2 B    bcolorcount  As Byte ';byte  // number of colors in image (0 if >=8bpp):图像中的颜色数(如果是>=8bpp的位图则为0) ; Q7 L9 S0 ~5 p- d4 i. |
    breserved  As Byte ';byte    // reserved ( must be 0):保留字必须是0" {4 f3 m; ?3 R' }& G+ o, Q
    wplanes  As Integer ';word   // color planes:为目标设备说明位面数,其值将总是被设为1. }+ r3 z/ S# o
    wbitcount  As Integer ';word   // bits per pixel:每象素所占位数。( N8 D$ // M/ N; i9 `5 b9 }
    dwbytesinres  As Long   ';dword   // how many bytes in this resource?:这份资源所占字节数) Q$ }, J- a1 G; O# T2 g* v9 r
    dwimageoffset  As Long ' ;dword   // where in the file is this image?:图像数据(iconimage)起点偏移位置。, K: ^# i8 E2 m7 `4 Z6 i! I2 W
End Type ' icondirentry
- N8 e" W& `& X1 y0 /其中dwbytesinres记录了该目录指向的图像数据区的尺寸,dwimageoffset指的是该段目录指向的图像数据段的起点在整个文件中的偏移量。
& Q' c* x$ c* T3 N3 D+ m) V6 |0 z. R 2.图像数据段 ( g! ?. S7 e3 l3 ~2 ]% E
C原型定义: 5 a) /7 A; K! p& f
typdef struct
! o/ B/ A/ p- I- p+ i{
& [5 P, k. _) d+ n3 pbitmapinfoheader   icheader;      // dib header
0 y  a3 b# B: n: n* Hrgbquad         iccolors[1];   // color table 6 |, r) w* k- p1 O- ?6 ^8 J
byte            icxor[1];      // dib bits for xor mask 6 @9 m7 E- q7 R+ L* T
byte            icand[1];      // dib bits for and mask
! x9 D* /" m- D! ?9 m) M# T} iconimage, *lpiconimage;
3 P9 c' S: i5 l' s# / VB定义:
% s) N+ m+ b8 w5 p5 n( LPublic Type iconimage '{
8 O# @+ `2 E7 A    icheader As bmih ';DIB位图信息头:bitmapinfoheader // dib header,注:bmih 是我简化了bitmapinfoheader的名称。
4 Y3 I3 P( Z- [% J$ ~% d  z; F5 n                     ' used: bisize, biwidth, biheight(xorH+andH)即2倍高度, biplanes, bibitcount, bisizeimage.
  h8 o* w, J2 D# ?                     'all other members must be 0.
4 A5 w$ A1 u; T4 K    iccolors() As rgbq   '[1]';色彩表:rgbquad   // color table
5 k4 h, z6 U4 l) T* u    icxor() As Byte   '[1];byte  // dib bits for xor mask:DIB结构的图像数据。XOR掩码?
" j; }) b+ S' A' z1 E% `. ~# r. V                     '本文讨论的格式以16色的ICON文件为主,每字节表示两个象素4bpp。
9 N( k+ d8 V: e( z$ J; G                     '对于256色的文件,icxor数组每字节表示一个象素即:8bpp。
8 A8 u4 P1 n: [1 B2 c    icand() As Byte '[1];byte  // dib bits for and mask:DIB结构的图像数据。AND掩码?1bpp- q% ~  Q, C4 l2 l1 P# Z* {  s
End Type '} iconimage " y1 s7 h0 {  F% X5 ?
其中的icheader采用的是DIB结构的BMP文件(常用)的位图信息头的定义类型(参见BMP文件结构分析),但是其中使用的关键变量只用到:bisize, biwidth, biheight, biplanes, bibitcount, bisizeimage.几个,其他变量必须为0。其中的biheight变量和BMP文件里稍有不同,在BMP文件里,该变量指的是文件的高度象素量,而在ICON文件里,可能由于采用了两段掩码图像数据的缘故,该变量的值一般设定为高度象素量的2倍。
/ H3 {; X( /% c! p色彩表iccolors的尺寸由文件使用的色彩数量决定,对于16色的图像数据为:iccolors(0 to 15),对于256色的图像数据为:iccolors(0 to 255)。但这个数量不是绝对的,
) /& Z( s0 N) v9 o最后定义的时候还是应该由icheader中的bisize, biwidth, biheight, bibitcount变量和索引目录中的dwbytesinres计算得出 =(dwbytesinres - biSize - AndMaskall - (biHeight / 2) * Lb)/4  ' 其中AndMaskall为1bpp那段掩码的尺寸,Lb为每行象素所占的字节数。
5 R* w( F2 S6 Q$ u  t, yicxor数据尺寸为Lb乘以图标高度(biHeight / 2)。icand尺寸为1bpp的掩码数据段每行所占字节数乘以图标高度(biHeight / 2)。
' t+ @7 L; C( a" P/ L) h5 R每行象素所占字节数 =((icheader.biWidth * icheader.biBitCount + 31) And &HFFFFFFE0) / 8,是4的倍数,象素位数不够4倍数的用&H00补齐。 % L8 I, @5 F) Z% n+ ?, V+ Z- F
掩码的用途:
$ n' S( _3 m# k3 x: e! A'    AND位掩码   XOR位掩码       显示'
& D( b  a+ k2 h9 i) B& W/ R'    -------------------------------------------'
. @( V( A1 V6 j" z. |'    0                            0                  黑色'
; Z" ~' W" D4 }. E( @9 {& C) e'    0                            0-F              调色板指定色'
7 ]2 ]7 n. ^8 u3 G+ l) k8 F'    1                            0                  屏幕,透明'3 K8 e& A( p/ q9 c' r1 d8 M7 h- j: Q
'    1                            1                   屏幕的反色,一般不用。
! E1 J8 z3 b0 ]0 |
9 Z! I2 y/ a2 }( c' _  I4 p+ [ 2.1 DIB位图信息头:bitmapinfoheader:icheader As bmih
0 i% /2 M: x; A" N( B) YC原型定义:
2 e8 C, m+ m; l* Y$ E9 P4 O% Mtypedef struct tagBITMAPINFOHEADER { /* bmih */
5 v& [0 ^/ m9 L2 ]+ x0 ~DWORD biSize;
: ~- m2 M  D3 z+ D  TLONG biWidth;
3 T. ~( |5 P1 ~9 }LONG biHeight; ' ^6 x$ e8 ?5 ]0 B* [
WORD biPlanes; 9 v0 I- L. A) A$ G- i3 c8 i
WORD biBitCount;
! T7 d1 b2 j6 b/ }: K0 t9 n7 YDWORD biCompression;
2 |. O# Q  Y  b' a' wDWORD biSizeImage;
; z! T- V! E( r& dLONG biXPelsPerMeter;
) E' M+ H, J4 n) m& ZLONG biYPelsPerMeter;
  |/ M+ D! T. N  wDWORD biClrUsed;
! v# ~8 L8 O8 T- J0 L0 ^8 f5 kDWORD biClrImportant;
  ^) [- ^- A+ |0 K4 F: O/ @4 f9 N} BITMAPINFOHEADER;
6 y; /8 K" b( A# I9 U6 t5 / VB定义: ) d; z) M2 ^, w2 d2 z( j3 w' G/ ?
'--------------------位图信息头,BITMAPINFOHEADER
: c$ E0 Y- q% m! M'说明BITMAPINFOHEADER结构,其中包含了有关位图的尺寸及位格式等信息
9 R: P( I  m% Q; B$ IPublic Type bmih    'BITMAPINFOHEADER ,bmiHeader;/ w1 u2 n5 I& ^( {0 /: H2 Y# P* F
    biSize As Long 'DWORD ;Bitmap Header Size,BITMAPINFOHEADER段尺寸。*3 I# z* Y' U! P
    biWidth As Long 'LONG ;Width 1 dword 位图的宽度,以象素为单位*6 M3 W1 g0 [7 k; }% x  p8 _' L. }  a
    biHeight As Long 'LONG ;Height 1 dword 位图的高度,以象素为单位*5 d/ @% S3 V9 l, i7 o% `. C$ ^
    biPlanes As Integer 'WORD lanes 1 word 位图的位面数(注:该值将总是1)*& L& u& e  M  G1 S& p$ P% X
    biBitCount  As Integer ';WORD;Bits Per Pixel,每个象素的位数*
" C* V( f- `. i7 N5 N    biCompression  As Long ';DWORD,Compression,压缩说明:; Z$ r) ^" L% `& Q& @/ d
    biSizeImage  As Long ';DWORD;Bitmap Data Size 1 dword 用字节数表示的位图数据的大小。该数必须是4的倍数*8 K) u* q+ Q% B9 z. U4 |& v* e) ]
    biXPelsPerMeter  As Long ';LONG;HResolution 1 dword 用象素/米表示的水平分辨率
- ~2 X( _3 B) L    biYPelsPerMeter  As Long ';LONG;VResolution 1 dword 用象素/米表示的垂直分辨率
( v( [9 z5 q4 i0 ~5 W% ?# T    biClrUsed  As Long ';DWORD;Colors 1 dword 位图使用的颜色数。如8-比特/象素表示为100h或者 256.
7 G$ /3 D3 H# G% d/ K    biClrImportant As Long ';DWORD;Important Colors 1 dword 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
) H3 I; B7 a9 F; L6 }4 n2 `  rEnd Type
! _2 E$ O, Q; B在ICON文件中使用的关键变量只用到: bisize, biwidth, biheight, biplanes, bibitcount, bisizeimage.几个,其他变量必须为0。biheight变量的值为高度象素量的2倍。 3 ?' S% L  H- L1 @) W0 R
关于BITMAPINFOHEADER的更多介绍参见BMP文件格式分析的文章,在此不作冗述。
2 t+ b0 H+ C% p 2.2色彩表:rgbquad:iccolors() As rgbq
! U2 c4 Y: p- n5 }[摘自:BMP文件格式分析:彩色表包含的元素与位图所具有的颜色数相同,象素的颜色用RGBQUAD结构来定义。对于24-位真彩色图象就不使用彩色表(同样也包括16位、和32位位图),因为位图中的RGB值就代表了每个象素的颜色。彩色表中的颜色按颜色的重要性排序,这可以辅助显示驱动程序为不能显示足够多颜色数的显示设备显示彩色图象。RGBQUAD结构描述由R、G、B相对强度组成的颜色,定义如下]
2 }3 T4 W3 z: S8 P# F1 `+ zC原型定义: 7 e/ v! w& c1 ^! S- A( D: t
typedef struct tagRGBQUAD { /* rgbq */ 5 U& e* w; l) s0 I0 m! }7 T
BYTE rgbBlue; ) |+ w- j1 f: T4 ~" Z' R9 Z
BYTE rgbGreen;
* N3 T5 /4 x) a% Q. WBYTE rgbRed; ! K+ o& @1 ]1 ?/ l, H
BYTE rgbReserved;
% R& i/ ^+ m1 n} RGBQUAD;
* J0 Y( t2 v# N$ H4 r VB定义:
9 y- w/ s* m" a8 p) O4 K" H% L: ] '-----------------色彩表; S. p! W( j  o! E
'说明彩色表RGBQUAD结构的阵列,其中包含索引图像的真实RGB值。, r' t7 G2 J& v. x& B7 b
Public Type rgbq    'RGBQUAD, bmiColors[];) p! l  l, T) J8 p
    rgbBlue As Byte   ' 指定蓝色强度( v7 [1 T: b1 M* y% ]# J# W. M* f5 a
    rgbGreen As Byte ' 指定绿色强度
) /0 Z1 y+ s3 n* Q2 I    rgbRed As Byte ' 指定红色强度
; I7 t* o; O3 C; a5 G( M    rgbReserved As Byte ' 保留,设置为0
% Z! V" [: A( r+ K* {6 p) ?End Type 2 /: P) S7 G* x8 V/ U$ C
色彩表的定义也是来自BMP文件结构的定义,定义的类型格式和BMP文件的相同。 6 s4 ]% ?1 L5 m; j( f' s9 K# Z
3.ICON文件的完整结构
$ S; G3 l! v/ b Public Type icondirentry " S4 ~3 J2 T& u9 y, Y
    bwidth  As Byte ';byte    // width, in pixels, of the image:图像宽度,以象素为单位。一个字节   `8 c% /9 g3 ]- _
    bheight  As Byte ';byte   // height, in pixels, of the image:图像高度,以象素为单位。一个字节
0 G  Y' U1 P2 B5 h( /- Y0 g% h& A2 t    bcolorcount  As Byte ';byte  // number of colors in image (0 if >=8bpp):图像中的颜色数(如果是>=8bpp的位图则为0)
/ B- E" ?! t3 V% |    breserved  As Byte ';byte    // reserved ( must be 0):保留字必须是0 4 U" P6 _0 V. j- E8 e: N; R
    wplanes  As Integer ';word   // color planes:为目标设备说明位面数,其值将总是被设为1 . P0 {' }2 m3 N2 v6 o: N$ H2 r
    wbitcount  As Integer ';word   // bits per pixel:每象素所占位数。
( i. f2 {, v  ]  V4 B. h9 X# l    dwbytesinres  As Long  ';dword   // how many bytes in this resource?:这份资源所占字节数
# f1 U* l9 l! C8 c    dwimageoffset  As Long ';dword   // where in the file is this image?:图像数据(iconimage)起点偏移位置。
7 R2 b$ g3 o) j8 m/ b3 h End Type ' icondirentry
  D4 M5 Q( W% W) F6 k% s7 /" E Public Type icondir * `% e, k# v# `
    idreserved As Integer       '; word   // reserved (must be 0):保留字必须是0
( N- f: Y0 `4 c2 K. v: q- e    idtype As Integer           '; word     // resource type (1 for icons):资源类型,1是图标,2就是光标了?
! k& z0 o8 J& |. P2 @9 b    idcount As Integer          '; word      // how many images?:有几个图像 ! H. x. C, G( |# A7 F8 G, /+ y$ W9 z) @
    identries() As icondirentry '[1]'icondirentry; // an entry for each image (idcount of 'em):每个图像的入口定义 . `8 B: G* b$ G% I0 d4 R# L
End Type
5 z, i, u* N& Q" [ Public Type bmih    'BITMAPINFOHEADER ,bmiHeader; ) T- N. t* u/ [3 T9 H
    biSize As Long 'DWORD ;Bitmap Header Size,BITMAPINFOHEADER段尺寸。*
: D* h" s7 t+ _    biWidth As Long 'LONG ;Width 1 dword 位图的宽度,以象素为单位* # b/ l2 d. Z; l7 Q3 B' s) w
    biHeight As Long 'LONG ;Height 1 dword 位图的高度,以象素为单位*
9 R# d' I7 b" ^5 q" x$ Q; `3 g. o' z    biPlanes As Integer 'WORD lanes 1 word 位图的位面数(注:该值将总是1)*
. x8 U6 y7 M7 O. I: z& f; ]  P    biBitCount  As Integer ';WORD;Bits Per Pixel,每个象素的位数* 7 v! Y+ ?% C  @+ G/ a/ }- e- P
    biCompression  As Long ';DWORD,Compression,压缩说明:
/ O' _- X! S  g0 D    biSizeImage  As Long ';DWORD;Bitmap Data Size 1 dword 用字节数表示的位图数据的大小。该数必须是4的倍数*
1 {0 }  H  _5 k1 H% m3 x2 m    biXPelsPerMeter  As Long ';LONG;HResolution 1 dword 用象素/米表示的水平分辨率 ) s) L" @7 C/ b- M. g" `
    biYPelsPerMeter  As Long ';LONG;VResolution 1 dword 用象素/米表示的垂直分辨率
( q, v1 H6 Y6 R- R5 ]: h1 w* ~    biClrUsed  As Long ';DWORD;Colors 1 dword 位图使用的颜色数。如8-比特/象素表示为100h或者 256.
" G0 /  l/ d; _+ d    biClrImportant As Long ';DWORD;Important Colors 1 dword 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
: /2 R/ O$ k  `6 o0 I; D  R4 j End Type
: f& L* Q9 X1 ?- L( ^" F$ J2 s Public Type rgbq    'RGBQUAD; 2 s0 N. b/ V6 k8 r6 z" ?
    rgbBlue As Byte  ' 指定蓝色强度 * H: @8 W0 q' /4 T$ L2 ~* `
    rgbGreen As Byte ' 指定绿色强度
4 s- m8 U0 a: |/ Z    rgbRed As Byte ' 指定红色强度
0 B5 n( D' E' w7 g* H$ i, ]7 |; M    rgbReserved As Byte ' 保留,设置为0 5 R' i, r: S4 X# e2 k( K
End Type
8 u* A1 I' U) k6 d% G7 m+ n Public Type iconimage '{
1 [0 a4 D8 S7 I( e& f, y: P) F    icheader As bmih ';DIB位图信息头:bitmapinfoheader // dib header,注:bmih 是我简化了bitmapinfoheader的名称。 ; n- r/ m- Q/ }' `; ]: C! j
                     ' used: bisize, biwidth, biheight(xorH+andH)即2倍高度, biplanes, bibitcount, bisizeimage. % d9 z* S  x6 ?+ k& @; d$ R! ?
                     'all other members must be 0. , L; O9 C+ I! h/ K; A
    iccolors() As rgbq  '[1]';色彩表:rgbquad   // color table 1 x4 A$ r3 }  ^2 }% h
    icxor() As Byte  '[1];byte  // dib bits for xor mask:DIB结构的图像数据。XOR掩码?4bpp
, q9 @7 {" f5 g" `% K" U( o2 a4 g$ /7 K    icand() As Byte  '[1];byte  // dib bits for and mask:DIB结构的图像数据。AND掩码?1bpp ! A, P/ `) h. u6 Q# M1 _' ]7 g
End Type '} iconimage
( O, }+ a7 p  m, ~3 }6 ] Public Type Iconfile0 |$ |4 I. v3 D" c( F" d
    iDir As icondir     '目录
7 S* e2 M7 ]4 w# B9 H, K8 x    imgDate() As iconimage  '图像数据段
. @, I# C8 ]7 x/ w1 Z End Type 6 J1 j2 @& @  r7 d' A7 X8 H/ [
由结构定义得知,ICON文件由目录段和图像数据段组成。完整的结构示意图如下:
$ N1 p7 _( g  _3 R5 x) i! g5 _+ ? '-------------完整的文件构成
3 M8 R5 ]) |  t7 [0 s, @- s0 Y' r) f+---目录段  ]4 L# V: G8 C  M
    +------目录头. d1 v" k' d* m$ r. W6 b
    idreserved As Integer       '; word   // reserved (must be 0):保留字必须是00 U/ y. [9 y# |
    idtype As Integer           '; word     // resource type (1 for icons):资源类型,1是图标,2就是光标了?
8 s) V+ d# r4 q/ Z. ^    idcount As Integer          '; word      // how many images?:有几个图像
0 b& q# k/ O* [2 Z0 B    +-------------目录索引1
3 N9 P2 E( j" f2 e* F    identries(0) As icondirentry
9 P* r. f- ^$ u: r+ e. R! V8 T    +-------------目录索引2
6 A- I  _8 m" ~4 {2 J+ m    identries(1) As icondirentry2 Q- P: p+ B5 k$ a6 s% h: {
    +-------------目录索引x最大为32767
$ s: v; d% C# f  }( S/ H/ Q, ]# n5 n    identries(X) As icondirentry
- N# Q8 G$ d. a' E+---图像数据段" ], v  m# Q3 H0 u2 I
    +--------------图像12 w) y3 l0 x* N! A8 d9 f3 v' O
    icheader As bmih, ?7 K+ `; k; W: ], d+ X/ U
    iccolors(0 to 15) As rgbq '16色7 J4 g8 |2 V9 z5 u
    icxor(0 to 511) As Byte   '32*32
6 z; |: |4 j7 a# A+ _3 m    icand(0 to 127) As Byte   '32*32
& E3 M& `9 r+ o# t    +--------------图像2. o, Q# |2 v2 d& [
    .
2 i% b8 N4 a2 Y$ R3 X: c    +--------------图像x最大为32768    ! L) h2 Q0 n3 ?$ S3 ?8 e
    .: j3 R1 _% `; p
'--------------END file. : H8 w/ i! F+ ?6 u+ D' h8 f
通过以上结构,你就可以方便的读写ICON文件并制作属于你自己的ICON文件编辑器了。 ' U: A0 C5 Z$ B& u; D
4.显示ICON图像的方法之一
5 s: x! b/ @! t6 {7 /8 b8 ?我们大家都知道用LoadPicture可以直接加载ICON文件,在此向大家介绍另外一种显示方法,相信会使你得到一些启发。 : X0 H; F! |2 e. n
在此用到几个API函数: 4 x( ^, J  m. {6 m. c
'ICON图像描述
7 `" j( t0 S- F Public Type ICONINFO      
5 {: M; H  }" A        fIcon As Long ' r1 ~. |4 g* ~8 p; {  [
        xHotspot As Long ' o; b" j! t  j1 S
        yHotspot As Long 7 U) v' {- U) u- X3 V5 k& H4 r
        hbmMask As Long $ |6 w% t7 x2 j' ]# @
        hbmColor As Long
% S) ?: q9 c5 d End Type
/ d. k/ i& q& A( _3 P2 q4 F" p2 v 'CreateIconFromResource 函数通过ICON图像资源位描述信息创建一个图标或光标,presbits:图像资源起始点指针,dwResSize:图像数据尺寸,fIcon:TRUE为图标、FALSE将创建一个光标,dwVer:指定创建的图标的版本号(Windows 2.x =&H20000、Windows 3.x =&H30000 ,在WIN32程序中使用的都是Windows 3.x格式)。失败返回NULL,成功则返回创建的图标的句柄(handle )。
3 Q  ~) P( x! ODeclare Function CreateIconFromResource Lib "user32"  (presbits As Byte, ByVal dwResSize As Long, ByVal fIcon As Long, ByVal dwVer As Long) As Long
0 i4 O, o7 @' I) w 'GetIconInfo 函数取得与图标有关的信息。返回非零表示成功,零表示失败。函数返回时,由ICONINFO结构载入的位图必须由应用程序删去。hIcon 为由CreateIconFromResource 函数创建的图标的句柄即:CreateIconFromResource 函数的返回值。
, I0 h" y$ f$ t& O: QDeclare Function GetIconInfo Lib "user32" (ByVal hIcon As Long, piconinfo As ICONINFO) As Long
$ h1 d, ?9 j) g; i ' CreateIconIndirect 函数通过GetIconInfo函数取得的ICONINFO(图标信息)创建一个图标,执行成功返回图标的句柄,零表示失败。 * x2 e% S3 n* U
Declare Function CreateIconIndirect Lib "user32" (piconinfo As ICONINFO) As Long
8 C6 e8 d% t# i5 n6 V 'DrawIcon 函数在指定设备的指定位置画一个图标。返回非零表示成功,零表示失败。hdc:设备关联句柄,x/y:绘制图像的起点位置,hIcon:图标的句柄。
. i( g) u" P) v: ~5 cDeclare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal hIcon As Long) As Long
1 ]1 |: k% D0 f  @' @6 x( Q 'DestroyIcon 函数清除创建的图标以释放其占用的内存。返回非零表示成功,零表示失败。hIcon:图标的句柄。
5 Q7 A$ m5 _: `: S/ `) dDeclare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long " o! {$ U! L) `% l  P, f6 o9 J
通过上面的函数说明可见,我们可以单单使用图像信息来创建一个图标,即上面的iconimage结构。下面是以32×32象素,16色单资源图标文件为例的例子:
" C: /! R; R# d) t5 z4 u Dim tmphIcon As Long
: t# ^- U2 M( S) o% Q2 lDim IconShow() As Byte
! E$ }8 X- o, rPrivate Sub Command4_Click()  E9 U, n2 s# y. g) c
        Dim lTemp As Long
) u+ u3 I5 E* @        Dim lSize As Long        # H0 b  `/ V4 j6 z9 |/ v2 M
        Dim freefn As Integer        7 W- a! s* R6 i4 X+ o
        ReDim IconShow(743)  '等同于前面第3节中定义的iconimage结构。
% s3 o; K9 U- v    freefn = FreeFile * {; Y. i& q% |9 F  P5 ]3 b6 k1 C
    Open App.Path + "/11.ico" For Binary As #freefn
3 H# b+ [3 ~+ |0 Q) M9 k  V        Seek #freefn, 23
2 G: ]3 /* p( Y# p6 I, B$ ^        Get #freefn, , IconShow - k2 X! P$ ^: Y+ n" u) c# h' Z
    Close #freefn 2 s/ E0 ~2 E# D8 b3 F
    '---------------------------直接加载图标。! b5 L# V7 n+ T  Y  @
        lTemp = DestroyIcon(tmphIcon)
6 }6 w: b' w" R+ }$ t+ G2 Y        Picture3.Cls
8 }# M' N0 _* [; T2 c9 K        lSize = 744
5 ?  ]7 i1 p+ F5 D  r7 M        lTemp = CreateIconFromResource(IconShow(0), lSize, 1, &H30000) : N  S$ g$ z' ~: Q8 Y+ Z6 g  }# [
        DrawIcon Picture3.hdc, 0, 0, lTemp $ n: s) Y4 @8 l' g  ~) @; I
        Picture3.Refresh
/ G; D4 K4 ~3 T2 _        tmphIcon = lTemp : s2 D6 w/ R- O: }3 o5 I
End Sub
. ?3 m3 m! m# X以上代码只是取到抛砖引玉的作用,并不表明任何其他意图。同样,使用CreateIconIndirect 函数创建的图标也可以直接用DrawIcon 函数函数显示。 " _3 W1 E$ a3 H) d
5.参考资料! u0 F  [: R4 g0 t* U, O/ f% c
【BMP文件格式分析(zz)- -】: http://lhbyron.blogchina.com/652956.html 3 W8 ^& Y' [! L& V
【icons in win32】: http://www.moon-soft.com/program/FORMAT/windows/icons.htm

Windows图标-Icon文件格式分析相关推荐

  1. Windows变慢原因分析及解决方法·系统篇

    Windows变慢原因分析及解决方法·系统篇 系统加速 一 [Windows 98 ] 1.不要加载太多随机启动程序 不要在开机时载入太多不必要的随机启动程序.选择"开始→程序→附件→系统工 ...

  2. Windows 变慢原因分析及解决方法

    Windows变慢原因分析及解决方法 谁都希望计算机一开机就可以立即进入Windows系统而不用等待,或者是系统在使用的时候不会越来越慢,但由于种种原因常常使这些愿望不能实现,甚至一开机就死机或者用着 ...

  3. AWStats简介:Apache/Windows IIS的日志分析工具的下载,安装,配置样例和使用

    http://www.chedong.com/tech/awstats.html 你完全不必耐心看完所有内容:简要安装说明如下 安装 http://sourceforge.net/projects/a ...

  4. AWStats简介:Apache/Windows IIS的日志分析工具的下载,安装,配置样例和使用(含6.9中文定义补丁)...

    你完全不必耐心看完所有内容:简要安装说明如下 安装 http://sourceforge.net/projects/awstats/ 下载安装包后: GNU/Linux:tar zxf awstats ...

  5. AWStats简介:Apache/Windows IIS的日志分析工具的下载,安装,配置样例和使用(含6.9中文定义补丁)

    你完全不必耐心看完所有内容:简要安装说明如下 安装 http://sourceforge.net/projects/awstats/ 下载安装包后: GNU/Linux:tar zxf awstats ...

  6. zt BMP 文件格式分析

    看到这文章不错,于是帖了上来.呵呵 BMP文件格式分析(zz) 前两天要做一个读取bmp文件的小程序,顺便查找了一些关于BMP格式的文章,现在post上来. 简介 BMP(Bitmap-File)图形 ...

  7. PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法

    在日常应用中,某些程序往往会被第三方程序下钩子(hook).如果被下钩子的进程是我们的进程,并且第三方钩子严重影响了我们的逻辑和流程,我们就需要把这些钩子摘掉(Unhook).本件讲述一种在32位系统 ...

  8. PE文件和COFF文件格式分析——导出表

    在之前的<PE可选文件头>相关博文中我们介绍了可选文件头中很多重要的属性,而其中一个非常重要的属性是(转载请指明来源于breaksoftware的CSDN博客) IMAGE_DATA_DI ...

  9. PE文件和COFF文件格式分析--概述

    刚工作的时候,我听说某某大牛在做病毒分析时,只是用notepad打开病毒文件,就能大致猜到病毒的工作原理.当时我是佩服的很啊,同时我也在心中埋下了一个种子:我也得有这天.随着后来的工作进行,一些任务的 ...

最新文章

  1. 老咸鱼今天告诉你用Python matplotlib 各种图绘制流线图,难怪老板放纵他
  2. Git 之fatal: remote origin already exists 错误解决办法(通俗易懂)
  3. js事件监听器用法实例详解
  4. boost::pfr::detail::offset_based_getter相关的测试程序
  5. ssh全屏退出的办法
  6. 使用 matlab 数字图像处理(六)—— 空域滤波
  7. 【音乐欣赏】《Sunflower》 - Post Malone / Swae Lee
  8. 【luogu P1156 垃圾陷阱】 题解
  9. [linux] C语言Linux系统编程-做成守护进程
  10. 物联网无线技术蓝牙和WiFi的区别有哪些?
  11. OligoGreen染料|花菁类(Cyanine系列)-引物、Oligo核酸、多肽标记染料
  12. mac查看电脑系统位数
  13. Coursera 申请助学金流程和材料
  14. window系统中,交换键盘中win键和ctl键
  15. XP系统下MSDTC不可用解决办法
  16. Android平板做win10显示器,win10怎么投影到安卓平板上
  17. movielens数据集导入mysql_我来做数据--如何对数据进行处理以满足机器学习技术(一):MovieLens数据...
  18. 通过ITEM查找 批号和所在库位
  19. 【机器学习概念笔记】:空间概念
  20. 主成分分析二级指标权重_SPSS主成分分析|指标权重值计算真的不难!(上)

热门文章

  1. linux系统不能用投影仪,Linux连接投影仪(ubuntu)失败或显示不正常--未测试
  2. 【读书笔记】信贷周期的产生
  3. Ubuntu忘记超级用户root密码,重新设置密码
  4. HP惠普打印机驱动安装详解
  5. 嵌入式的汉字原来是这样显示的?
  6. 【CAD.Net】第四课:添加实体类和符号表到图纸
  7. 在北京,有房有车的中年男女最好欺负
  8. 【web前端开发教程】
  9. CSS-浏览器缩放使边框大小改变,导致布局改变的问题
  10. 关于程序员发展的一些遐想-个人笔记