【问题标题】:MFC resource.h command/message IDsMFC resource.h 命令/消息 ID
【发布时间】:2011-02-04 01:37:44
【问题描述】:

我正在开发一个 MFC 应用程序,该应用程序多年来和不同的开发团队都变得非常混乱。包含所有命令/消息映射的 resource.h 文件随着时间的推移变得非常大,并且有很多问题(例如重复的 ID)。我不精通 MFC,所以这个问题可能听起来很愚蠢......

MSDN 文档提到命令 ID 和消息 ID 不应相应小于 WM_USER 和 WM_APP。我看到 Visual Studio 生成的 resource.h 中的大多数命令 ID 都是从 100 左右开始的。这不应该导致一些与应用程序定义的 ID 重叠的 MFC/Windows 命令和消息的干扰吗?例如,我有一个命令 ID:

#define ID_MY_ID 101

并且有一个具有相同 ID 的 windows 命令。当 MC 向 APP 发送此命令时,它就像应用程序定义的 ID_MY_ID 一样处理,并且应用程序正在执行不必要的操作。这是一种可能的情况吗?

另外,是否有一些第三方工具可以帮助分析项目资源?

更新 1:

出现了新问题: 向应用程序类添加新的自定义命令的首选方式是什么?据我了解,之前它们是通过以下方式添加的:将命令ID添加到resouce.h,然后将消息映射处理程序添加到处理类。

【问题讨论】:

    标签: mfc resources command messages


    【解决方案1】:

    命令消息在 WM_COMMAND 中发送,参数中带有命令 id,因此不会与其他消息冲突。

    【讨论】:

      【解决方案2】:

      一般情况下,无需手动插入或编辑资源中的标识符(由VS以正确方式自动分配的标识符)。在某些情况下,需要手动干预标识符,但您可以先假设,以前有资源的开发团队的工作是正确的。因此,如果您没有因为资源而遇到问题,请保持原状(恕我直言)。

      “MSDN 文档提到命令 ID 和消息 ID 不应相应小于 WM_USER 和 WM_APP。” - 看来你搞错了。

      【讨论】:

      • 问题是这个假设是不正确的。 resource.h 被手动编辑了很多次,出于某种原因,消息 ID 也在那里!这就是为什么我开始询问它们以及命令 ID。我不知道为什么将它们放在那里……也许​​是为了将所有命令 ID 放在一个地方。
      • 命令 ID 和消息 ID 是不同的东西。至于命令 ID,resource.h 是存储的正确位置(如前所述)。至于私人消息 - 将它们提取到一个单独的位置,删除未使用的,验证 ID 范围的正确性,将它们移动到适当的位置(最常见的是为处理该消息的窗口获取带有窗口类代码的 .cpp 和 .h 文件)。
      【解决方案3】:

      你混合了两件事:

      1. 消息 ID。这些必须大于 WM_USER。消息 ID 未在 resource.h 中定义。从您的描述看来,您没有使用应用程序私人消息。
      2. 命令 ID。您的应用程序本身不能有重复的命令 ID。命令 ID 值也不应干扰 afxres.h 中定义的标准 MFC ID。这些命令 ID 从 0xE100 开始,因此 resource.h 中的值不太可能。资源编译器会为您的 rc 文件中的重复 ID 生成错误

      您可能不需要手动编辑 resource.h。

      我建议使用“资源符号”工具(右键单击资源视图中的资源并从弹出菜单中选择,我假设您使用的是 VC++),从 resource.h 中删除所有未使用的 ID。

      【讨论】:

      • 部分问题是 ID 是手动添加到 resource.h 中的,并且命令处理程序也手动添加到消息映射中。所以资源编译器可能不会抱怨这样的重复。 “资源符号”工具也将这些手动添加的命令标记为未使用,尽管它们实际上已被使用。
      • “资源符号”工具仅将在资源文件 (.rc) 中找不到的命令标记为未使用。它不会监控它们是否在代码中使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多