【问题标题】:first free MFC Resource ID第一个免费的 MFC 资源 ID
【发布时间】:2015-10-27 12:12:42
【问题描述】:

我需要在 MFC 项目中找到第一个空闲的“控制资源 ID”(IDC_),以便在运行时创建新的控制元素。

我的目的是编写一个管理类,在运行时跟踪资源。要初始化这个类,我需要知道“APStudio”(VS2010 的 WYSIWYG 资源编辑器)分配的最后一个资源 ID 是什么。

查看“Resource.h”,我可以找到此 ID (_APS_NEXT_CONTROL_VALUE) 的 #defines - 此值由所见即所得的编辑器应该可以解决我的问题。遗憾的是,此定义在编译时无效,但仅在使用 APStudio (#ifdef APSTUDIO_INVOKED) 时无效。 删除 #ifdef 会导致 ID 被定义,但 APStudio 不再更新(以防有任何手动更改)。 一般来说,我想保留整个项目(Resource.h等),这样我的课程就可以普遍使用。

我希望我能以某种方式明确我的问题 - 如果没有,请随时提问。 非常感谢您阅读本文并帮助我解决这个问题:-)

【问题讨论】:

  • 没有标准的方法来查询第一个“免费”资源 ID。即使有,您仍然无法通过 “如果其他人这样做会怎样” 测试,例如另一个在运行时创建控件并分配 ID 的对话框。 MFC 有一个文档描述了正在使用的 ID 范围 (TN020: ID Naming and Numbering Conventions),但这也无济于事。如果你真的想实现一个管理类,请通过他们的HWNDs 引用控件,因为 ID 不必是普遍唯一的。
  • 我害怕阅读这个答案。已经找到了 TN020,但得出的结论与您相同。我想我会深入使用 HWND - 非常感谢。
  • HWNDs 普遍识别窗口,因此它们是作为查找/管理键的自然选择。这也将处理多个窗口共享相同 ID 的情况。这对于静态控件很常见,例如,它们通常都共享相同的 ID:IDC_STATIC

标签: c++ mfc


【解决方案1】:

控件的 ID 只能在其父窗口范围内是唯一的。

为了唯一标识应用程序中的所有控件,例如,帮助系统将对话框的 ID 与控件的 ID 组合成一个用作帮助主题的 DWORD。

另外,请注意,第一个“免费”ID 不一定会启动一系列免费 ID。

要获取所有已使用 ID 的列表,您可以枚举所有子窗口,获取 ID 并从那里开始。或者,假设没有很多控件,您可以简单地在循环中测试整数值:

ind freeID(0);
for(;;++freeID)
    if(GetDlgItem(hDlg, freeID) == 0)
        break;

【讨论】:

  • 不完全正确:如果应用程序不需要通过 ID 区分这些控件,则具有相同父级的不同控件可以共享相同的 ID。静态控件通常这样做。枚举所有子窗口通常不可行,因为它需要创建 all 窗口,并运行所有控件路径,从而动态创建控件。 HWND 唯一标识系统中的窗口/控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多