如何创建带有图标的Win32 API菜单项?

问题描述 投票:0回答:1

我尝试使用 Win32 API 将图标添加到 Windows 应用程序中的菜单项,但该图标未显示。我已按照 Win32 API 文档中的说明进行操作,但仍然无法正常工作。谁能帮我解决这个问题吗?

HMENU createContextMenu(HWND hwnd, HINSTANCE hInstance) {
    HMENU hMenu = CreatePopupMenu();
    if (hMenu) {
        AppendMenu(hMenu, MF_STRING, IDM_APP_ABOUT, "&About");
        AppendMenu(hMenu, MF_SEPARATOR, (UINT_PTR)-1, NULL);
        AppendMenu(hMenu, MF_STRING, IDM_APP_EXIT, "&Exit");

        // Assuming you have an icon resource named ICON_MENU_EXIT
        HICON hIconExit = LoadIcon(hInstance, MAKEINTRESOURCE(ICON_MENU_EXIT));
        if (hIconExit) {
            MENUITEMINFO menuItemInfo = { sizeof(MENUITEMINFO) };
            menuItemInfo.fMask = MIIM_BITMAP;
            menuItemInfo.hbmpItem = (HBITMAP)CopyImage(hIconExit, IMAGE_ICON, 0, 0, LR_COPYFROMRESOURCE);
            SetMenuItemInfo(hMenu, IDM_APP_EXIT, FALSE, &menuItemInfo);
            DestroyIcon(hIconExit); // Destroy the icon only if setting the image was successful
        }
    }
    return hMenu;
}
case WM_USER_TRAYICON:
        if (lParam == WM_LBUTTONDBLCLK) {
            ShowWindow(hwnd, SW_SHOW);
        } else if (lParam == WM_RBUTTONUP) {
            POINT trayPos;
            GetCursorPos(&trayPos);
            HMENU hMenu = createContextMenu(hwnd,hInstance);
            SetForegroundWindow(hwnd); // Menjamin menu bekerja dengan benar
            UINT clicked = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_NONOTIFY, trayPos.x, trayPos.y, 0, hwnd, NULL);
            if (clicked == IDM_APP_EXIT) {
                PostQuitMessage(0);
            }
            DestroyMenu(hMenu); // Hancurkan menu setelah digunakan
        }
        break;

我尝试使用 LoadIcon 函数从资源加载图标,并使用 SetMenuItemInfo 或 SetMenuItemBitmaps 将其设置为菜单项。我希望在显示菜单时该图标出现在菜单项“退出”旁边。然而,尽管按照 Win32 API 文档中概述的步骤操作,图标仍然没有显示。

windows winapi win32gui
1个回答
0
投票

HICON
HBITMAP
是完全不同的类型。 您不能将
HICON
SetMenuItemInfo()
一起使用。

你必须这样做

  1. 将资源类型更改为

    BITMAP
    ,然后使用
    LoadBitmap()
    LoadImage(IMAGE_BITMAP)
    将其加载为
    HBITMAP

  2. 保留

    ICON
    资源,将其加载为
    HICON
    ,然后将其复制到单独的
    HBITMAP
    ,然后您可以将其分配给菜单项。

  3. 所有者绘制菜单项,这样您就可以使用

    HICON
    将原始
    HDC
    按原样绘制到菜单的
    DrawIcon()
    上。

© www.soinside.com 2019 - 2024. All rights reserved.