有效的 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 范围 的相关文章

  • 托管和非托管 C++/MFC 可以混合在一个 dll 中吗?

    以前 我们有 MFC VC6 VB6 和 C 应用程序中的软件 需要调用用 C 和 MFC 编写的相同引擎 该引擎需要 C 来提高速度 当时我们决定使用 COM 作为接口 因为所有三个都可以使用它 并且在编组等方面的问题最少 我们的 MFC
  • SetWindowPos() 函数不移动窗口?

    我有一个对话框 我想将其放置在另一个对话框中 并相对于主对话框上的其中一个控件进行定位 void CspAceDlg DrawResultsArea CWnd pTabCtl GetDlgItem IDC BUILDTABS CRect r
  • 将简单的 MFC CView/CDocument/CSingleDocTemplate 应用程序转换为 ActiveX 控件

    我有一个相当简单的 MFC 应用程序 它只定义了自己的子类CDocument CView and CFrameWnd并通过使用它们CSingleDocTemplate在视图的树中显示文档的只读内容 都是非常标准的MFC MVC 我现在需要转
  • 使用 CSplitterWnd 在 CChildFrame 中创建多个视图

    我正在使用 MFC MDI 我需要创建如下视图 我的 ChildWnd 分为两部分 它们是LeftView CView 和RightView CScrollView LeftView 分为两部分 TreeView 和 FormView 我怎
  • 如何向 CMFCPopupMenu 添加图标?

    我想用CMFCPopupMenu用于右键单击期间的弹出菜单 如何添加图标CMFCPopupMenu 这是我在基本 MFC 应用程序中尝试的示例代码 CMFCPopupMenu TestCMFCPopMenu new CMFCPopupMen
  • 如何找到激活时打开给定 HMENU 的菜单项(如果有)?

    我想用原型实现一个功能 Locates the menu item of the application which caused the given menu mnu to show up return true if the given
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 实现批量记录获取

    在程序开始时 我需要将数据从 MS Access 数据库 mdb 读取到下拉控件中 这样做是为了每当用户在该控件中键入内容时 应用程序都可以自动完成 不管怎样 从数据库中读取数据花了很长时间 所以我想我应该实现批量行获取 这是我的代码 CS
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • .NET(或 MFC)的高速图形控件?

    我需要编写一个数字示波器类型的应用程序 有很多很棒的静态绘图控件 但我需要一些可以绘制每秒处理 4000 个样本的 16 条轨迹的东西 有人知道 NET 的高速图形控件吗 我什至会选择 MFC 因为它可以封装到 NET 控件中 谢谢您的帮助
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 具有键唯一性和按位置排序的 MFC 字典集合

    看着表上http msdn microsoft com en us library y1z022s1 28v vs 80 29 aspx core collection shape features http msdn microsoft
  • MFC编辑控件更新

    我尝试使用它添加的变量来更新编辑控件的文本 这是一个CString但我失败了 m sNrAuto some text UpdateData TRUE 我也尝试过使用UpdateWindow 但编辑控件仍为空白 我知道我可以使用SetWind
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • CComboBox DDX_CBString 行为令人困惑

    我在对话框中使用 ComboBox 控件为用户提供一些有用的值 例如 10 20 100 400 800 但让用户根据需要插入准确的值 经过很长时间我发现 如果我输入值40在 Combobox 中 Combobox 始终在 UpdataDa
  • 通过 MFC 对话框中的代码更改 Tab 顺序

    我在 OnInitDialog 中通过代码创建了一个控件 但我找不到任何方法通过代码更改对话框的选项卡顺序 有人知道如何做到这一点吗 First Option use ctrl d on resource view in visual st
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • MFC CImage alpha 混合出错

    我必须在图片控件上呈现由两个 PNG 文件组成的图像 其中顶部图像在某些位置具有透明像素 结果应该是plotter png 与 bar png 顶部重叠显示为 注意条上奇怪的白色轮廓 但应该是 我为它编写的代码很简单 CImage imag
  • 调试器忽略动态加载的 DLL 中的错误

    我有一个与自编码 DLL 的调试相关的非常奇怪的问题 我有一个 MFC 驱动的基于对话框的应用程序 几个静态链接的项目和几个在运行时加载的 DLL 项目 我在调试中构建解决方案 运行应用程序 然后我可以轻松调试这些 DLL 项目 现在问题来
  • 如何将tchar指针转换为char指针

    我想将 tchar 转换为 char 这可能吗 如果是的话该怎么做 我使用unicode设置 A TCHAR要么是一个普通的char or a wchar t取决于您的项目的设置 如果是后者 您需要使用WideCharToMultiByte

随机推荐

  • 按字符串对 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