void CXTPPopupControl::SetRegionAlphaLayer(CXTPImageManagerIcon* pIcon) { if (!pIcon) return; if (!m_pfnUpdateLayeredWindow) return; CXTPImageManagerIconHandle hShadow; hShadow.CopyHandle(pIcon->GetIcon()); if (!hShadow.PreMultiply()) return; PBYTE pBits = hShadow.PreMultiply(); CSize szIcon = hShadow.GetExtent(); int cx = szIcon.cx; int cy = szIcon.cy; BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = 255; bf.AlphaFormat = 0x01; POINT pt = {0, 0}; CClientDC cDC(this); CDC dc; dc.CreateCompatibleDC(&cDC); UINT* pvBits = NULL; HBITMAP hBitmap = CXTPImageManager::Create32BPPDIBSection(cDC, cx, cy, (LPBYTE*)&pvBits); if (pvBits == NULL || hBitmap == NULL) return; MEMCPY_S(pvBits, pBits, cx * cy* 4); HBITMAP hOld = (HBITMAP)SelectObject(dc, hBitmap); ModifyStyleEx(0, WS_EX_LAYERED); m_pfnUpdateLayeredWindow((HWND)GetSafeHwnd(), (HDC)0, 0, &szIcon, dc.GetSafeHdc(), &pt, 0, &bf, 0x02); SelectObject(dc, hOld); DeleteObject(hBitmap); dc.DeleteDC(); m_bLayered = TRUE; }