首先导入PNG图像到资源中,需要自定义资源文件夹,然后导入图像,如图所示:
加载png图像,返回HBITMAP对象
_inline HBITMAP XXXDlg::loadimage(UINT nResID)
{
CImage m_Image;
CComPtr<IStream> stream;
stream = NULL;
HBITMAP hbitmap;
// 查找资源
HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), _T("PNG") );
if (hRsrc == NULL) return false;
// 加载资源
HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
if (hImgData == NULL)
{
::FreeResource(hImgData);
return false;
}
// 锁定内存中的指定资源
LPVOID lpVoid = ::LockResource(hImgData);
//LPSTREAM pStream = NULL;
DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc);
HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize);
LPVOID lpByte = (LPBYTE)::GlobalLock(hNew);
::memcpy(lpByte, lpVoid, dwSize);
// 解除内存中的指定资源
::GlobalUnlock(hNew);
// 从指定内存创建流对象
HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &stream);
if ( ht != S_OK )
{
::GlobalFree(hNew);
}
else
{
// 加载图片
HRESULT ret = m_Image.Load(stream);
if (S_OK==ret)
{
for (int i=0;i<m_Image.GetWidth();i++)
{
for (int j=0;j<m_Image.GetHeight();j++)
{
unsigned char* pucColor = reinterpret_cast<unsigned char *>(m_Image.GetPixelAddress(i , j));
pucColor[0] = pucColor[0] * pucColor[3] / 255;
pucColor[1] = pucColor[1] * pucColor[3] / 255;
pucColor[2] = pucColor[2] * pucColor[3] / 255;
}
}
hbitmap = m_Image.Detach();
}
::GlobalFree(hNew);
}
m_Image.Destroy();
// 释放资源
::FreeResource(hImgData);
return hbitmap;
}
设置菜单图标
SetMenu(NULL); //移除菜单
CMenu m_Menu;
CMenu *pMenum;
HBITMAP hbitmap;
m_Menu.LoadMenu(IDR_MENU_MAIN);
SetMenu(&m_Menu);
int nCount = m_Menu.GetMenuItemCount();//获取菜单项数目
int *mCount=new int[nCount];
int k=0;CString szKey;
for (int i=0;i<nCount;i++)
{
pMenum = m_Menu.GetSubMenu(i);
mCount[i]=pMenum->GetMenuItemCount();//获取指定子菜单项数目
for (int j=0;j<mCount[i];j++)
{
int idx=k+j;
hbitmap=loadimage(IDB_PNG_FILE+idx);//加载png图像(将图像ID按顺序定义,可以在资源文件中更改,使用更方便)
::SetMenuItemBitmaps(pMenum->m_hMenu, j, MF_BYPOSITION, hbitmap, hbitmap);//设置菜单项
}
k+=mCount[i];
}
delete[] mCount;
//修改菜单背景颜色
MENUINFO MenuInfo = { 0 };
MenuInfo .cbSize = sizeof(MenuInfo );
MenuInfo .fMask = MIM_BACKGROUND|MIM_APPLYTOSUBMENUS;
MenuInfo .hbrBack = ::CreateSolidBrush(RGB(180,180,180));
m_Menu.SetMenuInfo(&MenuInfo);
DestroyMenu(m_Menu.Detach());//销毁使用的菜单和所有Windows资源。
效果图