把资源中的PNG(背景透明)图标图标设置为菜单图标

 首先导入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资源。

效果图 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值