图标是由一个或多个位图组成的一个图片文件,文件后缀一般为.icon。一般来说会建立两个图标,一个大的,一个小的,或者只建立一个图标,包含多个位图。为什么这样做,因为如果只有一个图标的话,如果是小图标,那么程序文件的图标就会变很难看,如果是大图标,那么程序标题栏上显示的图标就有可能因为压缩而失真,所以,一般情况下应该建立两个图标,来应对不同的情况。
接下来介绍一种简单的使用图标的方法,在注册窗口类的时候就设置图标。
对于WNDCLASS窗口类来说,我们应该用由32*32和16*16的两个位图组成的图标来作为LoadIcon函数的参数,并将LoadIcon的返回值赋给WndClass.hIcon。程序会自动选择用
对于WNDCLASSEX窗口类来说,我们应该用32*32的图标作为LoadIcon的参数。并将返回值赋给wcex.hIcon,16*16的图标作为LoadIcon的参数,并肩返回值赋给wcex.hIconSm。
然后单独说一下LoadIcon函数:
HICON WINAPI LoadIcon(
_In_opt_ HINSTANCE hInstance,
_In_ LPCTSTR lpIconName
);
第一个参数是当前模型的实例,这个实例是这个图标的加载对象。
第二个参数是应当被加载的图标的名称。这个值有一些定义好的值如:IDI_APPLICATION 默认应用图标;IDI_ASTERISK 和信息图标一样;IDI_ERROR 手形状的图标;IDI_EXCLAMATION 和警告图标一样;IDI_HAND 手形状的图标,和IDI_ERROR一样;IDI_INFORMATION 信息图标;IDI_QUESTION 问题图标;IDI_SHIELD 安全护盾图标;IDI_WARNING 警告图标;IDI_WINLOGO windows2000 logo图标。
当然你也可以自己创建图标,在VS2015下,打卡资源管理器,然后可以在ICON下新建一个图标ID,然后在解决方案资源管理器中打开新建的图标,注意VS2015不能绘画32的图标,只可以绘画24位以及24位一下的图标,然后调用LoadIcon函数时应该这么调用LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)),IDI_ICON是你自己建立的图标的ID。
一般来说程序的图标应该作为资源被包括在程序中,而不是在运行时自行建立,我也同样不推荐在运行过程中建立图标,但是如何在运行中建立图标我还是要介绍一下的。
你需要用到CreateIcon函数,原型如下:
HICON WINAPI CreateIcon(
_In_opt_ HINSTANCE hInstance,
_In_ int nWidth,
_In_ int nHeight,
_In_ BYTE cPlanes,
_In_ BYTE cBitsPixel,
_In_ const BYTE *lpbANDbits,
_In_ const BYTE *lpbXORbits
);
因为我不推荐所以我就不做详细的介绍了,然后附上一段MSDN中的代码,
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
感兴趣的朋友可以自己查阅其他资料来学习这部分知识。
还有一个函数可以在用户区域上绘画图标,那就是
DrawIcon(
_In_ HDC hDC,
_In_ int X,
_In_ int Y,
_In_ HICON hIcon);
这四个参数相信大家应该很清楚,所以我就不介绍了。不过这个函数一般用的不是很多。