济南软件开发在使用VC++开发自己的应用程序时,VC总是自动为我们生成一个默认的图标,读者是否想过为自己开发的程序自定义一个具有个性化的图标呢?若是的话,想必以下这篇文章会对读者有所益处。下面本人就为大家介绍一下如何利用VC++为自己的应用程序自定义自己的个性化图标!
选择好自己想要使用的图片,然后将其转换成位图格式(*.bmp),一张16*16的位图,一张32*32的位图,可以使用画图工具来的拉伸和缩放功能(按比例进行计算),也可以借助其他更好用的图片处理软件。
在工程的 res 文件夹里新建一个文件夹“MyPicture”,然后将刚才转换好的两张位图放到这个文件夹里(注意:一定要把位图放在工程里指定的位置里面,否之以后若需要用到是会出现找不到位图资源的错误。)
用VC打开工程,然后切换到资源视图
右击“ *.rc”—添加资源—选择“Bitmap”—选择“导入”—然后导入刚才转换后的两张位图,此时会出现Bitmap文件夹,里面就有我们需要的两张刚才转换的位图资源(IDB_BITMAP1, IDB_BITMAP2)。
右击“Icon”—插入icon—此时出现“IDI-ICON1”—双击“IDI-ICON1”—在右边的窗口能看到系统已经创建好了两张“BMP”位图(一张是“16*16,4位,BMP”,一张是“32*32,4位,BMP”),此时我们可以直接编辑这两张位图成为我们需要的 ICON 图标,不过最好自己再新建两张 24 位的BMP位图(也可以用系统给我们生成的那两张图片)
。
右击下边的空白栏—新建图像类型—分别选择“16*16,24位”和“32*32,24位”。这样就新建了两张 BMP位图。
双击“IDB_BITMAP1”—选自“矩形选择工具”—然后将整张“IDB_BITMAP1”的位图选择—然后复制(ctrl+c)
双击“IDI_ICON1”—选择“16*16,24位,BMP”—然后在右边的图片窗口“Ctrl+v”,
注意:最好先将自己的整张BMP图片的背景用“填充工具”或“喷枪工具”涂白后再执行“Ctrl+v”,否则图标的背景无法和桌面的背景一样。
按照上面的步骤将“32*32,24位,BMP”的位图资源也绘制好。
(以上是图标的准备工作,下面才真正开始替换程序界面的图标和桌面上的*.exe 文件的图标)
第一种方法:(相对比较简单,也比较直接)
删除“资源视图”的“IDR_MAINFRAME”—然后将“IDI_ICON1”的“ID”更改为“IDR_MAINFRAME”
重新编译运行,此时程序界面显示的大图标和小图标,以及在桌面上的 *.exe 文件的图标。
第二种方法:(更改程序的代码,不更改原来工程的资源,即不需要删除“资源视图”里原来的图标资源)
MFC程序中的对话框程序默认加载程序界面图标以及*.exe 桌面图标的方式其实很简单,在没有其他程序图标的情况下,在框架类例如“CSonyPeaceDlg”的头文件 “SonyPeaceDlg.h”有这样一个成员变量
protected:
HICON m_hIcon;
这个成员变量是用来加载 程序界面图标以及 *.exe 桌面图标 的。
然后在 “SonyPeaceDlg.cpp”的OnInitDialog() 函数里面有这样两句加载图标的语句
SetIcon(m_hIcon, TRUE); //设置大图标
SetIcon(m_hIcon, FALSE); //设置小图标
其中第一条语句是用来设置桌面的 *.exe 桌面图标 ,第二条语句是用来设置程序界面左上角以及任务栏的程序图标。因此,若是想更改程序的界面图标以及桌面 *.exe 的图标的话,可以在OnInitDialog() 函数里面更改。方法:
在“SonyPeaceDlg.h”文件里面定义一个成员变量,如
protected:
HICON m_myhIcon;
然后将“SonyPeaceDlg.cpp”的OnInitDialog() 函数 里面原来两条设置程序图标的语句注释掉,并改为如下语句:
//SetIcon(m_hIcon, TRUE); //设置大图标
//SetIcon(m_hIcon, FALSE); //设置小图标
m_myhIcon = LoadIcon(theApp.m_hInstance, MAKEINTRESOURCE(IDI_ICON1));
SetIcon(m_ myhIcon, TRUE);
SetIcon(m_ myhIcon, FALSE);
此时重新编译程序并运行,就能看到程序运行界面的图标已经被更改为我们自己想要的图标了,但是此时只是改变了程序运行时的界面图标,至于桌面上的那个*.exe 程序的图标是否已经更改了呢?我们可以到项目工程里相应的目录看一下,我们会发现此时的 *.exe 程序的图标还没有改变。为什么会这样呢?
我们可以先在“查找和替换”搜索栏里查找“IDR_MAINFRAME”选项,直到找到“SonyPeace.rc”文件下面的“IDR_MAINFRAME”。
我们可以在上面看到有三个图标,一个是系统默认的图标“IDR_MAINFRAME”,另外两个是我自己加载到工程里的图标“IDI_ICON1”和“IDI_ICON2”,其中我们刚才加载的是“IDI_ICON1” 。再看看上面有一段绿色的注释,大概意思是:“ID号最小的那个图标将会确保成为应用程序的图标。”
我再通过“查找和替换”栏切换到Resource.h文件下面,可以看到其中有这样的内容:
我们可以找到 刚才所说的三个图标资源的ID 号:“IDR_MAINFRAME”的ID为154, “IDI_ICON1”和“IDI_ICON2”的ID号分别为158和155,这两个图标的ID都比系统默认提供的图标的ID大。我们可以试着把它们的ID彼此对调一下,如,把最小的ID(154)赋给“IDI_ICON1”,如下图:
然后再重新编译程序,然后再到工程目录的*.exe文件夹下面,此时,我们就可以惊奇的发现,我们终于实现了把 *.exe的桌面图标更改成我们自定义的图标了,同时,程序桌面的图标也是我们自己自定义的图标。
若还不能确定没问题,我们再试一下,把最小的ID(154)赋给“IDI_ICON2”,
再重新编译运行,此时程序桌面的图标变成了另一个我们自己自定义的图标。
至此,我们就已经实现了程序界面图标以及*.exe 桌面图标的更改。
在此,我在介绍另外一种方法,也是用代码在加载自定义图标。
首先,通过类向导,我们给程序添加消息“WM_CREATE”及其映射函数“OnCreate()”然后在 “return 0;”语句之前加上以下代码:
m_myhIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
SetIcon(m_myhIcon, true);
SetIcon(m_myhIcon, false);
当然,也需要在先“SonyPeaceDlg.h”文件定义一个成员变量:
protected:
HICON m_myhIcon;
同时,也需要象第二种方法一样将自定义图标的ID号更改为最小,然后重新编译运行程序,也能够达到我们想要的效果。