C++ Windows 所有者绘制的主菜单 -- itemID

C++ Windows Owner Drawn Main Menu -- itemID

我正在尝试在 Windows 中创建一个所有者绘制的主菜单。我了解设置:

menuiteminfo.ftype = MFT_OWNERDRAW

我也知道如何处理 WM_MEASUREITEM 和 WM_DRAWITEM 消息。

但是,我如何知道哪个 主菜单项正在发送消息? (这样我就可以填写适当的框大小和文本)“itemID”似乎是唯一的唯一标识符。但是,如何将此 pointer/handle 与相关项目相关联?我可以使用“lParam”来确定它是一个菜单项。但是,我无法确定哪个菜单项。 “GetMenuItemID”没用,因为它 returns 所有主菜单项都是“-1”。

或者,我这样做完全错了吗?几个星期以来,我一直在寻找答案。真的,我只想把主菜单的文字颜色从黑色改成白色或浅灰色,这样我就可以使用深色背景了。

MEASUREITEMSTRUCTDRAWITEMSTRUCT 结构的 itemID 字段告诉您 measured/drawn 是哪个菜单项。这是 在 create/modify 菜单项时指定的 ID。该 ID 通过以下任一方式指定:

  • AppendMenu()InsertMenu()ModifyMenu()uIDNewItem 参数。
  • InsertMenuItem()SetMenuItemInfo()item参数
  • 您传递给 InsertMenuItem()SetMenuItemInfo()MENUITEMINFO 结构的 wID 字段。

使用您想要的任何 ID,只要它们对于您的菜单是唯一的。

您还可以使用 MEASUREITEMSTRUCTDRAWITEMSTRUCTitemData 字段接收您想要的 owner-drawn 菜单项的任何自定义数据,如果您愿意(例如,例如,指向包含菜单项文本字符串的缓冲区的指针)。此自定义值可以是您想要的任何对您有意义的值。您在传递给 InsertMenuItem()SetMenuItemInfo().

MENUITEMINFO 结构的 dwItemData 字段中设置此值

这些都包含在文档中:

Using Menus: Creating Owner Drawn Menu Items

谢谢雷米。通过您提到的项目,并研究每个项目的文档,我找到了一个隐藏的秘密。对于主菜单项,MEASUREITEMSTRUCT 和 DRAWITEMSTRUCT 中的“itemID”是该项目 drop-down 菜单的句柄。从那以后,我将这行代码添加到 WM_CREATE,以将 itemID 与数字 (zero-based) 位置相关联:

mItemID[i] = int(GetSubMenu(hMenu, i));

'i'是数值位置,从左到右。然后我可以使用这样的比较语句,在 WM_MEASUREITEM 和 WM_DRAWITEM:

lpmis=(LPMEASUREITEMSTRUCT)lParam; if(lpmis->itemID==mItemID[i])