codeproject上jerry wang 做了个透明背景图,其原理就是重新用一张PNG图重新画窗口,
代码中我找到了处理背景的操作,但是我在自己的MFC工程中在onEraseBkg里用同样的操作一张PNG图做背景时,再用
updtaelayerwindow 显示的确是全透明背景……看了BLENDFUNCTION的介绍,知道跟alpha操作有关。 //Image *pImage=CUtility::LoadImage(IDB_PNG1,"PNG",AfxGetResourceHandle());
//UINT m_nWidth=pImage->GetWidth();
//UINT m_nHeight=pImage->GetHeight();
//POINT ptSrc = { 0, 0};
//POINT ptWinPos = { clientRC.left, clientRC.top};
//SIZE szWin = { m_nWidth, m_nHeight };
//BLENDFUNCTION bl={AC_SRC_OVER,0,5,AC_SRC_ALPHA};
//BITMAPINFOHEADER stBmpInfoHeader = { 0 };   
//int nBytesPerLine = ((m_nWidth * 32 + 31) & (~31)) >> 3;
//stBmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);   
//stBmpInfoHeader.biWidth = m_nWidth;   
//stBmpInfoHeader.biHeight =m_nHeight;   
//stBmpInfoHeader.biPlanes = 1;   
//stBmpInfoHeader.biBitCount = 32;   
//stBmpInfoHeader.biCompression = BI_RGB;   
//stBmpInfoHeader.biClrUsed = 0;   
//stBmpInfoHeader.biSizeImage = nBytesPerLine * m_nHeight;    //PVOID pvBits=NULL;
//HBITMAP hbmp=CreateDIBitmap(NULL,&stBmpInfoHeader,DIB_RGB_COLORS,&pvBits,NULL,0); //HGDIOBJ hbmpOld=::SelectObject(memDC.GetSafeHdc(),hbmp);
//Graphics graph(memDC.GetSafeHdc());
//graph.SetSmoothingMode(SmoothingModeNone);
//graph.DrawImage(pImage,0,0,m_nWidth,m_nHeight);这样做跟原作的例子应该具有相同的效果,为什么我的就是不行呢?附上原作地址大家看看:http://www.codeproject.com/KB/dialog/SemiTranDlgWithCtrls.aspx
我再看看的网上说的机制- -