这让我感到困惑!我正在阅读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的范围保留用于命令的菜单提示。
现在我完全糊涂了。
ID_
命令。以上是有道理的。但是我们有:
有人可以用十进制和简单的英文提供各种资源的正确范围吗?
我问的原因是因为在使用ResOrg时它说明了:
然而,它正在将命令标记为超出范围:
这些值在 0x8000到0xDFFF 之内。
我使用带公式的Excel来过滤列表,因为我理解了范围,这就是结果:
答案 0 :(得分:1)
首先: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工具的警告。