有效的MFC ID范围

时间:2018-03-31 12:37:46

标签: mfc

这让我感到困惑!我正在阅读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来过滤列表,因为我理解了范围,这就是结果:

Excel Resukts

1 个答案:

答案 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工具的警告。