void TrimWindowRegion(HWND hWnd, Gdiplus::Bitmap& rBmp)
{
if ( rBmp.GetWidth() > 0 && rBmp.GetHeight() > 0 )
{
Gdiplus::Color colr;
HRGN hRgn = CreateRectRgn(0, 0, rBmp.GetWidth(), rBmp.GetHeight());
for (int nWidth=0; nWidth <= rBmp.GetWidth(); ++nWidth)
{
for (int nHeight=0; nHeight <= rBmp.GetHeight(); ++nHeight)
{
if ( rBmp.GetPixel(nWidth, nHeight, &colr) == Gdiplus::Status::Ok )
{
//当前像素为透明
if ( colr.GetA() == 0 )
{
HRGN hTmpRgn = CreateRectRgn(nWidth, nHeight, nWidth+1, nHeight+1);
//扣除这个像素点
int ret = CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR);
DeleteObject(hTmpRgn);
}
}
}
}
if ( hRgn )
{
SetWindowRgn(hWnd, hRgn, FALSE);
DeleteObject(hRgn);
}
}
}
说明:
HWND hWnd为当前窗口句柄
Gdiplus::Bitmap& rBmp为使用gdi+加载的png图
如果加载的图不为png图,没有Alpha通道,而是设置某种颜色为透明色,则可在判断透明处(if ( colr.GetA() == 0 ))改用判断颜色,进行抠图
调用:
在创建窗口后调用
SetWindowLongPtr(m_p_iw->hWnd, GWLP_USERDATA, (LONG_PTR) this);
TrimWindowRegion(GetHwnd(), *m_p_iw->pPaintBmp);
SetWindowPos(GetHwnd(), NULL, 0, 0, m_p_iw->pPaintBmp->GetWidth(), m_p_iw->pPaintBmp->GetHeight(), SWP_NOZORDER | SWP_NOMOVE);