您无法在应用程序的资源定义文件中定义所有者绘制的菜单项。相反,您必须使用MFT_OWNERDRAW菜单标志创建一个新的菜单项或修改现有菜单项。
您可以使用InsertMenuItem或SetMenuItemInfo 功能指定所有者绘制的菜单项。使用InsertMenuItem在菜单栏或菜单的指定位置插入新的菜单项。使用SetMenuItemInfo更改菜单的内容。
调用这两个函数时,必须指定MENUITEMINFO结构的地址,给出新菜单项的属性或要为现有菜单项更改的属性。要使项目成为所有者绘制的项目,请为fMask成员指定MIIM_TYPE值,为FTYPE成员指定MFT_OWNERDRAW值。
通过设置MENUITEMINFO结构的相应成员,您可以将应用程序定义的值(称为项目数据)与每个菜单项相关联。为此,请为fMask成员指定MIIM_DATA值,并为dwItemData成员指定应用程序定义的值。
您可以使用具有任何类型的菜单项的项目数据,但它对所有者绘制的项目特别有用。例如,假设一个结构包含用于绘制菜单项的信息。应用程序可能会使用菜单项的项目数据来存储指向结构的指针。项目数据将通过WM_MEASUREITEM和WM_DRAWITEM消息发送到菜单的所有者窗口。要随时检索菜单的项目数据,请使用GetMenuItemInfo功能。
为早期版本的Windows编写的应用程序可以继续调用AppendMenu InsertMenu或ModifyMenu,将MF_OWNERDRAW标志分配给所有者绘制的菜单项。
当您调用这三个函数中的任何一个时,您可以传递一个32位值作为lpNewItem参数。此值可以表示对应用程序有意义的任何信息,并且当要显示项目时,该值可用于您的应用程序。例如,该值可以包含指向结构的指针;结构又可能包含文本字符串和应用程序将用于绘制字符串的逻辑字体的句柄。