有效的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保留用于标准控件,例如
IDOK
和IDCANCEL
。字符串的0x8000到0xFFFF范围保留用于命令的菜单提示。
现在我完全糊涂了。
- 28672 - 32767保留。
- 32768 - 57343适用于
ID_
命令。 - 保留57344 - 61439。
以上是有道理的。但后来我们有:
- 1 - 32767是字符串
- 32768 - 65535保留。咦?这抹掉了命令范围!
有人可以用十进制和简单的英语提供各种资源的正确范围吗?
我问的原因是因为在使用ResOrg时它指出:
然而,它正在将命令标记为超出范围:
这些值在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范围的主要内容,如果未能解决你的问题,请参考以下文章