ModifyMenuA 函数 (winuser.h)

更改现有菜单项。 此函数用于指定菜单项的内容、外观和行为。

注释 setMenuItemInfo 函数取代了 ModifyMenu 函数。 但是,如果不需要 SetMenuItemInfo的任何扩展功能,仍可以使用 ModifyMenu
 

语法

BOOL ModifyMenuA(
  [in]           HMENU    hMnu,
  [in]           UINT     uPosition,
  [in]           UINT     uFlags,
  [in]           UINT_PTR uIDNewItem,
  [in, optional] LPCSTR   lpNewItem
);

参数

[in] hMnu

类型:HMENU

要更改的菜单的句柄。

[in] uPosition

类型:UINT

要更改的菜单项,由 uFlags 参数决定。

[in] uFlags

类型:UINT

控制 uPosition 参数的解释以及菜单项的内容、外观和行为。 此参数必须包含以下必需值之一。

价值 意义
MF_BYCOMMAND
0x00000000L
指示 uPosition 参数 提供菜单项的标识符。 如果未指定 MF_BYCOMMANDMF_BYPOSITION 标志,则 MF_BYCOMMAND 标志是默认值。
MF_BYPOSITION
0x00000400L
指示 uPosition 参数 为菜单项提供从零开始的相对位置。
 

该参数还必须至少包含以下值之一。

价值 意义
MF_BITMAP
0x00000004L
使用位图作为菜单项。 lpNewItem 参数包含位图的句柄。
MF_CHECKED
0x00000008L
将复选标记放在项旁边。 如果应用程序提供复选标记位图(请参阅 SetMenuItemBitmaps 函数),此标志会显示菜单项旁边的选定位图。
MF_DISABLED
0x00000002L
禁用菜单项,使其无法选中,但此标志不灰显。
MF_ENABLED
0x00000000L
启用菜单项,以便可以选择菜单项并从其灰显状态还原它。
MF_GRAYED
0x00000001L
禁用菜单项并将其灰显,以便无法选择它。
MF_MENUBARBREAK
0x00000020L
与菜单栏的 MF_MENUBREAK 标志相同。 对于下拉菜单、子菜单或快捷菜单,新列通过垂直线与旧列分隔。
MF_MENUBREAK
0x00000040L
将项放在新行(对于菜单栏)或新列中(对于下拉菜单、子菜单或快捷菜单),而不分隔列。
MF_OWNERDRAW
0x00000100L
指定该项是所有者绘制的项。 首次显示菜单之前,拥有菜单的窗口会收到 WM_MEASUREITEM 消息,以检索菜单项的宽度和高度。 然后,每当必须更新菜单项的外观时,WM_DRAWITEM 消息就会发送到所有者窗口的窗口过程。
MF_POPUP
0x00000010L
指定菜单项打开下拉菜单或子菜单。 uIDNewItem 参数指定下拉菜单或子菜单的句柄。 此标志用于将菜单名称添加到菜单栏或菜单项,该菜单项将子菜单打开到下拉菜单、子菜单或快捷菜单。
MF_SEPARATOR
0x00000800L
绘制水平分隔线。 此标志仅在下拉菜单、子菜单或快捷菜单中使用。 该行不能灰显、禁用或突出显示。 将忽略 lpNewItemuIDNewItem 参数。
MF_STRING
0x00000000L
指定菜单项是文本字符串;lpNewItem 参数是指向字符串的指针。
MF_UNCHECKED
0x00000000L
不将复选标记放在项旁边(默认值)。 如果应用程序提供复选标记位图(请参阅 SetMenuItemBitmaps 函数),此标志将在菜单项旁边显示一个清晰的位图。

[in] uIDNewItem

类型:UINT_PTR

修改后的菜单项的标识符;或者,如果 uFlags 参数设置了 MF_POPUP 标志,则为下拉菜单或子菜单的句柄。

[in, optional] lpNewItem

类型:LPCTSTR

已更改菜单项的内容。 此参数的解释取决于 uFlags 参数是否包括 MF_BITMAPMF_OWNERDRAWMF_STRING 标志。

价值 意义
MF_BITMAP
0x00000004L
位图句柄。
MF_OWNERDRAW
0x00000100L
应用程序提供的值,用于维护与菜单项相关的其他数据。 该值位于 itemData 结构的成员中,该参数由创建菜单项或更新菜单项时发送 WM_MEASUREITEMWM_DRAWITEM 消息的 lParam 参数所指向的结构。
MF_STRING
0x00000000L
指向以 null 结尾的字符串(默认值)的指针。

返回值

类型:BOOL

如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError

言论

如果 ModifyMenu 替换打开下拉菜单或子菜单的菜单项,该函数将销毁旧的下拉菜单或子菜单,并释放其使用的内存。

为了使键盘加速器能够处理位图或所有者绘制的菜单项,菜单的所有者必须处理 WM_MENUCHAR 消息。 有关详细信息,请参阅 Owner-Drawn 菜单和WM_MENUCHAR消息

每当菜单发生更改时,应用程序都必须调用 DrawMenuBar 函数,无论菜单是否位于显示的窗口中。 若要更改现有菜单项的属性,使用 CheckMenuItemEnableMenuItem 函数要快得多。

以下标志组不能一起使用:

  • MF_BYCOMMANDMF_BYPOSITION
  • MF_DISABLEDMF_ENABLEDMF_GRAYED
  • MF_BITMAPMF_STRINGMF_OWNERDRAWMF_SEPARATOR
  • MF_MENUBARBREAKMF_MENUBREAK
  • MF_CHECKEDMF_UNCHECKED

例子

有关示例,请参阅 为 Menu-Item 文本字符串设置字体。

注意

winuser.h 标头将 ModifyMenu 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 winuser.h (包括 Windows.h)
User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-menu-l1-1-3(在 Windows 10 版本 10.0.14393 中引入)

另请参阅

AppendMenu

CheckMenuItem

概念

DrawMenuBar

EnableMenuItem

菜单

参考

SetMenuItemBitmaps

SetMenuItemInfo