如何正确使用 SetMenuItemBitmaps 替换菜单项上的默认位图?
Posted
技术标签:
【中文标题】如何正确使用 SetMenuItemBitmaps 替换菜单项上的默认位图?【英文标题】:How properly use SetMenuItemBitmaps to replace the default bitmap on a menu item? 【发布时间】:2022-01-06 16:58:58 【问题描述】:我正在尝试更改菜单项上的默认位图。不幸的是,我没有让它工作。
SetMenuItemBitmaps()
的文档指出我应该使用 GetSystemMetrics()
函数和 SM_CXMENUCHECK
和 SM_CYMENUCHECK
值来检索默认位图尺寸。我将.bmp
文件调整为这些值,但仍然无法正常工作。
我可能对SetMenuItemBitmaps()
函数有误解。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_CREATE:
SetMenuItemBitmaps(GetMenu(hWnd), ID_RED, MF_BYCOMMAND, LoadBitmap(hInst, L"red.bmp"), LoadBitmap(hInst, L"red.bmp"));
return 0;
[...]
ID 为 ID_RED
的菜单项,我要更改其位图:
【问题讨论】:
@RemyLebeau 感谢您的回复。我不想发布太多代码,并且已经测试过 SetMenuItemBitmaps 是否返回 0。但是,该函数始终以这种方式返回 1。稍后我将处理内存泄漏。现在,我需要让它工作。 【参考方案1】:您需要red
项直接所属的菜单的HMENU
句柄。您正在使用***HMENU
,但red
是color
项的子菜单 的子项,它是子项的子项Menu
项的菜单,它是***菜单的子项。
一旦您拥有***HMENU
,使用GetSubMenu()
或GetMenuItemInfo()
获取Menu
项目的子菜单 的HMENU
,然后使用它句柄获取color
项的子菜单 的HMENU
,然后最后使用该句柄设置red
项的位图。
此外,您没有检查 LoadBitmap()
是否返回 NULL。即使不是,您也有责任在使用完位图后将其销毁。因此,即使此代码有效,您也会泄漏资源。
【讨论】:
好的,如果我理解正确,我需要调用GetSubMenu(GetMenu(hWnd), 3)
(我总共有 4 个***菜单),然后我需要再次从该菜单调用 GetSubMenu。这是正确的做法吗?
您的屏幕截图仅显示 1 个***菜单项 Menu
,而不是 4 个项。所以,你需要像GetSubMenu(GetSubMenu(GetMenu(hWnd), 0), 2)
这样的东西
不过,我刚刚在documentation 中注意到了一件事:“如果您指定菜单项通过命令,则菜单及其子菜单 搜索其菜单标识符等于提供的项目编号的项目。“所以这可能是一个有争议的问题。很难确定,因为您一开始没有展示您是如何创建菜单的。
我的整个菜单看起来像this。我调整了我的代码,它现在可以工作了。我会接受你上面的回答。非常感谢:)以上是关于如何正确使用 SetMenuItemBitmaps 替换菜单项上的默认位图?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用 Composer 安装 Laravel 扩展包
如何正确使用 Composer 安装 Laravel 扩展包