经常被问到 如何制作 PNG 那样的 半透明窗口,所以计划近期准写一个 关于 Layerwindow的专题文章。
其实大致原理是这样:
把PNG 转成 32 bit 的 bitmap,然后
就是call UpdateLayyerWindow api,传对参数就可以了。
待续,coming soon!
void CUIPngWnd::Render()
{
CRect rcWindow;
GetWindowRect(rcWindow);
if(m_BmpAlpha.IsNull()) return ;
CRect rcWindowNew = rcWindow;
//HBITMAP hBmpNew = GetNewBmp(rcWindowNew);
HBITMAP hBmpNew = m_BmpAlpha.GetAlphaBmp(); // PNG to 32 bitmap
if ( NULL == hBmpNew )
return ;
CWindowDC dcClient(m_hWnd);
CDC memDC;
memDC.CreateCompatibleDC(dcClient);
HBITMAP hBitmapOld = memDC.SelectBitmap(hBmpNew);
CPoint ptDest(rcWindowNew.left,rcWindowNew.top);
CPoint ptSrc(0,0);
CSize szWin(rcWindowNew.Width(),rcWindowNew.Height());
BLENDFUNCTION stBlend = { 0/*AC_SRC_OVER*/, 0, 255/*1..255*/, 1/*AC_SRC_ALPHA=1*/ };
::UpdateLayeredWindow(m_hWnd,NULL,&ptDest,&szWin,memDC,&ptSrc,0,&stBlend,0x00000002);
memDC.SelectBitmap(hBitmapOld);
//DeleteObject(hBmpNew);
}
UpdateLayeredWindow 自然会变成 异性窗口了。
下图 就是demo的例子。
0