资源符号
资源标识符 (C++) (符号) | Microsoft Docs
符号是一个资源标识符 (ID) ,它包含两个部分,一个符号名称 (文本字符串) 映射到符号值 (整数) 例如:
IDC_EDITNAME = 5100
该对话框包含以下属性:
属性 | 说明 |
---|---|
名称 | 显示符号的名称。 有关详细信息,请参阅 符号名称限制。 |
值 | 显示符号的数值。 有关详细信息,请参阅 符号值限制。 |
使用中 | 选中后,指定符号正由一个或多个资源使用。 资源列在"使用者 " 框中。 |
显示只读符号 | 选定后,显示只读资源。 默认情况下," 资源 符号"对话框仅显示资源脚本文件中可修改的资源,但在选中此选项后,可修改资源以粗体文本显示,只读资源以纯文本显示。 |
使用者 | 显示使用符号列表中所选符号的一个或多个资源。 若要移动到给定资源的编辑器,请在"使用者"框中选择 该资源, 然后选择" 查看使用"。 |
新建 | 打开 "新建 符号"对话框,用于定义名称,并在必要时定义新符号资源标识符的值。 |
更改 | 打开 "更改 符号"对话框,用于更改符号的名称或值。 如果符号针对的是使用中的控件或资源,则仅可从相应的资源编辑器更改此符号。 有关详细信息,请参阅 管理符号。 |
查看使用 | 打开包含相应资源编辑器中的符号的资源。 |
创建新符号
-
在" 资源符号" 对话框中,选择"新建 "。
-
在" 名称 "框中,键入符号名称。
-
接受分配的符号值,或在"值"框中键入 新 值。
-
选择 " 确定",将新符号添加到符号列表。
查看资源符号
在资源视图中,右键单击 .rc 文件并选择"资源符号",在"资源符号"对话框中查看资源符号表。
打开给定符号的资源编辑器
浏览资源符号中的符号时,可能需要详细了解如何使用特定符号。 " 查看使用 "按钮提供了获取此信息的快速方法。
-
在" 名称" 框中的"资源符号 "对话框中 ,选择一个符号。
-
在" 使用者 "框中,选择感兴趣的资源类型。
-
选择" 查看使用" 按钮。
资源显示在适当的编辑器窗口中。
管理符号
通常,所有符号定义都保存在 中 Resource.h
。 但是,你可能需要更改此包含文件名,以便可以在同一个目录下使用多个资源文件。
符号名限制
对符号名的限制如下所示:
-
所有符号在应用程序范围内必须是唯一的,以防止头文件中出现冲突的符号定义。
-
符号名的有效字符包括 A-Z、a-z、0-9 和下划线 (_)。
-
符号名称不能以数字开头,并且限制为 247 个字符。
-
符号名称不能包含空格。
-
符号名称不区分大小写,但保留第一个符号定义的大小写。
定义符号的头文件由资源编译器/编辑器和 C++ 程序用于引用资源文件中定义的资源。 对于只有大小写不同的两个符号名,C++ 程序会看到两个单独的符号,而资源编译器/编辑器将这两个名称视为引用单个符号。
符号名具有描述性前缀,可指示它们所表示的资源或对象的类型。 这些描述性前缀以文本组合 ID 开头。 Microsoft 基础类 (MFC) 库使用下表中所示的符号命名约定:
类别 | 前缀 | 用途 |
---|---|---|
资源 | IDR_、IDD_、IDC_、IDI_、IDB_ | 快捷键或菜单 (关联或自定义资源) 、对话框、光标、图标、位图 |
菜单项 | ID_ | Menu item |
命令 | ID_ | Command |
控件和子窗口 | IDC_ | 控制 |
字符串 | IDS_ | 字符串表中的字符串 |
MFC | AFX_ | 为预定义 MFC 符号保留 |
更改符号名称 (ID)
-
在 资源视图中,选择资源。
-
在 "属性 "窗口中,键入新的符号名称,或在 "ID "框中从现有符号列表中选择。
如果键入新的符号名称,系统会自动为其分配一个值。
快捷键、位图、光标、对话框、图标、菜单、字符串表和版本信息等资源的符号值必须是 0 到 32,767 之间的十进制数字,但不能是十六进制。 资源的部件(如对话框控件或字符串表中的各个字符串)的符号值可以从 0 到 65,534 或从 -32,768 到 32,767。 有关数字范围详细信息,请参阅 TN023:标准 MFC 资源。
资源符号是 16 位数字。 可以将它们输入为有符号或无符号,但是,它们在内部用作无符号整数,因此负数将强制转换到其对应的正值。
更改符号值
-
在 资源视图中,选择资源。
-
在 "属性 "窗口中,键入符号名称,后跟等号和 ID 框中的整数,例如:
IDC_EDITNAME=5100
下次保存项目时,新值会存储在符号头文件中。 只有符号名称在"ID"框中保持可见,并且等号和值在验证后不会显示。
更改未分配的符号
-
在" 名称 "框中,选择未分配的符号,然后选择"更改 "。
-
在"更改符号"对话框中提供的框中编辑符号 的名称或 值。
删除未分配(未使用)的符号
在 "资源符号" 对话框中,选择要删除的符号,然后选择"删除 "
菜单
界面元素的规范称为资源。
创建标准菜单
-
转到菜单 ViewResource> 视图或 ViewOther> Windows >Resource 视图,然后右键单击菜单标题。 选择 “添加资源”,然后选择 “菜单”。
-
选择“ 新建项 ”框 (菜单栏上包含 “此处类型 ”的矩形) 。
“新建项 ”框 -
键入新菜单的名称,例如 “文件”。
键入的文本同时显示在“菜单编辑器”和“属性”窗口中的“标题”框中。 你可以在任一位置编辑新菜单的属性。
在菜单栏上为新菜单指定名称后,新项框将移动到右侧 (,以便添加其他菜单) 。 第一个菜单下方将打开另一个新项框,以便你可以向其添加菜单命令。
键入菜单名称后将焦点移入的新项框
创建子菜单
-
选择要为其创建子菜单的菜单命令。
-
在出现在右侧的 新项 框显中键入新的菜单命令的名称。 此新命令将在子菜单的菜单中显示为第一个。
-
向子菜单添加更多菜单命令。
在现有菜单之间插入新菜单
选择现有菜单名称,然后按 “插入 ”键,或右键单击菜单栏,然后选择“ 插入新建”。
“ 新建项 ”框将插入到所选项之前。
将命令添加到菜单
-
创建菜单。 然后选择菜单名称,例如 “文件”。
每个菜单都将展开,并显示一个新项框让你输入命令。 例如,可以将命令“ 新建”、“ 打开”和 “关闭” 添加到 “文件” 菜单。
- 在新项框中,键入新菜单命令的名称。
-
在“ 属性” 窗口中,选择应用的菜单命令属性。 有关详细信息,请参阅 菜单命令属性。
-
在“属性”窗口中的“提示”框中,键入要在应用程序状态栏中显示的提示字符串。
此步骤在字符串表中创建一个条目,其资源标识符与创建的菜单命令相同。
-
按 Enter 完成菜单命令。
选择新项框,以便可以创建更多菜单命令。
若要选择多个菜单命令以运行批量操作,例如删除或更改属性
按住 Ctrl 键时,选择所需的菜单或子菜单命令。
移动和复制菜单和菜单命令
-
使用拖放方法:
-
拖动或复制要移到下列位置的项:
-
当前菜单上的新位置。
-
不同的菜单。 可以通过将鼠标指针拖动到其他菜单上来导航到其他菜单。
-
-
当插入参考线显示所需位置时放下菜单命令。
-
-
使用快捷菜单命令:
-
右键单击一个或多个菜单或菜单命令,然后选择“ 剪切 (以移动) 或 复制。
-
如果要将项移动到另一个菜单资源或资源脚本文件,请在 另一个窗口中将其打开。
-
选择要将菜单或菜单命令移动或复制到的位置。
-
从快捷菜单中选择 “粘贴”。 被移动或复制的项放在选定项的前面。
-
若要删除菜单或菜单命令
右键单击菜单名称或命令,然后选择 “删除”。
弹出菜单
弹出菜单 显示常用命令。 它们对指针的位置可以区分上下文。 在应用程序中使用弹出菜单需要先生成菜单,然后将菜单连接到应用程序代码。
创建菜单资源后,应用程序代码需要加载菜单资源,并使用 TrackPopupMenu 导致菜单出现。 用户通过在弹出菜单外选择或选择命令关闭弹出菜单后,该函数将返回。 如果用户选择一个命令,该命令消息将被发送到传递了其句柄的窗口。
-
若要创建弹出菜单,请创建一个标题为空且不提供 标题的菜单。 然后,向新菜单添加菜单命令。 移动到空白菜单标题下方的第一个菜单命令, (具有“此处”临时标题 类型) 并键入 “标题 ”和其他任何信息。
对弹出菜单中的任何其他菜单命令重复此过程,并确保保存菜单资源。
-
若要将弹出菜单连接到应用程序,例如,为WM_CONTEXTMENU添加消息处理程序,然后将以下代码添加到消息处理程序:
C++复制
CMenu menu; VERIFY(menu.LoadMenu(IDR_MENU1)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());
菜单命令 (c + +)
属性 | 说明 |
---|---|
Break 分割 | 可以是下列值之一: - None:不中断。 这是默认值。 - 列:对于静态菜单,此值将菜单命令置于新行。 对于弹出菜单,此值将菜单命令放置在新列,列之间无分隔线。 设置此属性仅会影响运行时的菜单的外观,不会影响菜单编辑器中的外观。 - 栏:与 列 相同,但对于弹出菜单,此值使用竖线将新列与旧列分隔。 设置此属性只会影响运行时的菜单的外观,而不会影响 菜单编辑器中的外观。 |
Caption 描述文字? | 标记菜单命令(菜单名)的文本。 若要使菜单命令的标题中的一个字母成为助记键,请在它前面加上一个与号 (&) 。 |
Checked 已勾选 | 如果 为 True,则最初检查菜单命令。 类型: Bool。 默认值: False。 |
Enabled 已启用 | 如果为 False,则菜单项被禁用。 |
灰显 Grayed | 如果 为 True,则菜单命令最初显示为灰色且处于非活动状态。 类型: Bool。 默认值: False。 |
帮助 Help | 将菜单项对齐到右侧。 默认值: False。 例如, 帮助 菜单命令在所有 Windows 应用程序中始终位于右侧。 如果在一个菜单项上设置此属性,则该项将出现在菜单的最右边和最末尾。 适用于顶级项。 |
ID | 在头文件中定义的符号。 类型: 符号、 整数或 带引号的字符串。 你可以使用通常在任何编辑器中均可用的任何符号,即使 属性窗口 不提供可供你从中进行选择的下拉列表。 |
Popup 弹出菜单 | 如果 为 True,则菜单命令是一个弹出菜单。 类型: Bool。 默认值:对于菜单栏上的顶级菜单为 True ; 否则为 False。 |
提示 Prompt | 包含突出显示此菜单命令时要在状态栏中显示的文本。 文本放在具有与菜单命令相同的标识符的字符串表中。 此属性可用于任何类型的项目,但运行时功能是 MFC 专用的。 |
从右到左对齐 Right to Left Justify | 在运行时右对齐菜单栏上的菜单命令。 类型: Bool。 默认值: False。 |
从右到左的顺序 Right to Left Order | 界面被本地化为任何从右到左读取的语言(例如希伯来语或阿拉伯语)时允许菜单命令按从右到左显示。 |
分隔符 Separator | 如果 为 True,则菜单命令是一个分隔符。 类型: Bool。 默认值: False。 |
将菜单命令与快捷键关联
-
在 菜单编辑器中,选择所需菜单命令。
-
在“属性窗口” 中,向“标题” 属性添加快捷键的名称:
-
在菜单标题后面,输入制表符 (\t) 的转义序列,以使所有菜单的快捷键都左对齐。
-
键入修改键的名称, (Ctrl、 Alt或 Shift) 后跟一个加号 (+) 以及其他键的名称、字母或符号。
例如,若要将Ctrl+O分配给 "文件" 菜单上的 "打开" 命令,请修改菜单命令的标题,使其类似于以下文本:
复制
&Open...\tCtrl+O
当你键入时, 菜单编辑器 中的菜单命令将更新以反映新标题。
-
-
在“快捷键” 编辑器中 创建快捷键对应表条目 并向它分配与菜单命令相同的标识符。 使用你认为易于记住的组合键。
范例
因为添加时间处理程序类列表中选择的选择的是SketcherDoc类,所以类中(SketcherDoc.h)会自动添加。
class CSketcherDoc : public CDocument
{
protected: // 仅从序列化创建
DECLARE_DYNCREATE(CSketcherDoc)
public:
afx_msg void OnColorBlack();
afx_msg void OnColorRed();
afx_msg void OnColorGreen();
afx_msg void OnColorBlue();
afx_msg void OnElementLine();
afx_msg void OnElementRectange();
afx_msg void OnElementCircle();
afx_msg void OnElementCurve();
}
因为添加时间处理程序类列表中选择的选择的是SketcherDoc类,所以类中(SketcherDoc.cpp)会自动添加。
IMPLEMENT_DYNCREATE(CSketcherDoc, CDocument)
BEGIN_MESSAGE_MAP(CSketcherDoc, CDocument)
ON_COMMAND(ID_COLOR_BLACK, &CSketcherDoc::OnColorBlack)
ON_COMMAND(ID_COLOR_RED, &CSketcherDoc::OnColorRed)
ON_COMMAND(ID_COLOR_GREEN, &CSketcherDoc::OnColorGreen)
ON_COMMAND(ID_COLOR_BLUE, &CSketcherDoc::OnColorBlue)
ON_COMMAND(ID_ELEMENT_LINE, &CSketcherDoc::OnElementLine)
ON_COMMAND(ID_ELEMENT_RECTANGE, &CSketcherDoc::OnElementRectange)
ON_COMMAND(ID_ELEMENT_CIRCLE, &CSketcherDoc::OnElementCircle)
ON_COMMAND(ID_ELEMENT_CURVE, &CSketcherDoc::OnElementCurve)
END_MESSAGE_MAP()
void CSketcherDoc::OnColorBlack()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnColorRed()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnColorGreen()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnColorBlue()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnElementLine()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnElementRectange()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnElementCircle()
{
// TODO: 在此添加命令处理程序代码
}
void CSketcherDoc::OnElementCurve()
{
// TODO: 在此添加命令处理程序代码
}
// SketcherDoc.h
class CSketcherDoc : public CDocument
{
protected:
ElementType m_Element;
ElementColor m_Color;
};
添加成员函数
// SketcherDoc.h
class CSketcherDoc : public CDocument
{
public:
ElementType GetElementType() const { return m_Element; }
ElementColor GetElementColor() const { return m_Color; }
};
enum class ElementType{LINE,RECTANGLE,CIRCLE,CURVE};
#include "windows.h"
enum class ElementColor : COLORREF
{
BLACK=RGB(0,0,0),
RED = RGB(255, 0, 0),
GREEN = RGB(0, 255, 0),
BLUE = RGB(0, 0, 255)
};
修改SketcherDoc.h
#pragma once
#include "ElementType.h" //添加
#include "ElementColor.h" //添加
class CSketcherDoc : public CDocument
{
protected:
ElementType m_Element { ElementType ::LINE }; //添加
ElementColor m_Color { ElementColor::BLACK }; //添加
};
修改消息处理程序
// SketcherDoc.cpp
void CSketcherDoc::OnColorBlack()
{
m_Color = ElementColor::BLACK;
}
void CSketcherDoc::OnColorRed()
{
m_Color = ElementColor::RED;
}
void CSketcherDoc::OnColorGreen()
{
m_Color = ElementColor::GREEN;
}
void CSketcherDoc::OnColorBlue()
{
m_Color = ElementColor::BLUE;
}
void CSketcherDoc::OnElementLine()
{
m_Element = ElementType::LINE;
}
void CSketcherDoc::OnElementRectangle()
{
m_Element = ElementType::RECTANGLE;
}
void CSketcherDoc::OnElementCircle()
{
m_Element = ElementType::CIRCLE;
}
void CSketcherDoc::OnElementCurve()
{
m_Element = ElementType::CURVE;
}
class CSketcherDoc : public CDocument
{
protected: // 仅从序列化创建
DECLARE_DYNCREATE(CSketcherDoc)
public:
afx_msg void OnColorBlack();
afx_msg void OnColorRed();
afx_msg void OnColorGreen();
afx_msg void OnColorBlue();
afx_msg void OnElementLine();
afx_msg void OnElementRectange();
afx_msg void OnElementCircle();
afx_msg void OnElementCurve();
afx_msg void OnUpdateElementLine(CCmdUI* pCmdUI);
afx_msg void OnUpdateElementRectange(CCmdUI* pCmdUI);
afx_msg void OnUpdateElementCircle(CCmdUI* pCmdUI);
afx_msg void OnUpdateElementCurve(CCmdUI* pCmdUI);
afx_msg void OnUpdateColorBlack(CCmdUI* pCmdUI);
afx_msg void OnUpdateColorRed(CCmdUI* pCmdUI);
afx_msg void OnUpdateColorGreen(CCmdUI* pCmdUI);
afx_msg void OnUpdateColorBlue(CCmdUI* pCmdUI);
}
IMPLEMENT_DYNCREATE(CSketcherDoc, CDocument)
BEGIN_MESSAGE_MAP(CSketcherDoc, CDocument)
ON_COMMAND(ID_COLOR_BLACK, &CSketcherDoc::OnColorBlack)
ON_COMMAND(ID_COLOR_RED, &CSketcherDoc::OnColorRed)
ON_COMMAND(ID_COLOR_GREEN, &CSketcherDoc::OnColorGreen)
ON_COMMAND(ID_COLOR_BLUE, &CSketcherDoc::OnColorBlue)
ON_COMMAND(ID_ELEMENT_LINE, &CSketcherDoc::OnElementLine)
ON_COMMAND(ID_ELEMENT_RECTANGE, &CSketcherDoc::OnElementRectange)
ON_COMMAND(ID_ELEMENT_CIRCLE, &CSketcherDoc::OnElementCircle)
ON_COMMAND(ID_ELEMENT_CURVE, &CSketcherDoc::OnElementCurve)
ON_UPDATE_COMMAND_UI(ID_ELEMENT_LINE, &CSketcherDoc::OnUpdateElementLine)
ON_UPDATE_COMMAND_UI(ID_ELEMENT_RECTANGE, &CSketcherDoc::OnUpdateElementRectange)
ON_UPDATE_COMMAND_UI(ID_ELEMENT_CIRCLE, &CSketcherDoc::OnUpdateElementCircle)
ON_UPDATE_COMMAND_UI(ID_ELEMENT_CURVE, &CSketcherDoc::OnUpdateElementCurve)
ON_UPDATE_COMMAND_UI(ID_COLOR_BLACK, &CSketcherDoc::OnUpdateColorBlack)
ON_UPDATE_COMMAND_UI(ID_COLOR_RED, &CSketcherDoc::OnUpdateColorRed)
ON_UPDATE_COMMAND_UI(ID_COLOR_GREEN, &CSketcherDoc::OnUpdateColorGreen)
ON_UPDATE_COMMAND_UI(ID_COLOR_BLUE, &CSketcherDoc::OnUpdateColorBlue)
END_MESSAGE_MAP()
void CSketcherDoc::OnUpdateElementLine(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateElementRectange(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateElementCircle(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateElementCurve(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateColorBlack(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateColorRed(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateColorGreen(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnUpdateColorBlue(CCmdUI* pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
}
void CSketcherDoc::OnColorBlack()
{
m_Color = ElementColor::BLACK;
}
void CSketcherDoc::OnColorRed()
{
m_Color = ElementColor::RED;
}
void CSketcherDoc::OnColorGreen()
{
m_Color = ElementColor::GREEN;
}
void CSketcherDoc::OnColorBlue()
{
m_Color = ElementColor::BLUE;
}
void CSketcherDoc::OnElementLine()
{
m_Element = ElementType::LINE;
}
void CSketcherDoc::OnElementRectange()
{
m_Element = ElementType::RECTANGLE;
}
void CSketcherDoc::OnElementCircle()
{
m_Element = ElementType::CIRCLE;
}
void CSketcherDoc::OnElementCurve()
{
m_Element = ElementType::CURVE;
}
void CSketcherDoc::OnUpdateElementLine(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Element == ElementType::LINE);
}
void CSketcherDoc::OnUpdateElementRectange(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Element == ElementType::RECTANGLE);
}
void CSketcherDoc::OnUpdateElementCircle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Element == ElementType::CIRCLE);
}
void CSketcherDoc::OnUpdateElementCurve(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Element == ElementType::CURVE);
}
void CSketcherDoc::OnUpdateColorBlack(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Color == ElementColor::BLACK);
}
void CSketcherDoc::OnUpdateColorRed(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Color == ElementColor::RED);
}
void CSketcherDoc::OnUpdateColorGreen(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Color == ElementColor::GREEN);
}
void CSketcherDoc::OnUpdateColorBlue(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Color == ElementColor::BLUE);
}
工具栏