如何正确使用 SetMenuItemBitmaps 来替换菜单项上的默认位图?

How properly use SetMenuItemBitmaps to replace the default bitmap on a menu item?

我正在尝试更改菜单项上的默认位图。不幸的是,我没有让它工作。

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 的菜单项,我要更改其位图:

您需要 red 项直接所属的菜单的 HMENU 句柄。您正在使用顶级 HMENU,但 redcolor 项目的 子菜单 的子项目,这是一个子菜单的子项 Menu 项的子项,它是顶级菜单的子项。

获得顶级 HMENU 后,使用 GetSubMenu() or GetMenuItemInfo() 获取 子菜单 HMENU Menu 项,然后使用该句柄获取 子菜单的 HMENU color 项的 ,最后使用该句柄进行设置red 项的位图。

此外,您没有检查 LoadBitmap() 是否返回 NULL。即使不是,您也有责任在使用完位图后销毁它们。因此,即使此代码有效,您也会泄漏资源。