【发布时间】:2019-02-20 13:15:07
【问题描述】:
我有一个在特定情况下会提示的菜单。
我有一个位图图像,其中包含我要添加到菜单中的图标。
首先,我加载图像列表如下:
CImageList imageList;
imageList.Create(18, 16, ILC_COLOR24|ILC_MASK, 0, 0)
CBitmap bitmap;
bitmap.LoadBitmap(IDR_CL2_TAB_MENU_OPTIONS);
imageList.Add(&bitmap, RGB(192, 192, 192));
其次,我尝试使用以下方法提取位图以添加到菜单中
IMAGEINFO imgInfo;
ImgList.GetImageInfo( nBmpNo, &imgInfo );
pMenu->SetMenuItemBitmaps(iItem, MF_BYPOSITION, CBitmap::FromHandle( imgInfo.hbmImage ), NULL);
但不幸的是,它不起作用,所以我尝试了这里编写的代码 https://www.codeproject.com/Articles/4673/Extracting-Single-Images-from-a-CImageList-object
但它只在菜单中给我黑色图标。
这是我显示菜单的完整功能:
void CMainFrame::ShowTabOptions(CPoint point)
{
CMenu Menu, *pMenu = NULL;
if (!Menu.LoadMenu (IDR_POPUP_TAB_OPTIONS))
return;
pMenu = Menu.GetSubMenu(0);
if (NULL == pMenu)
return;
CImageList imageList;
if(!imageList.Create(18, 16, ILC_COLOR24|ILC_MASK, 0, 0))
return;
CBitmap bitmap;
bitmap.LoadBitmap(IDR_CL2_TAB_MENU_OPTIONS);
imageList.Add(&bitmap, RGB(192, 192, 192));
CArray<CBitmap*, CBitmap*> bitmapArray;
CBitmap b1, b2, b3, b4, b5, b6, b7, b8, b9;
bitmapArray.Add(&b1);
bitmapArray.Add(&b2);
bitmapArray.Add(&b3);
bitmapArray.Add(&b4);
bitmapArray.Add(&b5);
bitmapArray.Add(&b6);
bitmapArray.Add(&b7);
bitmapArray.Add(&b8);
bitmapArray.Add(&b9);
for (int iItem = 0; iItem < 9; iItem++)
{
imageList.Copy( 0, iItem, ILCF_SWAP );
IMAGEINFO imageInfo;
imageList.GetImageInfo(0,&imageInfo);
CDC dc;
dc.CreateCompatibleDC (GetWindowDC());
CRect rect (imageInfo.rcImage);
bitmapArray.GetAt(iItem)->CreateCompatibleBitmap (this->GetWindowDC(), rect.Width (), rect.Height ());
CBitmap* pOldBmp = dc.SelectObject (bitmapArray.GetAt(iItem));
imageList.DrawIndirect (&dc, 0, CPoint (0, 0), CSize (rect.Width (), rect.Height ()), CPoint (0, 0)/*, ILD_NORMAL, SRCCOPY, RGB(255, 255, 255)*/);
dc.SelectObject (pOldBmp);
pMenu->SetMenuItemBitmaps(iItem, MF_BYPOSITION, bitmapArray.GetAt(iItem), NULL);
}
pMenu->TrackPopupMenu (TPM_LEFTALIGN | TPM_VCENTERALIGN | TPM_LEFTBUTTON, point.x, point.y, this, NULL);
Menu.DestroyMenu ();
for (int iIndex = 0; iIndex < bitmapArray.GetCount(); iIndex ++)
{
bitmapArray.GetAt(iIndex)->DeleteObject();
}
}
谁能告诉我我错过了什么?
提前致谢
【问题讨论】:
-
位图 != 图标。图标具有透明度信息,可以通过图像掩码,也可以通过存储 PNG 图像。另一方面,位图只包含图像数据。部分数据可以解释为(alpha)透明度信息,但您必须明确说明。
-
@IInspectable 感谢您的评论。如果我将位图扩展名更改为 PNG 或图标,我该如何加载它们并将它们发送到菜单?你能给我一个编码提示吗?
-
您可以在 MSDN (Image List Reference) 中找到您需要的所有信息。
-
@IInspectable 设置菜单项图标的唯一函数是
SetMenuItemBitmaps,它采用位图 -
所以您已经知道,为什么会出现这种行为。 As documented: “选择和清除的位图应该是单色。[...] 如果您使用彩色位图,结果可能不理想。” 无论如何,这是使用错误的工具。你会想改用SetMenuItemInfo。 Using Menus 也很有帮助。
标签: c++ mfc menuitem imagelist