如何在MFC编辑器中编辑资源ID以传播到代码?

时间:2016-05-04 16:28:18

标签: c++ visual-c++ mfc

我在MFC程序的资源编辑器中创建了一个按钮。 我给它一个ID。 我在ID的代码中使用了ID 我很高兴。

我回到编辑 我改变了ID 即使重建,代码也不会确认新名称 我换了一些旗子(tabstop) 代码仍然不在乎

为了让ID名称更改传播到代码,我必须更改同一个保存中的ID和任何其他字段。只有这样才意识到它是脏的并更新资源表。

这对我和我的学生来说是100%可重复的。电脑。这种解决方法让这个课程停滞不前,但......这到底是什么?

Visual Studio Enterprise 2015 版本14.0.23107.0 D14REL

3 个答案:

答案 0 :(得分:3)

如果您更改资源控件的名称,它将不会像您已经学过的那样在整个源代码中传播它。

理想情况下,您需要使用 VisualAssist 之类的内容:http://www.wholetomato.com/

它允许您重命名资源ID值

您需要使用的是重构。如果您在IDE中打开资源文件作为文本文件(而不是资源编辑器)并找到您的控件,您应该能够右键单击它并选择重构(VA):< / p>

Renaming a resource ID

然后选择重命名。它应该预览各种源代码文件中的更改:

Refactor preview

您可以使用相同的过程重命名变量和方法声明。

答案 1 :(得分:0)

虽然给出的答案很好,但它没有显示更新资源ID时幕后发生的情况。

  • 所有资源ID都放在一个标题中: resource.h
  • 此文件由C ++编译器以及资源编译器(.RC文件)读取。)
  • 使用资源编辑器,您只需键入一个ID,资源编辑器只需在 resource.h中创建一个条目

此标题如下所示:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by MFCApplication1.rc
//
#define IDR_MAINFRAME                   128
#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
#define IDS_ABOUTBOX                    101
#define IDD_MFCAPPLICATION1_DIALOG              102

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE    129
#define _APS_NEXT_CONTROL_VALUE     1000
#define _APS_NEXT_SYMED_VALUE       101
#define _APS_NEXT_COMMAND_VALUE     32771
#endif
#endif

因此,当您在对话框(或任何其他表单)上添加新控件并将其命名为IDC_DOWNLOAD_NOW并保存资源时,此标头将更新如下:

#define IDR_MAINFRAME                   128
#define IDC_DOWNLOAD_NOW                1000

此外,内部变量(如_APS_NEXT_CONTROL_VALUE更新)。

嗯..当你在其他对话框中有相同的符号时,VS将只使用具有相同值的相同宏。您在具有相同名称的第三个对话框上添加另一个按钮,它也不会修改resource.h

但是......当您在这3个对话框中修改控件名称与IDC_DOWNLOAD_LATER类似时,只有.RCresource.h会更新。旧的价值和旧的用法仍然存在。你不会得到任何编译器错误(因为宏存在!)。

#define IDR_MAINFRAME                   128
#define IDC_DOWNLOAD_NOW                1000
#define IDC_DOWNLOAD_LATER              1001

在另一种情况下,当您删除按钮(来自3个对话框中的任何一个)时,程序将正常编译,但GetDlgItemDDX_Control等将在运行时失败(自IDC_DOWNLOAD_NOW起在当前对话框中不存在!)

现在想想如果你使用任何工具批量重命名符号会发生什么 - 繁荣 - 现在所有资源都有IDC_DOWNLOAD_LATER

您应该使用资源符号对话框来查找哪个资源ID由哪个对话框使用。从这里你也可以重命名和删除。 enter image description here enter image description here

答案 2 :(得分:0)

以下是处理 IDC_STATIC 特定问题的第二种方法。您的问题应该修改为包含此内容。

我已经启动了一个临时对话项目,并选择了默认的静态文本:

Default static text

如您所见,它标记为 IDC_STATIC 。我现在直接在资源编辑器中更改ID值,然后点击 enter 键:

Rename property

然后我保存它(这会更新resource.h文件)。然后,如果我使用名为 ResOrg 的应用程序

,我们会看到这一点

Using ResOrg

如您所见,resource.h文件是正确的。现在,您现在添加变量。

有趣的是,IDE实际上并不允许您向IDC_STATIC对象添加变量。但假设你有两个:

2 Static objects

您仍然可以重命名每个,保存文件,重新构建和查看资源文件:

Rename 2 other static controls

正如你所看到的,它仍然很好。此时您可以立即添加变量和事件处理程序。在这种情况下,VisualAssist将用于重命名整个应用程序中使用的变量/ ID。

我不确定是否使用此附加信息编辑现有答案。也许这可能更好?