在运行时动态分配 MFC 命令 ID

Posted

技术标签:

【中文标题】在运行时动态分配 MFC 命令 ID【英文标题】:Dynamically assign MFC command IDs during runtime 【发布时间】:2014-07-28 06:13:22 【问题描述】:

我有一个类似菜单的 MFC 控件,其中包含许多菜单条目(带有命令 ID)。菜单条目的数量以及结构在运行时动态变化。这意味着我必须不时地创建控件并动态分配新的 ID。

到目前为止,我所做的是保留大量静态 ID 并按顺序分配它们。尽管范围很大,但恐怕我最终会在没有 ID 的情况下结束。我也无法从头开始,因为我不知道之前分配的哪些 ID 已被释放。

我的第一个想法是在当前资源句柄中找到最大的命令 ID 并从那里开始。但我不知道如何做到这一点。

或者有没有更好的方法来管理这个?我想我可能不是第一个遇到这种问题的人。

【问题讨论】:

“我不知道之前分配的哪些 ID 已被释放” - 这不是你能控制的吗?机制是什么? 至少我是这么认为的,因为主机控件和菜单项控件来自专有库。但是你的问题刚刚在我脑海中点燃了一个想法。谢谢! :-) 【参考方案1】:

嗯。 ID不太可能用完。您可以从 WM_USER 开始,每次将 ID 递增 1。但如果您真的认为自己的 ID 会用完,那么您可以使用堆栈或列表来保存已使用的 ID,并在下次需要 ID 时重用它们。处理完消息后,使用 push(ID) 方法将 ID 添加到堆栈中(您可以使用 MFC 中的 ON_MESSAGE 宏的 LPARAM 传递 ID)。然后,当您需要一个新 ID 时,首先检查 ID 堆栈是否为空,如果不是,则使用 pop() 获取顶部 ID。仅当 ID 堆栈为空时,才使用范围 ID 中的最后一个可用。

【讨论】:

我的资源中有很多其他静态命令 ID。因此,如果我开始使用以 WM_USER 开头的 ID,我很可能会干扰其他命令 ID。无论如何,堆栈是一个好主意。我会考虑的,谢谢!

以上是关于在运行时动态分配 MFC 命令 ID的主要内容,如果未能解决你的问题,请参考以下文章

动态地将id分配给在kotlin中单击按钮时创建的edittext [重复]

动态内存分配(c语言)

为啥我们不能在堆栈上分配动态内存?

x86 汇编 (AT&T):如何在运行时为变量动态分配内存?

将事件分配给在运行时动态创建的 VCL 控件 (2)

gdb可以跟踪内存分配日志