代码改变世界

MFC关于.rc文件 .rc2文件

2019-04-11 14:58  youxin  阅读(9900)  评论(0编辑  收藏  举报

 

.rc文件和.rc2文件

c和rc2都是资源文件,包含了应用程序中用到的所有的资源。

两者不同在于:rc文件中的资源可以直接在VC集成环境中以可视化的方法进行编辑和修改;

而rc2中的资源不能在VC的集成环境下直接进行编辑和修改, 而是由根据需要手工地进行编辑。

 (

// xxx.RC2 - Microsoft Visual C++ 不会直接编辑的资源

在下面的地址找到关于RC2文件的描述: 
http://msdn.microsoft.com/zh-cn/library/y3sk7e6b(VS.80).aspx 


RC2文件:包含项目使用的附加资源的脚本文件。可以在项目的 .rc 文件的顶部包括 .rc2 文件。 

.rc2 文件用于存放由多个不同项目使用的资源。不必为不同的项目多次创建相同的资源,而是可以将它们放在一个 .rc2 文件中,然后将该 .rc2 文件包括在主 .rc 文件中。

.rc2 扩展资源文件,当调用到其它project的资源的时候就会产生,用到资源的时候,比如说一个图片等等……
---------------------

 

MFC中的.rc文件.

统一资源管理:

在win32编程中,为方便项目中的资源统一管理,提供了一个格式统一的资源文件,对各种资源进行管理。它的扩展名是.rc,在程序编译时它会被资源编译器编译生成一个.res的二进制文件

 

rc文件的语法:

1.注释:注释方式和 C 语言相通,单行注释用 // 符号,多行注释用 /* ... */ 符号。

2.预处理命令:预处理指令包括一些头文件的引用(使用 #include ,也同 C 语言)。

3.编译指令:预定义(#define,常量和宏,不支持带参数的宏) 和 条件编译(#if, #ifdef, #undef, #ifndef, #else, #elif, #endif 等)。

4.资源定义声明:资源定义的声明中包括“资源”(Resources),"控件"(Controls) 和 “声明”(Statements) 3 类。

 

资源定义声明:

 

1.资源(Resources):“资源”具有资源 ID,在程序中可以使用 FindResource ,LoadResource,LoadMenu 等资源相关 API 来操作。常见的定义如下:

(1)从文件导入的资源类型:(BITMAP,ICON,HTML,FONT,CURSOR 等)

 

 
  1. //格式:  
  2. nameID BITMAP filename  
  3. //例子:  
  4. IDI_ICON_MAIN       ICON       "res\\icon.ico"  //ICON RESOURCE  

 

 

(2) 对话框资源类型:(DIALOG,DIALOGEX 等)(对话框可以包括若干子控件,如菜单,按钮等,定义语法如下)

//模板
nameID DIALOGEX x, y, width, height [ , helpID]] [[ optional-statements]] {control-statements }

//例子
IDD_DIALOG_ABOUT DIALOGEX 0, 0, 290, 59 //DIALOGEX RESOURCE
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog" // CAPTION STATEMENT
FONT 8, "MS Shell Dlg", 400, 0, 0x1 // FONT STATEMENT
BEGIN
LTEXT "Windows Resource Demo",3001,26,14,119,8,SS_NOPREFIX // CONTROL
LTEXT "Copyright (C) 2008",3002,26,30,119,8 // CONTROL
DEFPUSHBUTTON "OK",IDOK,234,14,32,14,WS_GROUP // CONTROL
DEFPUSHBUTTON "Quit",IDCANCEL,234,31,32,14,WS_GROUP // CONTROL
END

 

MFC resource.h 和.rc文件的关系。

xx.rc包含了resource.h 

我们可以打开xx.rc文件,内容如下:

 

// Microsoft Visual C++ 生成的资源脚本。
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// 从 TEXTINCLUDE 2 资源生成。
//

#include "afxres.h"
#include "verrsrc.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
   
    "#include ""afxres.h""\r\n"
    "#include ""verrsrc.h""\r\n"
    "\0"
END

 

.

resource.h就是.rc文件的头文件
.rc文件里的常量全在resource.h定义

.rc文件包含了整个工程的所有资源信息,包括对话框、位图、菜单、图标、工具栏以及字符串等资源;他们

的大小,风格,字体等属性信息,都包含在其中;
一般情况下不用你去写和修改
vc会帮你写和改
但是如果你想用以前的.rc中的资源比如你以前做的对话框
你只需复制粘贴就行了
就象下面这段

IDD_JK_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "jk"
FONT 9, "宋体"
BEGIN
PUSHBUTTON "学号",IDC_BUTTON1,25,75,62,22
PUSHBUTTON "姓名",IDC_BUTTON2,179,75,64,24
EDITTEXT IDC_EDIT1,105,75,57,24,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT2,261,75,46,24,ES_AUTOHSCROLL
END
你可以复制到你新的工程里去。
方法是用记事本打开.rc文件然后粘贴进去
但是vc可能会提示IDD_JK_DIALOG IDC_BUTTON1,IDC_BUTTON2,IDC_EDIT1,IDC_EDIT2没有定义
这时你只需要用记事本打开resource.h
在里面加
#define IDD_JK_DIALOG 102
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
#define IDC_EDIT1 1002
#define IDC_EDIT2 1003
如果你需要做一个有很多控件的对话框
但是以前做过一个一样的对话框
这时你就可以使用这种方法
---------------------

 

找不到资源的解决办法

没有包含资源文件,在这个对话框的头文件首位包含:#include “resource.h”可以解决

 

参考:

https://www.cnblogs.com/wenluderen/p/4331846.html

 

error MSB6006: “rc.exe”已退出,代码为 1:

 

\Microsoft.CppCommon.targets(1267,5): error MSB6006: “rc.exe”已退出,代码为 1

 

原因在与xx.rc文件中引用了#include "targetver.h" 。

但是我把这个targetver.h文件移除了。

 

 

VC 中clw、ncb、aps文件的作用

.clw文件记录了类的信息,如果classView中某个类不见了,重新生成该文件就可以了,方法:删除此文件,点击“建立类向导”,根据提示输入工程名称就可以了;


.ncb文件记录了类的提示信息,如果类的成员函数和变量的提示不见了,重新生成该文件即可,方法同上;

.aps文件记录了资源信息,要利用现成的资源,需要修改3个文件,.rc文件,Resource.h文件和.aps文件,.aps直接删除后,进入程序,VC会自动生成

有时候我们改了rc不生效,直接 删除.aps文件重新打开即可

 

 

vs中资源管理器删除控件:

删除控件(如static),不会自动更新resource.h,而且修改static控件id,会在resource.h中同时记录修改前后的两个id,但后面的数值(1072)是相同的,下图:

  验证,手动从窗体上删除static控件 ,resource.h并不会自动更新。这样就有个风险就是,resourc.h中的控件ID在代码中农工仍然是可以被使用的,需要注意!

  有次,手动删除新添加的static后,编译居然报错了,查了下,还是因为id修改的原因,屏蔽掉resource.h中的定义就好了。
 

 

vc6 报错:

“old DIB in res XXX.ico; pass it through SDKPAINT”错误

 

VC中使用图标发生的一个错误的解决办法:

错误提示类似于:

old DIB in res XXX.ico; pass it through SDKPAINT

这个错误通常发生在你用你自己的图标替换了原来的资源文件中的图标之后,据说是因为256色的图标和真彩色的图标之间的区别造成的。

解决办法也很简单:用 IconWorkshop 或者vs2010也可以直接编辑,删除256X256以上大小的图形类型就可以了,将出错的图标中的256色以上的“子图标”全部删除(众所周知,一个图标文件是包含N个子图标的,不同的大小,不同的色深),再保存,然后再在VC中重新编译,就应该可以通过了。

 

 

打开xx.rc经常显示  资源视图--显示在另一个编辑器中打开

 

一般是有一些xx.rc文件已经打开了,关闭这个。我有时候关闭这个经常不起作用,这时候选择【关闭所有文档】,然后再点击xx.rc就可以打开了

 

 

resource.h id重复问题

我们知道,通过MFC中工具栏拖动一个控件到相应的容器(比如对话框)上时,MFC会自动生成它的一个不重复的ID。但是我们自定义一个ID,如何保证自己的ID不会和MFC生成的ID重复呢,通过对Resource.h文件分析可得出非常有用的信息,对如何自定义一个与MFC不冲突的ID值非常有指导意义。

/一个典型的resource.h文件

{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by DlgTest20150528.rc // #define IDM_ABOUTBOX 0x0010 #define IDD_ABOUTBOX 100 #define IDS_ABOUTBOX 101 #define IDD_DLGTEST20150528_DIALOG 102 #define IDS_MY_BTN 102 #define IDR_MAINFRAME 128 #define IDC_TREE1 1000 #define IDC_TREE2 1002 #define IDC_BUTTON1 1003 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 //下一个资源ID(插入的一些对话框、图片、图标等) #define _APS_NEXT_COMMAND_VALUE 32771 //下一个命令ID(主菜单、弹出菜单等) #define _APS_NEXT_CONTROL_VALUE 1004 //下一个控件ID(各种控件ID) #define _APS_NEXT_SYMED_VALUE 101 //状态栏、工具栏上所用控件与标签 //ID_(菜单项) IDI_(图标) IDM_(菜单项) IDS_(字符串) IDC_(对话框控件) IDW_(鼠标) #endif #endif

有时候我们为了方便生成自己想要的id,可以修改 

_APS_NEXT_CONTROL_VALUE 
这个值。

  关于Resource.h文件重复定义的问题,只要注意一些关键点,重复是没有问题的,严格来说这个是有条件的重复,资源ID的唯一性是相对来说的,比

1. 在一个对话框内的所有同类型控件ID是不可以重复的

2. 在一个工程内所有的DIALOG ID是不可以重复. 但是不同DIALOG中的控件ID 值可以重复

3.菜单与DIALOG 的ID 是可以重复的

4.不同类型的控件ID可以重复,

 

除此以外,若无意中设置到相同的ID,注意观察编译连接时警告或错误,如:

"type:GROUP_ICON, name:149, language:0x0804"

 

关于Resource文件的信息描述,下面是摘抄的一部分内容:

找到了其中宏定義的含義,知道了這些,控件ID就可以隨便改啦。

_APS_NEXT_RESOURCE_VALUE is the next symbol value that will  be used for a dialog resource, menu resource, and so on. The valid range for resource symbol values is 1 to 0x6FFF.

下一個對話框或菜單等資源的ID,1----0x6FFF

_APS_NEXT_COMMAND_VALUE is the next symbol value that will be used for a command  identification. The valid range for command symbol values is 0x8000 to  0xDFFF.

下一個命令的ID,0x8000---0xDFFF

_APS_NEXT_CONTROL_VALUE is the next symbol value that will be used for a dialog control. The valid range for dialog  control symbol values is 8 to 0xDFFF.

下一個對話框控件的ID,8---0xDFFF

_APS_NEXT_SYMED_VALUE is the next symbol value that will be issued when you manually assign a symbol value using the New command in the Symbol Browser.

在符號瀏覽器中使用新增命令里的預置ID