VCHelp coPathway ISee project 编译: YZ 电邮: yzfree@sina.com 日期: 2000-8-5 |
ICON资料 |
根据VC5联机帮助中有关图标的资料翻译而成 |
● 图标 图标是一张图片,它是由一张位图和一个掩码图像产生的透明图像区域。以下内容描述了怎样创建、显示、销毁和复制图标。 ● 关于图标(About Icons) 在Windows系统中图标随处可见,它一般用来描述一个对象,比如文件、文件夹、快捷方式、应用程序、以及各种文档。在Win32 API中的图标函数可以允许应用程序来创建、读取、排列和销毁图标。 ● 图标的热点(Icon Hot Spot) 图标中的某一个像素被指定为热点,操作系统将根据这个点来跟踪和定位图标。一般情况下,图标的热点都是定位在图标的中心点上。如果你用CreateIconIndirect()函数来创建一个图标,那么你可以指定图标的任何一点作为它的热点。(译者注:其实图标并不使用热点,这可能是微软的文档没有写清楚。使用热点的是光标。) ● 图标的类型(Icon Types) 操作系统提供了一组标准图标供应用程序随时使用,在Windows头文件(windows.h)中有这些图标的资源ID值(以IDI_为前缀的定义)。每一个标准图标都有一个缺省的图像与之对应,用户可以随时用标准光标(?)来替换这些缺省图像。定制图标(Custom icons)可以用于特殊程序或随便什么目的(译者注:微软很有意思,我们不可能只用标准图标而不用自己的图标:-),下面是几个定制图标:
● 图标的尺寸(Icon Sizes) Windows使用四种图标尺寸:系统小型、系统大型、壳小型、壳大型。 * 48×48, 256色 当你的应用程序在注册窗口类时,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可以取得其他程序的图标(复制),当那些程序被释放的时候,这些复制的图标将继续有效。 ● 创建一个图标(Create an Icon) 要想使用图标,应用程序必需先获得图标的句柄。下面的范例将展示怎样创建两种不同类型的图标句柄:一种是标准图标(一个感叹号),另一种是定制图标(作为程序的资源)。 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日 |