当前位置:C++技术网 > 资讯 > Windows零基础入门:3.2 Win32设置应用程序图标全面介绍

Windows零基础入门:3.2 Win32设置应用程序图标全面介绍

更新时间:2015-09-28 15:13:07浏览次数:1+次

    应用程序图标指的是应用程序窗口左上角的小图标和任务栏的大图标。在软件正式发布时,一定会替换掉这些图标的,否则显得很原始。
    而这个图标的设置,就可以在注册窗口类是完成。只要给窗口类结构体变量的hIcon赋值即可。因为hIcon是一个句柄类型,所以,我们只要给成员一个图标句柄即可。而这个句柄我们无法直接得到,需要通过一个函数获取,即LoadIcon。
    在之前的代码中,都可以看到,就不列出完整的代码了。下面是这个成员的赋值使用代码示例:

WNDCLASS wndclass;
wndclass.hIcon = LoadIcon(NULL, IDI_SHIELD);
...
     那么在讲解这个函数之前,我们来看看系统给我们提供了哪些图标呢?不同的系统版本,不太一样。我这以Win7为例讲述。
    下面看张图:

    从这张图中,最上面的是一个程序的图标情况,左上角一个小图标,任务栏一个大图标,这两个就是应用程序图标了。下面的六个图标,就是常见的预设图标了。图标下面有一个对应的一串字符,这个是图标的ID。对于系统图标,通过这个ID即可使用。
    然后大家很关心一种,那就是想自己设计图标,显示自己的图标。当然,作为完整性,预设的和自定义的图标都会讲到。
    那么,我们有两种图标,也就是系统预设的图标和自定义图标。不过,都是通过LoadIcon函数加载进来。当然,如果你有其他高招,可以得到一个图标的句柄,也是可以的。不过,对于图标来说,这个函数就够用了。不用费力折腾了。
    第一种图标:系统图标的使用
    对于系统图标,是已经定义好的,而且图标文件都是已经准备好了的。而且,这些图标是系统中所有程序都可以使用的,公共资源哦。
    使用公共图标资源时,使用LoadIcon时,第一个参数就只需要传递NULL即可。为什么呢?第一个参数是表示实例的意思,也就是指定是哪个程序的意思。类型是句柄类型。指定了哪个实例,就可以加载哪个实例的图标了。因为是系统的图标,对于所有程序都公开,所以,你就没必要指定实例句柄了,传递NULL,就表示是系统的预定义的图标了。
    而要使用哪个图标就要在第二个参数传入图标的资源ID了。在前面的图中,就给出来了主要的图标图片和对应的ID了。不过,正确的使用图标,还是有必要的。所以在此稍作说明。
    IDI_APPLICATION:作为应用程序默认的图标。
    IDI_QUESTION:当你的窗口作为一个选择时,使用这个提问图标很适合。
    IDI_ERROR:当操作发现错误时,提示窗口使用错误图标,非常准确的告知用户发生了错误。
    IDI_WARNING:当操作可能会产生危险时,比如确定后,地球就要爆炸了,你一定要警告哦。
    IDI_INFORMATION:当需要给用户提供更多提示信息时,用这个图标很友善和惬意。
    IDI_SHIELD:当涉及到用户权限时,才会用这个图标。比如需要一定的权限才能开启炸毁地球的操作,就用权限的盾牌图标很清楚的表达了这个意思。
    当然,这里只是标准的意思而已,他们只是一个图标,在微软的培养下,大家都知道这些图标大概代表的意义,如果你乱用,则会让用户产生混乱,搞不好电脑出问题,经济损失,严重者,用户可能会崩溃而死,那你就要负责了哦。如果你实在不想用这些图标,那么你就用第二种图标咯,你来重新定义图标的意义。预定义图标的使用,就和最开始的示例代码一样,不重复了。


    第二种图标:自定义图标的使用
    对于自定义的图标,那么,你就是老大了。想图标长什么样就什么样,用给它命名什么ID就什么ID,想让它代表什么意义就什么意义。不过,善意提醒一句,千万不要太得意瞎搞,否则你设计的图标,可能会让你的用户抽你的。
    那么一般我们自己的程序,都是用我们自己的程序内部的图标咯。而这个图标还是要我们自己准备咯。你可以自己在VS里画,也可以导入一个扩展名为ico的图标文件到项目里。然而老夫早已看穿了这一切,很早以前就准备好了文章教你如何添加资源了。请参考《资源怎么使用:如何使用图标资源和图片资源》。相关的几篇文章,添加资源虽然是说的MFC的添加,其实在VS中,都是一样的。有相关文章讲了应用程序图标的,不过为了完整性,我们这也是进一步补充。
    按照如下图示,添加图标资源。
    第一步:“资源视图” -> 右击,“添加资源” -> 选择“Icon”(新建则是创建一个空白的图标,自己作画;导入则是添加图标文件到项目)。然后完毕,即可看到第三张图标的结果。

   

   

   

    那么这样,我们添加好了图标,图标也有默认的ID了。那么我们就可以使用自定义的图标了。使用代码如下:

WNDCLASS wndclass;
wndclass.hIcon = LoadIcon(hInstance, IDI_ICON1);
...

     那么你再运行看看,图标是不是换了呢?必须换了。不然的话,你再看看是图标没准备好还是代码写的有问题。这么简单,我想应该不至于代码会错吧。不过,如果你第一次动手,出错也是很正常的,所以一定要动手哈。
    看来你已经中招了。直接这么添加,你确实会运行不通过的。你可能还以为这么简单不用动手了吧。我们看代码就知道,代码的IDI_ICON1底下有波浪线,提示未定义标识符哦。

   
    没有经验的不知道怎么回事,有经验的就知道,这个ID是没有定义的位置的。因为,在你添加资源的时候,VS帮你创建了resource.h头文件,用于定义这些资源ID的。那么知道问题原因就好解决了,问题就是资源ID没有定义。既然已经有定义的头文件了,那么我们包含进来就可以了。看代码:

#include "resource.h"
     然而发现,问题依然没有解决,因为IDI_ICON1底下还有波浪线。把光标放在上面看看,提示“错误:int类型的实参与LPCWSTR类型的形参不兼容”。知道什么问题了吗?传递给函数的参数类型不对。因为在resource.h中定义的IDI_ICON1是一个整型类型哦,见下面定义的代码:
#define IDI_ICON1  103
     所以呀,这就是问题了。那么我们得知道需要的类型是什么样的。LPCWSTR是CONST WCHAR *LPCWSTR的类型别名,CONST是const的类型别名,WCHAR是wchar_t类型的别名,wchar_t是宽字符的字符类型,char是窄字符的字符类型。宽字符使用Unicode编码,窄字符使用多字节编码。对于这个部分的扩展阅读,请看《字符集与字符编码的关系详细分析》、《轻松彻底理解符号、字符和字符集(ASCII、Unicode) 》。所以,LPCWSTR实际上就是这个类型:const wchar_t*,也就是一个指向常量宽字符的指针类型。不过,这里你也只需要了解即可,因为Windows早已为我们准备好工具了,就是将整型类型转换为这个类型的宏MAKEINTRESOURCE。在宏括号中传入整型的ID。最后这个宏转换结果就是LPCWSTR类型了。这样就打工告成了。代码如下:
WNDCLASS wndclass;
wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

     看看我的自定义图标:

   
    哈哈哈,我用了MFC的默认应用程序图标。我也是懒得找咯。只要是ico格式的图标都行哦。
    好了,那么到此,我们的应用程序图标就介绍完了。是不是很有意思呢?还不快赞一个。