我尝试使用 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 文档中概述的步骤操作,图标仍然没有显示。
HICON
和HBITMAP
是完全不同的类型。 您不能将 HICON
与 SetMenuItemInfo()
一起使用。
你必须这样做
将资源类型更改为
BITMAP
,然后使用 LoadBitmap()
或 LoadImage(IMAGE_BITMAP)
将其加载为 HBITMAP
。
保留
ICON
资源,将其加载为 HICON
,然后将其复制到单独的 HBITMAP
,然后您可以将其分配给菜单项。
所有者绘制菜单项,这样您就可以使用
HICON
将原始 HDC
按原样绘制到菜单的 DrawIcon()
上。