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

问题描述

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

menuiteminfo.ftype = MFT_OWNERDRAW

我还了解有关处理WM_MEASUREITEM和WM_DRAWITEM消息的信息。

但是,我怎么知道哪个菜单项正在发送消息? (以便我可以填写适当的框大小和文本)“ itemID”似乎是唯一的唯一标识符。但是,如何将这个指针/句柄关联到所讨论的项目?我可以使用“ lParam”来确定它是一个菜单项。但是,我无法确定哪个菜单项。 “ GetMenuItemID”没有用,因为它对所有主菜单项都返回“ -1”。

或者,我会错了吗?我一直在寻找答案,已有几个星期了。真的,我要做的就是将主菜单文本颜色从黑色更改为白色或浅灰色,以便可以使用深色背景。

解决方法

itemIDMEASUREITEMSTRUCT结构的DRAWITEMSTRUCT字段可准确告诉您正在测量/绘制哪个菜单项。这是创建或修改菜单项时指定的ID。可以通过以下任一方式指定该ID:

  • uIDNewItemAppendMenu()InsertMenu()的{​​{1}}参数。
  • ModifyMenu()item的{​​{1}}参数
  • 您传递给InsertMenuItem()SetMenuItemInfo()的{​​{1}}结构的wID字段。

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

如果您愿意,也可以使用MENUITEMINFOInsertMenuItem()的{​​{1}}字段来接收您想要的所有者绘制菜单项的任何自定义数据(例如,指向包含菜单项的文本字符串的缓冲区的指针)。该自定义值可以是任何您想要的有意义的值。您可以在传递给SetMenuItemInfo()itemData的{​​{1}}结构的MEASUREITEMSTRUCT字段中设置此值。

文档中涵盖了所有内容:

Using Menus: Creating Owner Drawn Menu Items

,

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

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

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

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