[摘录]ICON资料

[摘录]ICON资料
● 图标

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

毁和复制图标。


● 关于图标(About Icons)

在Windows系统中图标随处可见,它一般用来描述一个对象,比如文件、文件夹、快捷方式、应用程序、以及

各种文档。在Win32 API中的图标函数可以允许应用程序来创建、读取、排列和销毁图标。
有关用特定图标来代表某一种文件类型的资料,请参见Icon Handlers一节。


● 图标的热点(Icon Hot Spot)

图标中的某一个像素被指定为热点,操作系统将根据这个点来跟踪和定位图标。一般情况下,图标的热点都是

定位在图标的中心点上。如果你用CreateIconIndirect()函数来创建一个图标,那么你可以指定图标的任何一

点作为它的热点。(译者注:其实图标并不使用热点,这可能是微软的文档没有写清楚。使用热点的是光标。


● 图标的类型(Icon Types)

操作系统提供了一组标准图标供应用程序随时使用,在Windows头文件(windows.h)中有这些图标的资源ID值(

以IDI_为前缀的定义)。每一个标准图标都有一个缺省的图像与之对应,用户可以随时用标准光标(?)来替换

这些缺省图像。定制图标(Custom icons)可以用于特殊程序或随便什么目的(译者注:微软很有意思,我们不

可能只用标准图标而不用自己的图标:-),下面是几个定制图标:

● 图标的尺寸(Icon Sizes)

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

系统小型图标用于显示在窗口的标题条中。如果你想改变这种图标的尺寸,可启动显示控制面板程序,单击“

外观”卡片,从“项”(Item)列表中选择“标题按钮”(Caption Buttons),然后修改“尺寸”值。如果

你想在应用程序中获取系统小型图标的尺寸,可调用GetSystemMetrics()函数(使用SM_CXSMICON和SM_CYSMIC

ON作为参数)。

系统大型图标主要是被应用程序自身使用(比如在“关于”对话框中),但它也显示在Alt+Tab对话框中。Cre

ateIconFromResource()、DrawIcon()、ExtractIcon()、和LoadIcon()函数都是使用系统大型图标。因为系统

大型图标的尺寸是被视频设备定义的,所以不能修改。如果你想获取这种图标的尺寸,可调用GetSystemMetri

cs()函数(使用SM_CXICON和SM_CYICON作为参数)。CreateIcon()、CreateIconFromResourceEx()和CreateIc

onIndirect()这三个函数可以创建与系统大型图标尺寸不同的图标。

壳小型图标是被用于Windows Exploer程序和一些公共对话框,通常情况下,这种图标的尺寸是与系统小型图

标的尺寸相等的。你可以使用SHGetFileInfo()函数来获取该类型图标的图标列表句柄(使用SHGFI_SHELLICON

SIZE|SHGFI_SMALLICON作为参数),然后使用ImageList_GetIconSize()函数来获得图标的尺寸。

壳大型图标将被用于桌面。如果你想修改这种图标的尺寸,可启动显示控制面板程序,单击“外观”卡片,从

“项”列表中选择“图标”,然后设置它的值。(注:这个值将被保存在系统注册表中,地址是:HKEY_CURRE

NT_USER/Control Panel/Desktop/WindowMetrics/Shell Icon Size),你同时也需要单击“Plus!”卡片,并

选择“使用大图标”复选框。要想获取这种图标的尺寸,可先用SHGetFileInfo()函数(使用SHGFI_SHELLICON

SIZE作为参数)来取得系统图像的列表,然后用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结构,再使用CreateIconIndire

ct()函数创建即可。你也可以用GetIconInfo()函数来获取指定图标的热点、掩码位图和彩色位图。但应用程

序应该尽量避免在运行时创建图标,最好的方法是将定制图标做成资源,然后用LoadIcon()或LoadImage()函

数在运行时调用。这样作的好处是可以消除图标对设备的依赖、软件本地化更容易,并可以使应用程序间共享

图标。

CreateIconFromResourceEx()函数可以让应用程序浏览从系统资源、被创建的图标、到基于资源数据的光标等

数种图像,CreateIconFromResourceEx()函数也可以根据其他EXE文件或DLL文件中的二进制资源数据来创建图

标。有关资源函数的更多信息,请参见Resource Functions一节。


● 图标的显示(Icon Display)

应用程序可以调用GetIconInfo()函数来获取指定图标的图像(译者注:即位图的句柄),也可以调用DrawIco

nEx()函数来显示图标。如果想显示一个图标的默认图像,在调用DrawIconEx()函数时请指定DI_COMPAT标志,

如果不指定这个标志,该函数将使用用户指定的图像。


● 销毁图标(Icon Destruction)

当应用程序不再需要一个在运行时(使用CreateIconIndirect()函数创建的)创建的图标的时候,它应该销毁

这个图标。可以使用DestroyIcon()函数来达到该目的,DestroyIcon()函数将销毁图标句柄,并释放指定图标

所占用的内存资源。(注:DestroyIcon()函数只能用于销毁由CreateIconIndirect()函数创建的图标,而其

它类型的图标是不需要销毁的)。


● 图标的复制(Icon Duplication)

CopyIcon()函数可以复制图标的句柄,这使得应用程序或DLL可以取得其他程序的图标(复制),当那些程序

被释放的时候,这些复制的图标将继续有效。

CopyImage()函数可以创建一个基于指定图标的新的图标。这个新图标可以大于或小于原来的图标。有关在EXE

文件中加、减、替换图标的信息,请参见Resources一节。

typedef struct _ICONINFO { // ii

   BOOL    fIcon;

   DWORD   xHotspot;

   DWORD   yHotspot;

   HBITMAP hbmMask;

   HBITMAP hbmColor;

} ICONINFO;

 

hbmMask 指定图标的位图掩码。如果这个结构定义了一个黑白图标。这个位图掩码的上半部分包括AND mask

和下半部分的XOR mask。高度必须是偶数倍。如果这个结构定义了一个彩色图标,掩码仅仅定义了图标的AND

掩码

Specifies the icon bitmask bitmap. If this structure defines a black and white icon, this

bitmask is formatted so that the upper half is the icon AND bitmask and the lower half is the

icon XOR bitmask. Under this condition, the height should be an even multiple of two. If this

structure defines a color icon, this mask only defines the AND bitmask of the icon.

指向彩色图标的位图句柄。如果图标的黑白的,这个成员无意议。HbmMask的AND mask先用SRCAND光栅操作到

目标设备,然后用XOR掩码

将彩色位图SRCINVERT到目标设备

经测试调用两个函数就可以以位图的形式透明显示图标  ii是调用GetIconInfo得到的ICONINFO信息结构

PaintBitmap(dc.m_hDC,&rect,ii.hbmMask,&rect,0,SRCAND);

PaintBitmap(dc.m_hDC,&rect,ii.hbmColor,&rect,0,SRCINVERT);

hbmColor

Handle to the icon color bitmap. This member can be optional if this structure defines a black

and white icon. The AND bitmask of hbmMask is applied with the SRCAND flag to the destination;

subsequently, the color bitmap is applied (using XOR) to the destination by using the SRCINVERT

flag.

此函数可以由ICONINFO结构来产生一个图标

HICON CreateIconIndirect(

  PICONINFO piconinfo   // pointer to icon information structure

);


● 创建一个图标(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()函数创建运行时图标的例子

,其目的主要是讲解系统对掩码位图的解释原理。

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一节。

● 关于图标的函数:(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


你可能感兴趣的:([摘录]ICON资料)