如何:管理符号
创建新资源或资源对象时,开发环境会向它分配默认符号名,例如 IDD_DIALOG1
。 可以使用属性窗口更改默认符号名,或更改已与资源关联的任何符号的名称。
对于与单个资源关联的符号,还可以使用“属性”窗口更改符号值。 可以使用资源符号对话框更改当前未分配给资源的符号的值。
通常情况下所有符号定义都保存在 Resource.h
中。 但是,你可能需要更改此包含文件名,以便可以在同一个目录下使用多个资源文件。
注意
如果项目不包含 .rc 文件,请参阅操作说明:创建资源。
符号名限制
对符号名的限制如下所示:
所有符号在应用程序范围内必须是唯一的,以防止头文件中出现冲突的符号定义。
符号名的有效字符包括 A-Z、a-z、0-9 和下划线 (_)。
符号名不能以数字开头,仅限于 247 个字符。
符号名不能包含空格。
符号名不区分大小写,但是第一个符号定义的大小写会保留。
定义符号的头文件由资源编译器/编辑器和 C++ 程序用于引用资源文件中定义的资源。 对于只有大小写不同的两个符号名,C++ 程序会看到两个单独的符号,而资源编译器/编辑器将这两个名称视为引用单个符号。
注意
如果不遵循下面概述的标准符号名方案(ID*_[关键字]),并且符号名恰好与资源脚本编译器已知的关键字相同,则尝试生成资源脚本文件会导致看似难以进行诊断的随机错误生成。 若要防止出现此情况,请遵循标准命名方案。
符号名具有描述性前缀,可指示它们所表示的资源或对象的类型。 这些描述性前缀以文本组合 ID 开头。 Microsoft 基础类 (MFC) 库使用下表中所示的符号命名约定:
类别 | Prefix | 使用 |
---|---|---|
资源 | IDR_、IDD_、IDC_、IDI_、IDB_ | 加速器或菜单(以及关联或自定义资源)、对话框、光标、图标、位图 |
菜单项 | ID_ | 菜单项 |
命令 | ID_ | 命令 |
控件和子窗口 | IDC_ | 控件 |
字符串 | IDS_ | 字符串表中的字符串 |
MFC | AFX_ | 为预定义 MFC 符号保留 |
更改符号名 (ID)
在资源视图中,选择资源。
在“属性”窗口中,在“ID”框中输入新符号名,或从现有符号列表中进行选择。
如果输入新符号名,则会自动向它赋值。
注意
可以使用资源符号对话框更改当前未分配给资源的符号的名称。
符号值限制
符号值可以是用于 #define
预处理器指令的以正常方式表示的任何整数。 下面是符号值的一些示例:
18
4001
0x0012
-3456
资源(例如,加速器、位图、光标、对话框、图标、菜单、字符串表和版本信息)的符号值必须是处于 0 到 32,767 的范围中的十进制数字,但不能为十六进制。 资源的部件(如对话框控件或字符串表中的各个字符串)的符号值可以从 0 到 65,534 或从 -32,768 到 32,767。 有关数字范围的详细信息,请参阅 TN023:标准 MFC 资源。
资源符号是 16 位数字。 可以有符号或无符号形式输入它们,但是,它们在内部用作无符号整数,因此负数会强制转换为对应的正数值。
符号值的一些限制:
Visual Studio 开发环境和 MFC 将一些数字范围用于特殊用途。 设置了最高有效位的所有数字(-32,768 到 -1,或 32,768 到 65,534,具体取决于符号)由 MFC 保留。
不能使用其他符号字符串定义符号值。 例如,不支持以下符号定义:
#define IDC_MYEDIT IDC_OTHEREDIT //not supported
不能将具有参数的预处理器宏用作值定义。 以下示例不是有效的表达式(无论
ID
在编译时的计算结果如何):#define IDD_ABOUT ID(7) //not supported
应用程序可能具有包含使用表达式定义的符号的现有文件。
更改符号值
在资源视图中,选择资源。
在“属性”窗口中,输入后跟一个等号的符号名,并在“ID”框中输入整数,例如:
IDC_EDITNAME=5100
下次保存项目时,新值会存储在符号头文件中。 只有符号名在 ID 框中保持可见,等号和值在进行验证之后不会显示。
更改或删除符号
在资源符号对话框中,可以编辑或删除现有的且尚未分配给资源或对象的符号。
更改未分配的符号
在“名称”框中,选择未分配的符号,然后选择“更改”。
编辑“更改符号”对话框中提供的框中的符号名称或值。
注意
若要更改已分配给资源或对象的符号,必须使用资源编辑器或“属性”窗口。
删除未分配(未使用)的符号
在“资源符号”对话框中,选择要删除的符号,然后选择“删除”。
注意
在资源文件中删除未使用的符号之前,请确保它未在程序中的其他位置使用,也未由编译时包含的资源文件使用。
包括符号
开发环境首次读取由其他应用程序创建的资源文件时,会将所有包含的头文件都标记为只读。 不过,可以使用资源包括对话框添加其他只读符号头文件。
可能要使用只读符号定义的原因之一是用于计划在多个项目之间共享的符号文件。
当现有资源包含的符号定义使用表达式而不是简单整数来定义符号值时,也可以使用包含的符号文件。 例如:
#define IDC_CONTROL1 2100
#define IDC_CONTROL2 (IDC_CONTROL1+1)
只要满足以下条件,环境便会正确解释这些计算的符号:
计算的符号置于只读符号文件中。
资源文件包含已分配有这些计算的符号的资源。
需要数值表达式。
注意
如果需要字符串或数值表达式,则不会计算表达式。
在资源文件包含共享(只读)符号
在“只读符号指令”框中,使用
#include
编译器指令指定要在其中保留只读符号的文件。请勿调用文件
Resource.h
,因为这是通常由主符号头文件使用的文件名。注意
在“只读符号指令”框中输入的内容会完全按照输入包含在资源文件中。 请确保输入的内容不包含任何拼写或语法错误。
使用“只读符号指令”框可仅包含具有符号定义的文件。 请勿包含资源定义;否则,在保存文件时会创建重复的资源定义。
将符号置于指定的文件中。
采用这种方式包含的文件中的符号会在每次打开资源文件时进行计算,但是在保存文件时不会在磁盘上替换它们。
选择“确定”。
更改资源符号头文件的名称
要求
Win32