有效的 MFC ID 范围

2024-03-03

这让我很困惑!我正在读这个技术说明 https://learn.microsoft.com/en-gb/cpp/mfc/tn020-id-naming-and-numbering-conventions它指出:

  • 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 的范围。

1 到 7 的控件 ID 保留用于标准控件,例如IDOK and IDCANCEL.

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

现在我完全困惑了。

  • 28672 - 32767 已保留。
  • 32768 - 57343 用于ID_ Commands.
  • 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 与命令行或工具提示的相应提示的组合也不是问题。您可以使用 0x0001 到 0xDFFF 范围内的任何数字。

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

一些对话框、光标和位图的范围是 0x7800 到 0x7FFF,其中有一些真正的大间隙。

来自 MFC 的保留 ID 是另一回事。但是你有头文件,你可以查看它使用了什么或没有使用什么。查看当前头文件,使用的命令范围从 0xE000 开始,一直到 0xEFFF。

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

即使加载资源也始终需要 HINSTANCE 值。在 MFC 中如何评估它是很棘手的,因为它们具有扩展 DLL,但这有助于避免与库存 ID 发生冲突。

Ribbon 的内容使用从 0x3E80 到 0x4650 的 Id(实际上它停在 0x4330)。 这里有趣的是,功能区仅使用此范围内的命令 ID。 (参见 ID_AFX_TOOL...),因此他们不关心命令范围(0x8000 以上)。

因此,根据我拥有的代码库和我的经验,我唯一能说的是:不要与现有 ID 发生冲突。但可以随意使用它们。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有效的 MFC ID 范围 的相关文章

  • 在Windows服务中使用MFC?

    我开始开发 Windows 服务 我想使用我自己的一些类 它们对某些 MFC 类 如 CString CSocket CArchive CMemFile 和 CObject 几乎没有依赖性 MSDN http msdn microsoft
  • Visual Studio 无法识别我的网络摄像头激光测距仪代码的 MFC 库

    我尝试直接从互联网复制源代码 但由于下面发现的错误 我无法构建 调试整个文件 请帮忙 Error occurred while restoring NuGet packages System ArgumentException The pa
  • C++ Builder vs Delphi vs MFC

    我正在学习MFC 发现它不太好用 我听说过很多关于 Delphi 的事 对 Delphi 的研究让我接触到了 C Builder C Builder 是否提供了 C MFC 的严肃且良好的替代方案 C Builder 比 MFC 更好吗 C
  • 菜单被裁剪

    我有一个MFC项目 它支持 40 多种语言 我的电脑上有两个显示器 它们都是不同尺寸的显示器和不同的分辨率 如果我将应用程序移至较小的显示器上 则不会显示完整的语言菜单 我知道它会显示滚动条 为什么不是呢 我的菜单是标准菜单 没有什么花哨
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • 如何将 std::variant 作为 VARIANT* 传递给 ExecWB?

    我看过这篇关于使用的文章std variant https en cppreference com w cpp utility variant 这是因为以下代码引发了代码分析警告 void CChristianLifeMinistryHtm
  • 当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

    我有一个处理 WM NCLBUTTONUP 消息的窗口 以便处理标题栏中自定义按钮的点击 当窗口最大化时 这非常有效 但当窗口未最大化时 WM NCLBUTTONUP 消息永远不会到达 不过我确实收到了 WM NCLBUTTONDOWN 消
  • 如何将命名管道字符串从非托管代码空间发送到托管代码空间?

    我似乎遇到了命名管道 101 问题 我有一个非常简单的设置来连接从 C 非托管应用程序传输到 C 托管应用程序的单工命名管道 管道已连接 但我无法通过管道发送 消息 除非我关闭似乎刷新缓冲区并传递消息的句柄 就好像消息被屏蔽了一样 我尝试颠
  • 您可以将 CMFCVisualManager 与基于对话框的应用程序一起使用吗?

    您可以将 CMFCVisualManager 与基于对话框的应用程序一起使用来更改应用程序的外观吗 如果是这样 它是如何完成的 这个想法是使用随 MSVC 2008 发布的 MFC 功能包来更改控件 例如按钮 的形状 颜色等 不 不能这样做
  • 实现批量记录获取

    在程序开始时 我需要将数据从 MS Access 数据库 mdb 读取到下拉控件中 这样做是为了每当用户在该控件中键入内容时 应用程序都可以自动完成 不管怎样 从数据库中读取数据花了很长时间 所以我想我应该实现批量行获取 这是我的代码 CS
  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 从模态 MFC 表单获取输入信息

    我已经创建了表格CPreparationDlg具有Edit Control 然后我创建了创建模态表单的应用程序 在按 确定 后 我需要将编辑控件中输入的文本读入主程序的变量中 最好的方法是什么 class CPreparationApp p
  • MFC编辑控件更新

    我尝试使用它添加的变量来更新编辑控件的文本 这是一个CString但我失败了 m sNrAuto some text UpdateData TRUE 我也尝试过使用UpdateWindow 但编辑控件仍为空白 我知道我可以使用SetWind
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • MFC 中位图背景绘制的线程类型

    我有一个 MFC 文档 视图 C 图形应用程序 它将所有绘图都绘制到离屏位图 然后将其复制到 OnDraw 方法中提供的 CDC 指针 在过去的几天里 我一直在寻找将绘图组件放置在单独的工作线程中 这样它就不会停止 GUI 当我执行此操作时
  • 如何在MFC中对CListCtrl中的Item进行排序?

    我在 MFC 中制作了一个基于对话框的应用程序 我将 CListCtrl 控件放在对话框上 并将其视图样式设置为报告类型 我在此列表视图中有五列 所有列都是字符串类型 我想在此列表中实现排序 也就是说 当我单击某一列时 它应该对列表中的项目
  • 用于基于 MFC 的 GUI 应用程序的免费自动化测试工具

    我是 Windows 开发和测试平台的新手 我正在开发一个基于 MFC 的 GUI 应用程序 并正在寻找有助于 UI 自动化测试的工具 我搜索时出现了一大堆工具 但大多数似乎都不支持MFC 我考虑的选项是 A 编码 UI UI 自动化 看起
  • Windows API 中逻辑坐标和设备坐标之间的混淆

    我一直在研究一个使用两个函数的 Visual Studio C Windows 应用程序项目SetWindowExt and SetViewportExt 我对这两个函数的作用以及为什么它们是必要的感到困惑 搜索这些函数 我得出了逻辑坐标和
  • 使用 MFC 对象初始化 std::map 无法编译

    MFC初学者看这里 我尝试过初始化std map像这样 在CView的标题中 myprogramView h std map

随机推荐

  • 按字符串对 std::vector> 进行排序?

    我该如何排序vector通过比较pair first这是一个std string 不提供静态比较函数 也不使用boost std vector
  • 日历事件查询选择

    我尝试读出特定日历中的事件 以下是我尝试使用的代码 但我不知道选择是什么样子 我想使用日历 ID 进行选择 如果没有选择 空 它会读出所有日历 但我只想要一个 查询如下所示 public final Cursor query Uri uri
  • 文本对齐:右对齐;仅用于占位符?

    怎样才能活跃text align right 仅用于占位符
  • 从 JPQL 查询返回 JPA 实体的子集作为映射数组?

    在 JPQL 中 可以使用构造函数表达式来请求实体的子集 例如 SELECT NEW example EmployeeDetails e name e salary e department name FROM Employee e 它返回
  • GetTickCount() 实际测量什么?

    我想知道 Windows API 是做什么的GetTickCount http msdn microsoft com en us library windows desktop ms724408 28v vs 85 29 aspx实际测量
  • 嵌套多线程操作跟踪

    我有一个类似的代码 void ExecuteTraced Action a string message TraceOpStart message a TraceOpEnd message 回调 a 可以再次调用 ExecuteTraced
  • Google Sceneform – 它已被弃用吗?有替代品吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在我的 ARCore 项目 Sceneform 中使用 看来这个项目现在被称为Archived htt
  • 洗牌向量 - 样本()的所有可能结果?

    我有一个包含五个项目的向量 my vec lt c a b a c d 如果我想将这些值重新排列到一个新的向量中 随机播放 我可以使用sample shuffled vec lt sample my vec 简单 但sample 函数只给我
  • Haskell 中的验证

    我有一些需要验证的嵌套记录 我想知道惯用的 Haskell 方法是什么 简化一下 data Record Record recordItemsA ItemA recordItemB ItemB deriving Show data Item
  • 打开 JSX 文件时如何使 VS Code 将语言更改为 JavaScript React

    目前 当我打开一个 jsx文件的默认语言是纯 JavaScript 有没有办法设置编辑器根据文件扩展名更改语言 理想情况下 我可以将此设置放入本地设置配置文件或工作区特定配置文件中 我使用的版本是Version 1 15 0 insider
  • 更改 API 级别 Android Studio

    我想将 Android Studio 中的最低 SDK 版本从 API 12 更改为 API 14 我尝试在清单文件中更改它 即
  • Eclipse 中的“Android Private Libraries”文件夹是什么?

    我最初以为它是专门用于像支持库这样的官方库的 然而 每当我使用 添加到构建路径 菜单项添加自定义 JAR 时 它都会自动显示在 引用库 和 Android 私有库 中 其中之一是多余的 因为在构建时导出两者是没有意义的 此外 Android
  • 命令不同步,您现在无法运行此命令

    我正在尝试使用 mysqldb 创建一些表 问题是当执行python脚本时db pymysql 抛出错误 mysql exceptions ProgrammingError 2014 命令不同步 您现在无法运行此命令 db py impor
  • 如何使用 Dagger2 将 Activity 范围内的依赖项替换为模拟

    我的 Activity 中有范围依赖项 我想用一些模拟来测试该 Activity 我读过有关建议在测试期间用测试组件替换应用程序组件的不同方法 但我想要的是替换活动组件 例如 我想在 MVP 设置中针对模拟演示者测试活动 我相信通过在 Ac
  • PHP:如何将无穷大或 NaN 数字编码为 JSON?

    显然 无穷大和 NaN 不是 JSON 规范的一部分 因此这个 PHP 代码 numbers array numbers positive infinity INF numbers negative infinity INF numbers
  • 大数组上的分段错误

    以下代码在 2GB 机器上运行时出现分段错误 但在 4GB 机器上运行 int main int c 1000000 cout lt lt done n return 0 数组的大小仅为 4Mb C 中可以使用的数组的大小是否有限制 您可能
  • Ehcache - 找不到生成器的缓存名称

    我已经浏览了这里提出的很多类似问题 但我仍然无法找到解决方案 所以这是我的问题 我正在尝试在 Spring Boot 中设置 Ehcache Spring 2 2 6 RELEASE Ehcache 3 8 1 缓存服务 I ve got
  • data-* 属性可以包含 HTML 标签吗?

    I E img src world jpg 据我了解 它基本上是有效的 但最好使用 HTML 实体 来自HTML 4 参考 http www w3 org TR WD html40 970708 charset html 您还应该在属性值中
  • 如何显示外部 PostgreSQL 连接的 WORK_MEM?

    我知道我可以使用SHOW WORK MEM 在psql中查看当前使用的连接的值 但其他连接呢 我有一个应用程序可以打开许多连接并动态更改WORK MEM基于上下文 我想监控这些WORK MEM进行更改以确保它们得到应用 换句话说 我想 调整
  • 有效的 MFC ID 范围

    这让我很困惑 我正在读这个技术说明 https learn microsoft com en gb cpp mfc tn020 id naming and numbering conventions它指出 Prefix Resource t