有效的MFC ID范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有效的MFC ID范围相关的知识,希望对你有一定的参考价值。

这让我很困惑!我正在读这个technical note,它说:

  • Prefix Resource type Valid range
  • IDR_ multiple 1 through 0x6FFF
  • IDD_ dialog templates 1 through 0x6FFF
  • IDC_,IDI_,IDB_ cursors, icons, bitmaps 1 through 0x6FFF
  • IDS_, IDP_ general strings 1 through 0x7FFF
  • ID_ commands 0x8000 through 0xDFFF
  • IDC_ controls 8 through 0xDFFF

然后它说:

Windows实现限制将真实资源ID限制为小于或等于0x7FFF。

MFC的内部框架保留以下范围:

  • 0x7000到0x7FFF(参见afxres.h)
  • 0xE000到0xEFFF(参见afxres.h)
  • 16000到18000(见afxribbonres.h)

这些范围可能会在未来的MFC实现中发生变化

多个Windows系统命令使用0xF000到0xFFFF的范围。

控制ID 1到7保留用于标准控件,例如IDOKIDCANCEL

字符串的0x8000到0xFFFF范围保留用于命令的菜单提示。

现在我完全糊涂了。

  • 28672 - 32767保留。
  • 32768 - 57343适用于ID_命令。
  • 保留57344 - 61439。

以上是有道理的。但后来我们有:

  • 1 - 32767是字符串
  • 32768 - 65535保留。咦?这抹掉了命令范围!

有人可以用十进制和简单的英语提供各种资源的正确范围吗?

我问的原因是因为在使用ResOrg时它指出:

Resource Ranges

然而,它正在将命令标记为超出范围:

ResOrg Warnings

这些值在0x8000到0xDFFF之内。

我使用Excel和公式来过滤列表,因为我理解范围,这是结果:

答案

首先:0x8000及以上的命令没有必需的范围。

此要求是在MFC的一些非常早期版本中,其中命令路由选中此范围以减少控件的正常命令ID的“往返”,通常低于此范围。

我只是重新检查了最老的MFC代码(我仍然在VM中使用的VC6.0),我也没有在MFC代码中找到任何限制。

但这是我的经验,正如您在代码中看到的那样。 ID低于0x8000的命令工作...并阅读下面关于功能区代码扩展的说明。

命令ID(菜单,工具栏,功能区)必须低于0xF000,因为系统的命令ID大于0xF000。

即使菜单ID与命令行或Tooltip的相应提示的组合也不是问题。您可以使用0x0001到0xDFFF范围内的任何数字。

MFC中的字符串ID最多可扩展到0xFEFF。

一些对话框和游标以及位图的范围为0x7800到0x7FFF,并且有一些真正的大间隙。

来自MFC的预留ID是另一回事。但是你有头文件,你可以查看它使用与否。查看当前头文件,使用的命令范围从0xE000开始并上升到0xEFFF。

另外我看不出限制其他ID范围(图标等)的原因我在MFC代码和Win32代码中都看不到它们。所以这里的范围只是Win32环境允许的范围。

即使加载资源也需要一个HINSTANCE值。它是如何在MFC中进行评估的,因为它们具有扩展DLL,但它有助于避免与库存ID冲突。

功能区使用从0x3E80到0x4650的Ids(实际上它在0x4330处停止)。这里有趣的是,功能区只使用此范围内的命令ID。 (参见ID_AFX_TOOL ...),因此它们不关心命令范围(大于0x8000)。

所以我可以从我的代码库和我的经验中说出唯一的一句话:不要与现有的ID发生冲突。但是随意使用它们。

因此,即使重新编写像resorg工具那样的ID,也不是真的需要。因为我们附加了帮助生成,即使我们在完全重新编号ID时使用生成的帮助头文件,有时也会感到困惑,我们将ID范围的更改减少到最小化。

所以你可能会忽略旧的RESORG工具的警告。

以上是关于有效的MFC ID范围的主要内容,如果未能解决你的问题,请参考以下文章

在运行时动态分配 MFC 命令 ID

LoaderManager 的范围是啥?

C++ 代码片段(积累)

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

如何改变mfc对话框中的控件中的字体大小

保留对附加节点 javascript 的引用