HRESULT CIconMenu::ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE& sizIcon) { RGBQUAD *prgbQuad; int cxRow; HRESULT hr = pfnGetBufferedPaintBits(hPaintBuffer, &prgbQuad, &cxRow); if (SUCCEEDED(hr)) { Gdiplus::ARGB *pargb = reinterpret_cast<Gdiplus::ARGB *>(prgbQuad); if (!HasAlpha(pargb, sizIcon, cxRow)) { ICONINFO info; if (GetIconInfo(hicon, &info)) { if (info.hbmMask) { hr = ConvertToPARGB32(hdc, pargb, info.hbmMask, sizIcon, cxRow); } DeleteObject(info.hbmColor); DeleteObject(info.hbmMask); } } } return hr; }
/////////////////////////////////////////////////////////////////////////////////////// // private helper for IconToPARGB32Bitmap BOOL ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE& sizIcon) { RGBQUAD *prgbQuad = NULL; int cxRow = 0; if (CThemed::GetBufferedPaintBits(hPaintBuffer, &prgbQuad, &cxRow)) { ARGB *pargb = reinterpret_cast<ARGB *>(prgbQuad); if (!HasAlpha(pargb, sizIcon, cxRow)) { ICONINFO info = { 0 }; if (GetIconInfo(hicon, &info)) { if (info.hbmMask) { ConvertToPARGB32(hdc, pargb, info.hbmMask, sizIcon, cxRow); } // cleanup VERIFY(DeleteObject(info.hbmColor)); VERIFY(DeleteObject(info.hbmMask)); } } return TRUE; } return FALSE; }
HRESULT IconBitmapUtils::ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE& sizIcon) { RGBQUAD *prgbQuad; int cxRow; HRESULT hr = GetBufferedPaintBits(hPaintBuffer, &prgbQuad, &cxRow); if (FAILED(hr)) return hr; Gdiplus::ARGB *pargb = reinterpret_cast<Gdiplus::ARGB *>(prgbQuad); if (HasAlpha(pargb, sizIcon, cxRow)) return S_OK; ICONINFO info; if (!GetIconInfo(hicon, &info)) return S_OK; SCOPE_EXIT { DeleteObject(info.hbmColor); DeleteObject(info.hbmMask); }; if (info.hbmMask) return ConvertToPARGB32(hdc, pargb, info.hbmMask, sizIcon, cxRow); return S_OK; }
void ConvertBufferToPARGB32(HANDLE hPaintBuffer, HDC hdc, HICON hIcon, SIZE& sizIcon) { RGBQUAD *prgbQuad; int cxRow; HRESULT hr = getBufferedPaintBits(hPaintBuffer, &prgbQuad, &cxRow); if (SUCCEEDED(hr)) { ARGB *pargb = (ARGB *)prgbQuad; if (!HasAlpha(pargb, sizIcon, cxRow)) { ICONINFO info; if (GetIconInfo(hIcon, &info)) { if (info.hbmMask) ConvertToPARGB32(hdc, pargb, info.hbmMask, sizIcon, cxRow); DeleteObject(info.hbmColor); DeleteObject(info.hbmMask); } } } }