⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transparency.cpp

📁 电子签章的小部分实现
💻 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 + -