近期准备写一个 关于 Layerwindow的专题文章

经常被问到 如何制作 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

Comments are closed.