MFC关于.rc文件 .rc2文件
.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 等)
- //格式:
- nameID BITMAP filename
- //例子:
- 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
// TEXTINCLUDE
BEGIN
"resource.h\0"
END 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
MFC关于.rc文件 .rc2文件的更多相关文章
- VC工程中的.rc文件和.rc2文件的区别
rc和rc2都是资源文件,包含了应用程序中用到的所有的资源. 两者不同在于:rc文件中的资源可以直接在VC集成环境中以可视化的方法进行编辑和修改; 而rc2中的资源不能在VC的集成环境下直接进行编辑和 ...
- MFC 使用MFC EditBrowse Control控件选择文件或者文件夹
从工具箱中拖拽一个MFC EditBrowse Control到窗体中, 通过设置“Browse Mode”属性指定“文件浏览”还是“文件夹浏览” 可以通过添加对象的方式将其与一个CString se ...
- MFC创建文件和文件夹
1.使用PathIsDirectory判断文件夹是否存在需要引用下面头文件: #include "shlwapi.h"#pragma comment(lib,"shlwa ...
- MFC类目录及头文件(转)
类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsy ...
- Linux下的文件及文件后缀名
Linux下的文件及文件后缀名 2013-03-14 15:34 6969人阅读 评论(0) 收藏 举报 ++++++++++++++++++++++++++++++++++++++正文+++++++ ...
- linux 文件类型 文件权限
linux中常见的文件类型有: “—”表示普通文件 :-rw-r--r-- 1 root root 41727 07-13 02:56 install.log “d”表示目录 :drwxr-xr- ...
- samba服务日志文件-密码文件及启停
1.Samba服务日志文件日志文件对于samba非常重要,它存储着客户端访问samba服务器的信息,以及samba服务的错误提示信息等,可以通过分析日志,帮助解决客户端访问和服务器维护等问题.在/et ...
- Linux温习(三)Linux文件和文件夹管理
关于Linux文件夹的几个常见概念 路径 对文件位置信息的描写叙述机制.是指从树型文件夹中的某个文件夹层次到其内某个文件的一条通路.分为相对路径和绝对路径: 工作文件夹 登入系统后.用户始终处于某个文 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
随机推荐
- Mysql数据实时同步
企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...
- Win10环境下载安装MySQL Community 8.0.12
1.下载MySQL Community 8.0.12的免安装版,下载地址:https://dev.mysql.com/downloads/mysql/ 2.解压到D:\Program Files\My ...
- 同时使用antd和css module
同时编译antd和css module,需要设置两次less识别. { test: /\.less$/, exclude: path.resolve(__dirname, './node_module ...
- elasticsearch5.5.3 源码学习 idea下源码编译
1.学习elasticsearch 源码,通过搜索“elasticsearch源码”,进行相关搜索. 2.因源码gradle编译,选择gradle-3.5可以编译通过,对应elasticsearc ...
- Elasticsearch学习笔记三
PS:前面两章已经介绍了ES的基础及REST API,本文主要介绍ES常用的插件安装及使用. Elasticsearch-Head Head是一个用于管理Elasticsearch的web前端插件,该 ...
- Elasticsearch学习笔记一
Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...
- Linux bash基础特性一
命令别名 alias cdnet=”cd /etc/sysconfig/network-scripts” 针对用户的别名: “~/.bashrc” 针对系统的别名:”/etc/bashrc” 重读配置 ...
- [LeetCode] Largest Sum of Averages 最大的平均数之和
We partition a row of numbers A into at most K adjacent (non-empty) groups, then our score is the su ...
- Linux命令行抓包及包解析工具tshark(wireshark)使用实例解析
在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析. 最近才发现,原来wire ...
- 【函数式编程】reducer为什么叫reducer
最近学习前端的技术,在了解react对DOM的组件抽象,但不提供整体的组件通讯时候,了解了redux,然后就是react-redux: 抽象后,视图完全由对象决定,而用户只能接触视图,所以对象的改变必 ...