如何解决C ++ Windows所有者绘制的主菜单-itemID
我正在尝试在Windows中创建一个所有者绘制的主菜单。我了解设置:
menuiteminfo.ftype = MFT_OWNERDRAW
我还了解有关处理WM_MEASUREITEM和WM_DRAWITEM消息的信息。
但是,我怎么知道哪个主菜单项正在发送消息? (以便我可以填写适当的框大小和文本)“ itemID”似乎是唯一的唯一标识符。但是,如何将这个指针/句柄关联到所讨论的项目?我可以使用“ lParam”来确定它是一个菜单项。但是,我无法确定哪个菜单项。 “ GetMenuItemID”没有用,因为它对所有主菜单项都返回“ -1”。
或者,我会错了吗?我一直在寻找答案,已有几个星期了。真的,我要做的就是将主菜单的文本颜色从黑色更改为白色或浅灰色,以便可以使用深色背景。
解决方法
itemID
和MEASUREITEMSTRUCT
结构的DRAWITEMSTRUCT
字段可准确告诉您正在测量/绘制哪个菜单项。这是创建或修改菜单项时您指定的ID。可以通过以下任一方式指定该ID:
-
uIDNewItem
,AppendMenu()
或InsertMenu()
的{{1}}参数。 -
ModifyMenu()
或item
的{{1}}参数 - 您传递给
InsertMenuItem()
或SetMenuItemInfo()
的{{1}}结构的wID
字段。
使用所需的任何ID,只要它们对于您的菜单是唯一的即可。
如果您愿意,也可以使用MENUITEMINFO
和InsertMenuItem()
的{{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])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。