关于 Windows API 控件 ID 的一些简单问题

Some quick questions about Windows API control IDs

我有几个关于控件 ID 的问题:

  1. 是否可以通过设置 GWL(P)_ID 在运行时更改它们?或者对话管理器不会被愚弄?由于这是一个框架,我需要在运行时生成它们;最初它们是 0.

  2. 控件 ID 的唯一性范围是什么,整个顶层 window 还是控件的直接父级?我的框架中的控件存储在自定义容器 window 中,每个顶层都有多个这样的容器 window。

谢谢。

问题一

可以通过调用 SetWindowLongPtr:

来更改控件 ID
SetWindowLongPtr(hwndChild, DWL_ID, new_id);

问题二

来自 CreateWindow 的文档,我强调:

hMenu [in, optional]

A handle to a menu, or specifies a child-window identifier depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The application determines the child-window identifier; it must be unique for all child windows with the same parent window.

或来自GetDlgItem的文档:

You can use the GetDlgItem function with any parent-child window pair, not just with dialog boxes. As long as the hDlg parameter specifies a parent window and the child window has a unique identifier (as specified by the hMenu parameter in the CreateWindow or CreateWindowEx function that created the child window), GetDlgItem returns a valid handle to the child window.

因此 ID 的范围是父 window。但这也告诉您,您可以在通过重新设计的 hMenu 参数创建子 window 时指定 ID。