一般MFC开发的时候,如果有些资源是从其他工程中移植到本工程的,而在资源移植的时候都要将对应的资源ID复制到本工程的resource.h文件中。此时不管你在不在本工程中添加资源ID,resource.h文件中的ID可能都有重复的,一般再添加资源ID后,肯定有重复的。此外,随着界面越来越多,各种控件对话框的ID都堆积在一起,令人看得闹心。
今天我自己整理了一个小工具,可以打开Resource.h文件进行转换,即可解决此问题。重新排序并去重复ID。
1、使用说明
(1)本程序将MFC资源文件Resource.h中的ID重新整理和排序;按照字母顺序排序,拒绝重复ID;
(2)怕引发意外问题,程序不会改动原MFC的默认资源序号,例如:
#define IDR_MAINFRAME 128
维持现状不变
(3)要求resource.h文件的编码必须是Windows系统默认的ANSI,否则会出现乱码;
(4)MFC工程如果使用了ribbon工具栏,需要手动把res文件夹下的ribbon.mfcribbon-ms文件删除重建,否则MFC工程启动会报错;因为ribbon文件里的ID已经重新排序了,ID错位会导致消息映射混乱。
如何删除重建ribbon.mfcribbon-ms?
先进入VS资源视图->*.rc->Ribbon->IDR_RIBBON,双击打开ribbon工具栏;
然后再去res路径删除ribbon.mfcribbon-ms文件;(注意删除之前一定先完成第1步,在资源视图打开ribbon工具栏,否则ribbon.mfcribbon-ms文件删除之后就再也打不开工具栏了)
回到ribbon工具栏,随便修改里面的一个菜单文本或图标,然后点击保存,就会自动重新生成ribbon.mfcribbon-ms文件。
(5)另外,请注意一点:文本打开res\*.rc文件,跳转到Icon栏目,微软官方有说法:
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
就是说,目标文件exe使用的图标,优先考虑ID值最小的图标文件。
所以你需要确认IDR_MAINFRAME的数值是否比其他ico文件的id小。
(6)谨慎起见,建议转换前备份Resource.h和ribbon.mfcribbon-ms文件
2、完整的源码和可执行文件请下载:
https://download.csdn.net/download/libaineu2004/11221588
---引申阅读,我从网上搜索的教程得知的---
一、MFC如何删除未使用的资源符号?
1:打开资源视图(ctrl+shift+e,或者从视图选项中打开,或者双击资源文件夹中的 .rc 文件)
2:右击资源视图中的 .rc 文件夹,打开 ID= 资源符号 项
3:在弹出的对话框中可以看到那些资源符号正在使用,那些未使用
4:可以删除未使用的资源符号 -- firecat注:个人感觉不靠谱,容易误删。
二、新建一个标准的MFC程序,留意到在Resource.h中默认有这样一段宏定义
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32773
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
对照了一下自己初建的一个简单的单文档程序,找到了一些端倪,#define _APS_NEXT_CONTROL_VALUE 1000,那么我就新建一个对话框,并在其中拉出一个控件,重新编译,之后回到Resource.h中查看,其ID值正是1000,其他几项不用解释相信大家已经知道怎么使用了。
firecat注:这些宏就是指定了每次新增控件时,ID从哪里开始算起。可以自行修改。