如何正确使用 SetMenuItemBitmaps 来替换菜单项上的默认位图?
How properly use SetMenuItemBitmaps to replace the default bitmap on a menu item?
我正在尝试更改菜单项上的默认位图。不幸的是,我没有让它工作。
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
的菜单项,我要更改其位图:
您需要 red
项直接所属的菜单的 HMENU
句柄。您正在使用顶级 HMENU
,但 red
是 color
项目的 子菜单 的子项目,这是一个子菜单的子项 Menu
项的子项,它是顶级菜单的子项。
获得顶级 HMENU
后,使用 GetSubMenu()
or GetMenuItemInfo()
获取 子菜单 的 HMENU
Menu
项,然后使用该句柄获取 子菜单的 HMENU
color
项的 ,最后使用该句柄进行设置red
项的位图。
此外,您没有检查 LoadBitmap()
是否返回 NULL。即使不是,您也有责任在使用完位图后销毁它们。因此,即使此代码有效,您也会泄漏资源。
我正在尝试更改菜单项上的默认位图。不幸的是,我没有让它工作。
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
的菜单项,我要更改其位图:
您需要 red
项直接所属的菜单的 HMENU
句柄。您正在使用顶级 HMENU
,但 red
是 color
项目的 子菜单 的子项目,这是一个子菜单的子项 Menu
项的子项,它是顶级菜单的子项。
获得顶级 HMENU
后,使用 GetSubMenu()
or GetMenuItemInfo()
获取 子菜单 的 HMENU
Menu
项,然后使用该句柄获取 子菜单的 HMENU
color
项的 ,最后使用该句柄进行设置red
项的位图。
此外,您没有检查 LoadBitmap()
是否返回 NULL。即使不是,您也有责任在使用完位图后销毁它们。因此,即使此代码有效,您也会泄漏资源。