gpt4 book ai didi

c++ - GetMenuItemInfo 不使用 MIIM_TYPE 设置 fType

转载 作者:行者123 更新时间:2023-11-28 00:43:01 27 4
gpt4 key购买 nike

我一直在使用 winapi 一点点,制作一个所有者在菜单上绘制的项目。当我调用 GetMenuItemInfo 时,它会设置菜单项的文本,但不会设置 fType UINT 变量标志。
目前我已经声明:

MenuItem->fMask = MIIM_TYPE

MSDN 说:

MIIM_TYPE Retrieves or sets the fType and dwTypeData members.

我不知道我是否对 MIIM_TYPE 标志感到困惑。

这是我的代码:

void SetOwnerDrawMenu(HMENU * menu)
{
MENUIF * menu_item_information;
HMENU sub_menu_ocational;

UINT uId_menuitem;
int nMenuCountItems = GetMenuItemCount(*menu);

MENUITEMINFO * MenuItem = (MENUITEMINFO*)malloc(sizeof(MENUITEMINFO));

for(int i=0;i<nMenuCountItems;i++)
{

menu_item_information = (MENUIF*)malloc(sizeof(MENUIF));
menu_item_information->isSeparator=false;
menu_item_information->max_width=0;
sub_menu_ocational = 0;
uId_menuitem = GetMenuItemID(*menu,i);
memset(&MenuItem,0,sizeof(MenuItem));
MenuItem = (MENUITEMINFO*)malloc(sizeof(MENUITEMINFO));
MenuItem->cbSize = sizeof(MenuItem);
MenuItem->fMask = MIIM_TYPE;
MenuItem->cch = MAX_ODM_CCH;
MenuItem->dwTypeData = menu_item_information->szItemText;

GetMenuItemInfo(*menu,uId_menuitem,FALSE,MenuItem);

UINT final_flags = MF_BYPOSITION | MF_OWNERDRAW;

if( ( MFT_SEPARATOR & MenuItem->fType ) == MFT_SEPARATOR )
{
final_flags |= MF_SEPARATOR;
menu_item_information->isSeparator = true;
}
else
{
// Not important stuff
}

sub_menu_ocational = GetSubMenu(*menu,i);

if(sub_menu_ocational!=NULL)
{
ModifyMenu(*menu,i,final_flags,0,(LPCTSTR)menu_item_information);
// We got a submenu, repeat this operation
SetOwnerDrawMenu(&sub_menu_ocational);
}
else
{
ModifyMenu(*menu,i,final_flags,0,(LPCTSTR)menu_item_information);
}
}
}

我正在使用 InsertMenu 函数插入菜单:

InsertMenu(tid_cmenu,0,MF_BYPOSITION | MF_SEPARATOR,0,NULL);
InsertMenu(tid_cmenu,0, MF_BYPOSITION | MF_STRING, TID_EXIT, "Exit");

确切地说,为什么 GetMenuItemInfo 没有检索 fType?

最佳答案

如果您正在检查 GetMenuItemInfo 的返回代码,您会发现它失败了。你的错误在这一行:

MenuItem->cbSize = sizeof(MenuItem);

MENUITEMINFO::cbSize 成员应该设置为 MENUITEMINFO 结构的大小,但您将其设置为 MENUITEMINFO 的大小* 指针(即 4 或 8 个字节,具体取决于平台)。

将您的代码更改为:

MenuItem->cbSize = sizeof(MENUITEMINFO);

此外,您的代码在循环外分配 MenuItem,并且在循环内每次迭代分配一次,因此您正在泄漏内存。

关于c++ - GetMenuItemInfo 不使用 MIIM_TYPE 设置 fType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824391/

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