如何正确使用 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_CXMENUCHECKSM_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,但redcolor 项的子菜单 的子项,它是子项的子项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 扩展包

如何正确使用 Composer 安装 Laravel 扩展包

如何正确的使用SharedPreferences

如何正确强制正确使用类方法?

如何正确使用 Composer 安装 Laravel 扩展包