gpt4 book ai didi

c++ - 如何从 HMENU 获取菜单 ID?

转载 作者:可可西里 更新时间:2023-11-01 11:46:23 25 4
gpt4 key购买 nike

当用户按下 F1 键时,我正在尝试为我的对话窗口覆盖 WM_HELP 消息。该窗口有几个按钮,可通过 TrackPopupMenu 显示上下文菜单,以及主菜单(在顶部)。因此,此窗口中的菜单不止一个。

我可以在处理 WM_HELP 时捕获菜单消息,但我需要知道哪个上下文菜单发送了这条消息:

BOOL CMyDialog::OnHelpInfo(HELPINFO* pHelpInfo)
{
if(pHelpInfo->iContextType == HELPINFO_MENUITEM)
{
HMENU hMenu = (HMENU)pHelpInfo->hItemHandle;

//How to get menu ID from HMENU?
}

//...
}

所以我需要找到一种从 HMENU 获取菜单资源 ID 的方法——这是用来创建它的方法:

enter image description here

知道怎么做吗?

最佳答案

您将不得不对其进行“某种程度的暴力破解”。您可以从上到下处理它。做一个这样的函数:

BOOL IsMenuItemIDInMenu(UINT nMenuID, UINT nMenuItemID)
{
//Checks if 'nMenuItemID' belongs to 'nMenuID'
BOOL bRes = FALSE;

if(nMenuID &&
nMenuItemID)
{
HMENU hMenu = ::LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(nMenuID));
if(hMenu)
{
//Look for it
bRes = __searchForMenuItem(hMenu, nMenuItemID);

//Free menu
::DestroyMenu(hMenu);
}
}

return bRes;
}

BOOL __searchForMenuItem(HMENU hMenu, UINT nMenuItemID)
{
ASSERT(hMenu);

int nCnt = ::GetMenuItemCount(hMenu);
if(nCnt != -1)
{
for(int i = 0; i < nCnt; i++)
{
//Is it a submenu
HMENU hSubMenu = ::GetSubMenu(hMenu, i);
if(!hSubMenu)
{
UINT nID = ::GetMenuItemID(hMenu, i);
if(nID != -1 &&
nID == nMenuItemID)
{
//Found it
return TRUE;
}
}
else
{
//Process submenu
if(__searchForMenuItem(hSubMenu, nMenuItemID))
{
//Found it in submenu
return TRUE;
}
}
}
}

return FALSE;
}

然后当您得到一个在按下 F1 时突出显示的菜单 ID,查看它属于哪个菜单:

if(pHelpInfo->iContextType == HELPINFO_MENUITEM)
{
if(IsMenuItemIDInMenu(IDR_MENU_1, pHelpInfo->iCtrlId))
{
}
else if(IsMenuItemIDInMenu(IDR_MENU_2, pHelpInfo->iCtrlId))
{
}
}

关于c++ - 如何从 HMENU 获取菜单 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com