//时间:2024-04-28
//说明:CImage -> HBITMAP -> HICON
//注意:需要设置ICON的大小 (nIconW, nIconH)
// CImage 不能 alpha 预乘
HICON XuIco::CImage_2_HICON(const CImage& img, int nIconW, int nIconH)
{
if (img.IsNull())
return NULL;
CImage imgIcon;
XuCImage::CompressImage(imgIcon, true, nIconW, nIconH, img, false);
void* pBitsColor = NULL;
HBITMAP hBmpColor = XuWin::MiCreateDIBSection(nIconW, nIconH, &pBitsColor);
void* pBitsMask = NULL;
HBITMAP hBmpMask = XuWin::MiCreateDIBSection(nIconW, nIconH, &pBitsMask); //创建空的掩码层
HDC hdc = ::CreateCompatibleDC(NULL);
HBITMAP hBmpOld = (HBITMAP)::SelectObject(hdc, hBmpColor);
imgIcon.Draw(hdc, 0, 0); //效果一样
//imgIcon.StretchBlt(hdc, 0, 0, nIconW, nIconH, 0, 0, nIconW, nIconH, SRCCOPY | CAPTUREBLT); //从源矩形中复制一个位图到目标矩形,要求:不能alpha预乘
::SelectObject(hdc, hBmpOld);
::DeleteDC(hdc); hdc = NULL;
ICONINFO icoCreate;
::memset(&icoCreate, 0, sizeof(icoCreate));
icoCreate.fIcon = TRUE;
icoCreate.hbmColor = hBmpColor;
icoCreate.hbmMask = hBmpMask;
icoCreate.xHotspot = 0;
icoCreate.yHotspot = 0;
HICON hIcon = ::CreateIconIndirect(&icoCreate); //创建HICON
::DeleteObject(hBmpColor); hBmpColor = NULL;
::DeleteObject(hBmpMask); hBmpMask = NULL;
return hIcon;
}
由 CImage生成指定大小的 HICON
于 2024-05-06 19:41:53 首次发布