1、将HBITMAP转换成HICON图标
(1)方法1:
HICON HICONFromCBitmap( CBitmap& bitmap) { BITMAP bmp; bitmap.GetBitmap(&bmp); HDC hDC = ::GetDC(NULL); HBITMAP hbmMask = ::CreateCompatibleBitmap(hDC, bmp.bmWidth, bmp.bmHeight); ICONINFO ii = {0}; ii.fIcon = TRUE; ii.hbmColor = bitmap; ii.hbmMask = hbmMask; HICON hIcon = ::CreateIconIndirect(&ii); // 一旦不再需要,注意用DestroyIcon函数释放占用的内存及资源,否则会导致内存和GDI资源的泄漏 ::DeleteObject(hbmMask); ::ReleaseDC(NULL, hDC); return hIcon; }
#include <gdiplus.h> #pragma comment(lib,"GdiPlus.lib") HICON CreateIcon(HBITMAP hBitmap) { Gdiplus::Bitmap* pTmpBitmap=Gdiplus::Bitmap::FromHBITMAP(hBitmap,NULL); HICON hIcon=NULL; pTmpBitmap->GetHICON(&hIcon); delete pTmpBitmap; // 注意此处一定要delete掉,因为调用Gdiplus::Bitmap::FromHBITMAP方法会在函数内部new一个Bitmap对象,外部要将其释放掉 return hIcon; }
HBITMAP ConvertIconToBitmap(HICON hIcon) { HBITMAP hBmp; BITMAP bmp; CDC bmpDC; CDC iconDC; ICONINFO csII; int bRetValue = ::GetIconInfo(hIcon, &csII); if (bRetValue == FALSE) return NULL; HDC hDC = ::GetDC(NULL); bmpDC.Attach(hDC); iconDC.CreateCompatibleDC(&bmpDC); if (::GetObject(csII.hbmColor, sizeof(BITMAP), &bmp)) { DWORD dwWidth = csII.xHotspot*2; DWORD dwHeight = csII.yHotspot*2; hBmp= ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL); iconDC.SelectObject(csII.hbmColor); bmpDC.SelectObject(hBmp); bmpDC.BitBlt(0,0,dwWidth,dwHeight,&iconDC,0,0,SRCCOPY); return hBmp; } return NULL; }