VC++自定义对话框程序界面图标以及 *.exe 桌面图标

时间:2022-09-07 22:47:35

       我们在使用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”,此时我们可以看到如下介绍:

VC++自定义对话框程序界面图标以及 *.exe 桌面图标

 

       我们可以在上面看到有三个图标,一个是系统默认的图标“IDR_MAINFRAME”,另外两个是我自己加载到工程里的图标“IDI_ICON1”和“IDI_ICON2”,其中我们刚才加载的是“IDI_ICON1” 。再看看上面有一段绿色的注释,大概意思是:“ID号最小的那个图标将会确保成为应用程序的图标。”

 

我再通过“查找和替换”栏切换到Resource.h文件下面,可以看到其中有这样的内容:

VC++自定义对话框程序界面图标以及 *.exe 桌面图标

        我们可以找到 刚才所说的三个图标资源的ID 号:“IDR_MAINFRAME”的ID154, “IDI_ICON1”和“IDI_ICON2”的ID号分别为158155,这两个图标的ID都比系统默认提供的图标的ID大。我们可以试着把它们的ID彼此对调一下,如,把最小的ID(154)赋给“IDI_ICON1”,如下图:

VC++自定义对话框程序界面图标以及 *.exe 桌面图标

        然后再重新编译程序,然后再到工程目录的*.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号更改为最小,然后重新编译运行程序,也能够达到我们想要的效果。

 

希望此篇文章对各位读者有益!

 

附:

在此本人附上一个自己在工作过程中接手的一个项目(开发环境为VC++2010),里面就有此篇文章介绍的内容所实现的效果,读者只需要根据此文章,然后查看相应的代码片段就可以,需要的话可以到以下链接地址下载,其中还有实现自绘CListCtrl控件 的技术!另外,若想成功运行此程序,需要自己将项目属性里的“VC++目录”即“链接”里的“输入”选项都更改为默认值,再把几个源文件里相应的地方注释掉即可。因为这是我工作中的一个工程,里面包含了一些额外的第三方库。

链接地址为:

http://download.csdn.net/detail/xbmoxia/6508927