📄 transparency.cpp
字号:
#include "stdafx.h"
#include "Transparency.h"
BOOL ShowTransparencyBitmap(CDC* pDC, long x, long y,
CBitmap* pBmp, long lOrgX, long lOrgY, long lWidth, long lHeight, COLORREF clrTransparency)
{
ASSERT(NULL != pDC);
ASSERT(NULL != pBmp);
BITMAP bmp;
pBmp->GetBitmap(&bmp);
if (lOrgX >= bmp.bmWidth)
return FALSE;
if (lOrgY >= bmp.bmHeight)
return FALSE;
if (lOrgX < 0)
lOrgX = 0;
if (lOrgY < 0)
lOrgY = 0;
if (lWidth <= 0)
lWidth = bmp.bmWidth;
if (lHeight <= 0)
lHeight = bmp.bmHeight;
if (lOrgX+lWidth > bmp.bmWidth)
lWidth = bmp.bmWidth - lOrgX;
if (lOrgY+lHeight > bmp.bmHeight)
lHeight = bmp.bmHeight - lOrgY;
CPoint ptOrg(lOrgX, lOrgY);
pDC->DPtoLP(&ptOrg);
CSize szBmp(lWidth, lHeight);
pDC->DPtoLP(&szBmp);
// Create a memory DC and select the bitmap into it.
CDC dcImage;
VERIFY(dcImage.CreateCompatibleDC(pDC));
CBitmap* pBmpImageOld = dcImage.SelectObject(pBmp);
dcImage.SetMapMode(pDC->GetMapMode());
// Create a second memory DC and in it create an AND mask.
CDC dcAnd;
VERIFY(dcAnd.CreateCompatibleDC(pDC));
dcAnd.SetMapMode(pDC->GetMapMode());
CBitmap bmpAnd;
VERIFY(bmpAnd.CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, NULL));
CBitmap* pBmpAndOld = dcAnd.SelectObject(&bmpAnd);
dcImage.SetBkColor(clrTransparency);
VERIFY(dcAnd.BitBlt(ptOrg.x, ptOrg.y, szBmp.cx, szBmp.cy, &dcImage, ptOrg.x, ptOrg.y, SRCCOPY));
// Create a third memory DC and in it create an XOR mask.
CDC dcXor;
VERIFY(dcXor.CreateCompatibleDC(pDC));
dcXor.SetMapMode(pDC->GetMapMode());
CBitmap bmpXor;
VERIFY(bmpXor.CreateCompatibleBitmap(&dcImage, bmp.bmWidth, bmp.bmHeight));
CBitmap* pBmpXorOld = dcXor.SelectObject(&bmpXor);
VERIFY(dcXor.BitBlt(ptOrg.x, ptOrg.y, szBmp.cx, szBmp.cy, &dcImage, ptOrg.x, ptOrg.y, SRCCOPY));
VERIFY(dcXor.BitBlt(ptOrg.x, ptOrg.y, szBmp.cx, szBmp.cy, &dcAnd, ptOrg.x, ptOrg.y, 0x220326));
// Copy the pixels in the destination rectangle to temporary memory DC.
CDC dcTemp;
VERIFY(dcTemp.CreateCompatibleDC(pDC));
dcTemp.SetMapMode(pDC->GetMapMode());
CBitmap bmpTemp;
VERIFY(bmpTemp.CreateCompatibleBitmap(&dcImage, bmp.bmWidth, bmp.bmHeight));
CBitmap* pBmpTempOld = dcTemp.SelectObject(&bmpTemp);
VERIFY(dcTemp.BitBlt(ptOrg.x, ptOrg.y, szBmp.cx, szBmp.cy, pDC, ptOrg.x, ptOrg.y, SRCCOPY));
// Generate the final image by appplying the AND and XOR masks to
// the image in the temporary memory DC.
VERIFY(dcTemp.BitBlt(ptOrg.x, ptOrg.y, szBmp.cx, szBmp.cy, &dcAnd, ptOrg.x, ptOrg.y, SRCAND));
VERIFY(dcTemp.BitBlt(ptOrg.x, ptOrg.y, szBmp.cx, szBmp.cy, &dcXor, ptOrg.x, ptOrg.y, SRCINVERT));
// blit the resulting image to the screen.
VERIFY(pDC->BitBlt(x, y, szBmp.cx, szBmp.cy, &dcTemp, ptOrg.x, ptOrg.y, SRCCOPY));
// Restore the default bitmaps.
dcTemp.SelectObject(pBmpTempOld);
dcXor.SelectObject(pBmpXorOld);
dcAnd.SelectObject(pBmpAndOld);
dcImage.SelectObject(pBmpImageOld);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -