MFC:资源符号、菜单、工具栏

资源符号

资源标识符 (C++) (符号) | Microsoft Docs

符号是一个资源标识符 (ID) ,它包含两个部分,一个符号名称 (文本字符串) 映射到符号值 (整数) 例如:

IDC_EDITNAME = 5100

 

该对话框包含以下属性:

属性说明
名称显示符号的名称。

有关详细信息,请参阅 符号名称限制
显示符号的数值。

有关详细信息,请参阅 符号值限制
使用中选中后,指定符号正由一个或多个资源使用。

资源列在"使用者 " 框中。
显示只读符号选定后,显示只读资源。

默认情况下," 资源 符号"对话框仅显示资源脚本文件中可修改的资源,但在选中此选项后,可修改资源以粗体文本显示,只读资源以纯文本显示。
使用者显示使用符号列表中所选符号的一个或多个资源。

若要移动到给定资源的编辑器,请在"使用者"框中选择 该资源, 然后选择" 查看使用"
新建打开 "新建 符号"对话框,用于定义名称,并在必要时定义新符号资源标识符的值。
更改打开 "更改 符号"对话框,用于更改符号的名称或值。

如果符号针对的是使用中的控件或资源,则仅可从相应的资源编辑器更改此符号。 有关详细信息,请参阅 管理符号
查看使用打开包含相应资源编辑器中的符号的资源。

创建新符号

  1. 在" 资源符号" 对话框中,选择"新建 "

  2. 在" 名称 "框中,键入符号名称。

  3. 接受分配的符号值,或在"值"框中键入  值。

  4. 选择 " 确定",将新符号添加到符号列表。

查看资源符号

资源视图中,右键单击 .rc 文件并选择"资源符号",在"资源符号"对话框中查看资源符号表。

打开给定符号的资源编辑器

浏览资源符号中的符号时,可能需要详细了解如何使用特定符号。 " 查看使用 "按钮提供了获取此信息的快速方法。

  1. 在" 名称" 框中的"资源符号 "对话框中 ,选择一个符号。

  2. 在" 使用者 "框中,选择感兴趣的资源类型。

  3. 选择" 查看使用" 按钮。

    资源显示在适当的编辑器窗口中。

管理符号

通常,所有符号定义都保存在 中 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_字符串表中的字符串
MFCAFX_为预定义 MFC 符号保留

更改符号名称 (ID)

  1. 在 资源视图中,选择资源。

  2. 在 "属性 "窗口中,键入新的符号名称,或在 "ID "框中从现有符号列表中选择。

    如果键入新的符号名称,系统会自动为其分配一个值。

快捷键、位图、光标、对话框、图标、菜单、字符串表和版本信息等资源的符号值必须是 0 到 32,767 之间的十进制数字,但不能是十六进制。 资源的部件(如对话框控件或字符串表中的各个字符串)的符号值可以从 0 到 65,534 或从 -32,768 到 32,767。 有关数字范围详细信息,请参阅 TN023:标准 MFC 资源

资源符号是 16 位数字。 可以将它们输入为有符号或无符号,但是,它们在内部用作无符号整数,因此负数将强制转换到其对应的正值。

更改符号值

  1. 在 资源视图中,选择资源。

  2. 在 "属性 "窗口中,键入符号名称,后跟等号和 ID 框中的整数,例如:

IDC_EDITNAME=5100

下次保存项目时,新值会存储在符号头文件中。 只有符号名称在"ID"框中保持可见,并且等号和值在验证后不会显示。

更改未分配的符号

  1. 在" 名称 "框中,选择未分配的符号,然后选择"更改 "

  2. 在"更改符号"对话框中提供的框中编辑符号 的名称或 值。

删除未分配(未使用)的符号

在 "资源符号" 对话框中,选择要删除的符号,然后选择"删除 "



菜单

界面元素的规范称为资源。

   菜单编辑器 (C++) | Microsoft Docs

创建标准菜单

  1. 转到菜单 ViewResource> 视图或 ViewOther> Windows >Resource 视图,然后右键单击菜单标题。 选择 “添加资源”,然后选择 “菜单”。

  2. 选择“ 新建项 ”框 (菜单栏上包含 “此处类型 ”的矩形) 。


    “新建项 ”框

  3. 键入新菜单的名称,例如 “文件”。

    键入的文本同时显示在“菜单编辑器”和“属性”窗口中“标题”框中。 你可以在任一位置编辑新菜单的属性。

    在菜单栏上为新菜单指定名称后,新项框将移动到右侧 (,以便添加其他菜单) 。 第一个菜单下方将打开另一个新项框,以便你可以向其添加菜单命令。


    键入菜单名称后将焦点移入的新项框

创建子菜单

  1. 选择要为其创建子菜单的菜单命令。

  2. 在出现在右侧的 新项 框显中键入新的菜单命令的名称。 此新命令将在子菜单的菜单中显示为第一个。

  3. 向子菜单添加更多菜单命令。

在现有菜单之间插入新菜单

选择现有菜单名称,然后按 “插入 ”键,或右键单击菜单栏,然后选择“ 插入新建”。

“ 新建项 ”框将插入到所选项之前。

将命令添加到菜单

  • 创建菜单。 然后选择菜单名称,例如 “文件”。

    每个菜单都将展开,并显示一个新项框让你输入命令。 例如,可以将命令“ 新建”、“ 打开”和 “关闭” 添加到 “文件” 菜单。

  • 在新项框中,键入新菜单命令的名称。
  • 在“ 属性” 窗口中,选择应用的菜单命令属性。 有关详细信息,请参阅 菜单命令属性

  • “属性”窗口中的“提示”框中,键入要在应用程序状态栏中显示的提示字符串。

    此步骤在字符串表中创建一个条目,其资源标识符与创建的菜单命令相同。

  • 按 Enter 完成菜单命令。

    选择新项框,以便可以创建更多菜单命令。

若要选择多个菜单命令以运行批量操作,例如删除或更改属性

按住 Ctrl 键时,选择所需的菜单或子菜单命令。

移动和复制菜单和菜单命令

  • 使用拖放方法:

    1. 拖动或复制要移到下列位置的项:

      • 当前菜单上的新位置。

      • 不同的菜单。 可以通过将鼠标指针拖动到其他菜单上来导航到其他菜单。

    2. 当插入参考线显示所需位置时放下菜单命令。

  • 使用快捷菜单命令:

    1. 右键单击一个或多个菜单或菜单命令,然后选择“ 剪切 (以移动) 或 复制

    2. 如果要将项移动到另一个菜单资源或资源脚本文件,请在 另一个窗口中将其打开

    3. 选择要将菜单或菜单命令移动或复制到的位置。

    4. 从快捷菜单中选择 “粘贴”。 被移动或复制的项放在选定项的前面。

若要删除菜单或菜单命令

右键单击菜单名称或命令,然后选择 “删除”。

弹出菜单

弹出菜单 显示常用命令。 它们对指针的位置可以区分上下文。 在应用程序中使用弹出菜单需要先生成菜单,然后将菜单连接到应用程序代码。

创建菜单资源后,应用程序代码需要加载菜单资源,并使用 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 + +)

菜单命令 (c + +) | Microsoft Docs

属性说明

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

将菜单命令与快捷键关联

  1. 在 菜单编辑器中,选择所需菜单命令。

  2. 在“属性窗口” 中,向“标题” 属性添加快捷键的名称:

    • 在菜单标题后面,输入制表符 (\t) 的转义序列,以使所有菜单的快捷键都左对齐。

    • 键入修改键的名称, (Ctrl、 Alt或 Shift) 后跟一个加号 (+) 以及其他键的名称、字母或符号。

    例如,若要将Ctrl+O分配给 "文件" 菜单上的 "打开" 命令,请修改菜单命令的标题,使其类似于以下文本:

    复制

    &Open...\tCtrl+O
    

    当你键入时, 菜单编辑器 中的菜单命令将更新以反映新标题。

  3. 在“快捷键” 编辑器中 创建快捷键对应表条目 并向它分配与菜单命令相同的标识符。 使用你认为易于记住的组合键。



范例

 

 

 

 

 

 

 

 因为添加时间处理程序类列表中选择的选择的是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);
}

工具栏

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值