回家念经(kv300)--编程之禅

程序不过是梦,生于无形无象的禅中,我们只是那做梦的人。

ICON资料

VCHelp coPathway ISee project
编译: YZ
电邮: yzfree@sina.com
日期: 2000-8-5


ICON资料

根据VC5联机帮助中有关图标的资料翻译而成







图标

图标是一张图片,它是由一张位图和一个掩码图像产生的透明图像区域。以下内容描述了怎样创建、显示、销毁和复制图标。


关于图标(About Icons)

在Windows系统中图标随处可见,它一般用来描述一个对象,比如文件、文件夹、快捷方式、应用程序、以及各种文档。在Win32 API中的图标函数可以允许应用程序来创建、读取、排列和销毁图标。
有关用特定图标来代表某一种文件类型的资料,请参见Icon Handlers一节。


图标的热点(Icon Hot Spot)

图标中的某一个像素被指定为热点,操作系统将根据这个点来跟踪和定位图标。一般情况下,图标的热点都是定位在图标的中心点上。如果你用CreateIconIndirect()函数来创建一个图标,那么你可以指定图标的任何一点作为它的热点。(译者注:其实图标并不使用热点,这可能是微软的文档没有写清楚。使用热点的是光标。)


图标的类型(Icon Types)

操作系统提供了一组标准图标供应用程序随时使用,在Windows头文件(windows.h)中有这些图标的资源ID值(以IDI_为前缀的定义)。每一个标准图标都有一个缺省的图像与之对应,用户可以随时用标准光标(?)来替换这些缺省图像。定制图标(Custom icons)可以用于特殊程序或随便什么目的(译者注:微软很有意思,我们不可能只用标准图标而不用自己的图标:-),下面是几个定制图标:

icon1.jpg


图标的尺寸(Icon Sizes)

Windows使用四种图标尺寸:系统小型、系统大型、壳小型、壳大型。

系统小型图标用于显示在窗口的标题条中。如果你想改变这种图标的尺寸,可启动显示控制面板程序,单击“外观”卡片,从“项”(Item)列表中选择“标题按钮”(Caption Buttons),然后修改“尺寸”值。如果你想在应用程序中获取系统小型图标的尺寸,可调用GetSystemMetrics()函数(使用SM_CXSMICON和SM_CYSMICON作为参数)。

系统大型图标主要是被应用程序自身使用(比如在“关于”对话框中),但它也显示在Alt+Tab对话框中。CreateIconFromResource()、DrawIcon()、ExtractIcon()、和LoadIcon()函数都是使用系统大型图标。因为系统大型图标的尺寸是被视频设备定义的,所以不能修改。如果你想获取这种图标的尺寸,可调用GetSystemMetrics()函数(使用SM_CXICON和SM_CYICON作为参数)。CreateIcon()、CreateIconFromResourceEx()和CreateIconIndirect()这三个函数可以创建与系统大型图标尺寸不同的图标。

壳小型图标是被用于Windows Exploer程序和一些公共对话框,通常情况下,这种图标的尺寸是与系统小型图标的尺寸相等的。你可以使用SHGetFileInfo()函数来获取该类型图标的图标列表句柄(使用SHGFI_SHELLICONSIZE|SHGFI_SMALLICON作为参数),然后使用ImageList_GetIconSize()函数来获得图标的尺寸。

壳大型图标将被用于桌面。如果你想修改这种图标的尺寸,可启动显示控制面板程序,单击“外观”卡片,从“项”列表中选择“图标”,然后设置它的值。(注:这个值将被保存在系统注册表中,地址是:HKEY_CURRENT_USER/Control Panel/Desktop/WindowMetrics/Shell Icon Size),你同时也需要单击“Plus!”卡片,并选择“使用大图标”复选框。要想获取这种图标的尺寸,可先用SHGetFileInfo()函数(使用SHGFI_SHELLICONSIZE作为参数)来取得系统图像的列表,然后用ImageList_GetIconSize()函数来取得图标的尺寸。

系统“开始”菜单中将使用壳大型图标或者壳小型图标,具体使用哪一种将取决于“使用大图标”复选框是否被设置。

你的应用程序图标应该提供以下几种格式:

 * 48×48, 256色
* 32×32, 16色
* 16×16, 16色

当你的应用程序在注册窗口类时,WNDCLASSEX结构中的hIcon成员应对应于32×32的图标,hIconSm成员则对应于16×16图标。有关类图标的更多信息,请参见Class Icons一节。


图标的创建(Icon Creation)

标准图标是预定义的,所以他们不需要创建。要想使用标准图标,应用程序可以用LoadImage()函数来获得这种图标的句柄(图标句柄是一个HICON类型的系统唯一值,可用于代表一个标准图标或定制图标)。

如果应用程序想使用自己的图标(称为定制图标),那么开发者一般都是先用图像软件来制作图标的图像,然后将该图像作为ICON资源包含到程序中。在程序运行的时候,调用LoadIcon()或LoadImage()函数来获取图标的句柄。图标资源一般将包含几种不同显示设备所需要的数据,LoadIcon()和LoadImage()函数在读取图标时,会自动调入与当前显示设备最匹配的数据。

应用程序也可以在运行的时候创建一个定制图标,方法是先填写一个ICONINFO结构,再使用CreateIconIndirect()函数创建即可。你也可以用GetIconInfo()函数来获取指定图标的热点、掩码位图和彩色位图。但应用程序应该尽量避免在运行时创建图标,最好的方法是将定制图标做成资源,然后用LoadIcon()或LoadImage()函数在运行时调用。这样作的好处是可以消除图标对设备的依赖、软件本地化更容易,并可以使应用程序间共享图标。

CreateIconFromResourceEx()函数可以让应用程序浏览从系统资源、被创建的图标、到基于资源数据的光标等数种图像,CreateIconFromResourceEx()函数也可以根据其他EXE文件或DLL文件中的二进制资源数据来创建图标。有关资源函数的更多信息,请参见Resource Functions一节。


图标的显示(Icon Display)

应用程序可以调用GetIconInfo()函数来获取指定图标的图像(译者注:即位图的句柄),也可以调用DrawIconEx()函数来显示图标。如果想显示一个图标的默认图像,在调用DrawIconEx()函数时请指定DI_COMPAT标志,如果不指定这个标志,该函数将使用用户指定的图像。


销毁图标(Icon Destruction)

当应用程序不再需要一个在运行时(使用CreateIconIndirect()函数创建的)创建的图标的时候,它应该销毁这个图标。可以使用DestroyIcon()函数来达到该目的,DestroyIcon()函数将销毁图标句柄,并释放指定图标所占用的内存资源。(注:DestroyIcon()函数只能用于销毁由CreateIconIndirect()函数创建的图标,而其它类型的图标是不需要销毁的)。


图标的复制(Icon Duplication)

CopyIcon()函数可以复制图标的句柄,这使得应用程序或DLL可以取得其他程序的图标(复制),当那些程序被释放的时候,这些复制的图标将继续有效。

CopyImage()函数可以创建一个基于指定图标的新的图标。这个新图标可以大于或小于原来的图标。有关在EXE文件中加、减、替换图标的信息,请参见Resources一节。


创建一个图标(Create an Icon)

要想使用图标,应用程序必需先获得图标的句柄。下面的范例将展示怎样创建两种不同类型的图标句柄:一种是标准图标(一个感叹号),另一种是定制图标(作为程序的资源)。

HICON hIcon1; // icon handle
HICON hIcon2; // icon handle

// Create a standard question icon.
hIcon1 = LoadIcon(NULL, IDI_QUESTION);

// Create a custom icon based on a resource.
hIcon2 = LoadIcon(hinst, MAKEINTRESOURCE(460));

// Create a custom icon at run time.


虽然应用程序最好不要在运行时创建图标,但此处还是放置了一个用CreateIcon()函数创建运行时图标的例子,其目的主要是讲解系统对掩码位图的解释原理。

HICON hIcon3; // icon handle

// Yang icon AND bitmask

BYTE ANDmaskIcon[] = {
0xFF, 0xFF, 0xFF, 0xFF, // line 1
0xFF, 0xFF, 0xC3, 0xFF, // line 2
0xFF, 0xFF, 0x00, 0xFF, // line 3
0xFF, 0xFE, 0x00, 0x7F, // line 4

0xFF, 0xFC, 0x00, 0x1F, // line 5
0xFF, 0xF8, 0x00, 0x0F, // line 6
0xFF, 0xF8, 0x00, 0x0F, // line 7
0xFF, 0xF0, 0x00, 0x07, // line 8

0xFF, 0xF0, 0x00, 0x03, // line 9
0xFF, 0xE0, 0x00, 0x03, // line 10
0xFF, 0xE0, 0x00, 0x01, // line 11
0xFF, 0xE0, 0x00, 0x01, // line 12

0xFF, 0xF0, 0x00, 0x01, // line 13
0xFF, 0xF0, 0x00, 0x00, // line 14
0xFF, 0xF8, 0x00, 0x00, // line 15
0xFF, 0xFC, 0x00, 0x00, // line 16

0xFF, 0xFF, 0x00, 0x00, // line 17
0xFF, 0xFF, 0x80, 0x00, // line 18
0xFF, 0xFF, 0xE0, 0x00, // line 19
0xFF, 0xFF, 0xE0, 0x01, // line 20

0xFF, 0xFF, 0xF0, 0x01, // line 21
0xFF, 0xFF, 0xF0, 0x01, // line 22
0xFF, 0xFF, 0xF0, 0x03, // line 23
0xFF, 0xFF, 0xE0, 0x03, // line 24

0xFF, 0xFF, 0xE0, 0x07, // line 25
0xFF, 0xFF, 0xC0, 0x0F, // line 26
0xFF, 0xFF, 0xC0, 0x0F, // line 27
0xFF, 0xFF, 0x80, 0x1F, // line 28

0xFF, 0xFF, 0x00, 0x7F, // line 29
0xFF, 0xFC, 0x00, 0xFF, // line 30
0xFF, 0xF8, 0x03, 0xFF, // line 31
0xFF, 0xFC, 0x3F, 0xFF}; // line 32

// Yang icon XOR bitmask

BYTE XORmaskIcon[] = {
0x00, 0x00, 0x00, 0x00, // line 1
0x00, 0x00, 0x00, 0x00, // line 2
0x00, 0x00, 0x00, 0x00, // line 3
0x00, 0x00, 0x00, 0x00, // line 4

0x00, 0x00, 0x00, 0x00, // line 5
0x00, 0x00, 0x00, 0x00, // line 6
0x00, 0x00, 0x00, 0x00, // line 7
0x00, 0x00, 0x38, 0x00, // line 8

0x00, 0x00, 0x7C, 0x00, // line 9
0x00, 0x00, 0x7C, 0x00, // line 10
0x00, 0x00, 0x7C, 0x00, // line 11
0x00, 0x00, 0x38, 0x00, // line 12

0x00, 0x00, 0x00, 0x00, // line 13
0x00, 0x00, 0x00, 0x00, // line 14
0x00, 0x00, 0x00, 0x00, // line 15
0x00, 0x00, 0x00, 0x00, // line 16

0x00, 0x00, 0x00, 0x00, // line 17
0x00, 0x00, 0x00, 0x00, // line 18
0x00, 0x00, 0x00, 0x00, // line 19
0x00, 0x00, 0x00, 0x00, // line 20

0x00, 0x00, 0x00, 0x00, // line 21
0x00, 0x00, 0x00, 0x00, // line 22
0x00, 0x00, 0x00, 0x00, // line 23
0x00, 0x00, 0x00, 0x00, // line 24

0x00, 0x00, 0x00, 0x00, // line 25
0x00, 0x00, 0x00, 0x00, // line 26
0x00, 0x00, 0x00, 0x00, // line 27
0x00, 0x00, 0x00, 0x00, // line 28

0x00, 0x00, 0x00, 0x00, // line 29
0x00, 0x00, 0x00, 0x00, // line 30
0x00, 0x00, 0x00, 0x00, // line 31
0x00, 0x00, 0x00, 0x00}; // line 32

hIcon3 = CreateIcon(
     hinst, // application instance
     32, // icon width
     32, // icon height
     1, // number of XOR planes
     1, // number of bits per pixel
     ANDmaskIcon, // AND bitmask
     XORmaskIcon); // XOR bitmask


在创建图标时,CreateIcon()函数使用下列的原理表来AND和XOR位掩码:

 AND位掩码 XOR位掩码  显示
 -------------------------------------------
 0 0  黑色
 0 1  白色
 1 0  屏幕
 1 1  屏幕的反色

在关闭之前,应用程序必需用DestroyIcon()函数来销毁任何用CreateIconIndirect()函数创建的图标(译者注:这也可以看出用资源图标的好处)。


显示图标(Displaying an Icon)

你的应用程序可以将读入或创建的图标显示在程序的客户区或子窗口中,下面的范例显示了怎样在一个窗口中显示图标(HDC代表窗口):

 HICON hIcon1;   // icon handle  
 HDC hdc;        // handle of display context  
 DrawIcon(hdc, 10, 20, hIcon1); 

Windows系统会自动的显示窗口的类图标,你的应用程序可以在注册窗口类时指定这个图标。也可以在程序运行时调用SetClassLong()函数来替换类图标(该函数会修改所有该类的窗口设置),下面的范例演示了用一个图标资源来替换类图标的方法:
 HINSTANCE hinst;            // handle of current instance 
 HWND hwnd;                  // main window handle  
 
 // Change the icon for hwnd's window class. 
 
 SetClassLong(hwnd,          // window handle 
     GCL_HICON,              // changes icon 
     (LONG) LoadIcon(hinst, MAKEINTRESOURCE(480))
    ); 

有关窗口类的更多信息,请参见Window Classes一节。


共享图标资源(Sharing Icon Resources)

下面的范例演示了怎样从另一个应用程序中提取图标,并在自己的程序中显示出来。代码中调用了CreateIconFromResourceEx()、DrawIcon()、LookupIconIdFromDirectoryEx()、和其它的几个资源函数。

 HICON hIcon1;       // icon handle 
 HINSTANCE hExe;     // handle to loaded .EXE file 
 HRSRC hResource;    // handle for FindResource  
 HRSRC hMem;         // handle for LoadResource 
 BYTE *lpResource;   // address of resource data  
 int nID;            // ID of resource that best fits current screen 
 
 HDC hdc;        // handle of display context 
 
 // Load the file from which to copy the icon. 
 
 hExe = LoadLibrary("myapp.exe"); 
 
 // Find the icon directory whose identifier is 440. 
 
 hResource = FindResource(hExe, 
     MAKEINTRESOURCE(440), 
     RT_GROUP_ICON); 
 
 // Load and lock the icon directory. 
 
 hMem = LoadResource(hExe, hResource); 
 
 lpResource = LockResource(hMem); 
 
 // Get the identifier of the icon that is most appropriate 
 // for the video display. 
 
 nID = LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE, 
     CXICON, CYICON, LR_DEFAULTCOLOR); 
 
 // Find the bits for the nID icon. 
 
 hResource = FindResource(hExe, 
     MAKEINTRESOURCE(nID), 
     MAKEINTRESOURCE(RT_ICON)); 
 
 // Load and lock the icon. 
 
 hMem = LoadResource(hExe, hResource); 
 
 lpResource = LockResource(hMem); 
 
 // Create a handle to the icon. 
 
 hIcon1 = CreateIconFromResourceEx((PBYTE) lpResource, 
     SizeofResource(hExe, hResource), TRUE, 0x00030000, 
     CXICON, CYICON, LR_DEFAULTCOLOR); 
 
 // Draw the icon in the client area. 
 
 DrawIcon(hdc, 10, 20, hIcon1); 


关于图标的函数:(Icon Fuctions)

 CopyIcon 
 CreateIcon 
 CreateIconFromResource 
 CreateIconFromResourceEx 
 CreateIconIndirect 
 DestroyIcon 
 DrawIcon 
 DrawIconEx 
 GetIconInfo 
 LoadIcon 
 LookupIconIdFromDirectoryEx 


关于图标的结构:(Icon Structures)

 ICONINFO 
 ICONMETRICS 


关于图标的消息:(Icon Messages)

 WM_ERASEBKGND 
 WM_ICONERASEBKGND 
 WM_PAINTICON 


<完>
YZ 2000-8-5日晚8:50
最后修改于 2000-8-9日
阅读更多
个人分类: VC/MFC技术
想对作者说点什么? 我来说一句

icon icon 需要大于10个字符

2010年05月02日 9KB 下载

icon图标字体

2018年04月25日 18KB 下载

icon编程icon编程icon编程

2008年11月19日 4.9MB 下载

Icon素材,icon小图标

2010年08月05日 907KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭