如题!希望有成熟的代码段
解决方案 »
- 求助:mfc通过 AutoCAD Activex控制AutoCAD,弹出“服务器正在运行中...切换到...”
- 内存映射 按打开按扭时可以读数,但一改变qwFileOffset就读不出来了
- 弱问: MFC在资源位图上进行反复绘制,需要反复载入吗?
- 一个程序段,好像是调用函数,一直看不懂
- VC全屏显示时如何实现顶部显示连接栏
- VS2005 专业版和企业版有哪些区别?
- *****对于Serialize(CArchive& ar)函数的一个疑惑*****
- 请教各位,我用wise installation system(9.01)打包程序生成程序管理组后,为什么反安装不能删除创建的程序组?
- 寻求vc写NT Service的资料,例子或网站!
- 高分回报:多种文件格式的OLE显示问题,
- 关于获取MAC地址的问题
- ???我用ADO添加时,为什么会出错?
CBitmap *pOldBmp1, *pOldBmp2;
bmp1.LoadBitmap(IDB_BITMAP1);
//bmp2.LoadBitmap(IDB_BITMAP2);
BITMAP bmpInfo;
bmp1.GetBitmap(&bmpInfo);
//
CDC MemDC1, MemDC2;
MemDC1.CreateCompatibleDC(pDC);
pOldBmp1 = MemDC1.SelectObject(&bmp1);
MemDC2.CreateCompatibleDC(pDC);
// bmp2.CreateBitmap(bmpInfo.bmWidth, bmpInfo.bmHeight,
// 1, 32, NULL);
HBITMAP hBmp2;
BITMAPINFO bmpInfo2;
memset(&bmpInfo2, 0, sizeof(BITMAPINFO));
bmpInfo2.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo2.bmiHeader.biWidth = bmpInfo.bmWidth;
bmpInfo2.bmiHeader.biHeight = bmpInfo.bmHeight;
bmpInfo2.bmiHeader.biPlanes = 1;
bmpInfo2.bmiHeader.biBitCount = 32 ;
bmpInfo2.bmiHeader.biCompression = BI_RGB;
bmpInfo2.bmiHeader.biClrUsed = 0; void *pBit2;
hBmp2 = ::CreateDIBSection(pDC->GetSafeHdc(), &bmpInfo2, DIB_RGB_COLORS,
&pBit2, NULL, 0);
bmp2.Attach(hBmp2); pOldBmp2 = MemDC2.SelectObject(&bmp2);
MemDC2.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
&MemDC1, 0, 0, SRCCOPY);
//MemDC1.FillSolidRect(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, RGB(255,0,0));
MemDC1.SelectObject(pOldBmp1);
bmp1.DeleteObject();
bmp1.LoadBitmap(IDB_BITMAP2);
pOldBmp1 = MemDC1.SelectObject(&bmp1);
//deal with alpha channel
BITMAP tmp;
bmp2.GetBitmap(&tmp);
LPBYTE lpDst, lpDstTmp;
LONG lDstStride = tmp.bmWidthBytes;
lpDst = (LPBYTE)pBit2;
LONG i, j;
BYTE alpha = m_nAlpha2;
for( j = 0 ; j < bmpInfo.bmHeight; ++j )
{
lpDstTmp = lpDst;
lpDstTmp += 3;
for( i = 0 ; i < bmpInfo.bmWidth; ++i )
{
*lpDstTmp = alpha;
lpDstTmp+=4;
}
lpDst += lDstStride;
} BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = m_nAlpha;
bf.AlphaFormat = AC_SRC_ALPHA;
BOOL br;
br = ::AlphaBlend(MemDC1.GetSafeHdc(), 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
MemDC2.GetSafeHdc(), 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
bf);
pDC->BitBlt(bmpInfo.bmWidth, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
&MemDC1, 0, 0, SRCCOPY);
自己准备两幅位图资源IDB_BITMAP1,IDB_BITMAP2.
m_nAlpha2和m_nAlpha是源和目标的Alpha值, 你可以试着改这两个值,看看结果.
我觉得一般, 把m_nAlpha=255,改m_nAlpha2就可以达到从透明到不透明的效果了.
void CDesignDlg::TransparentBlt2(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP); // 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY); // 设置透明色
SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); // 清理、恢复
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
m_bf.AlphaFormat=0;
m_bf.SourceConstantAlpha=透明度DDBuf1->GetDC(&hdc1);
DDBuf2->GetDC(&hdc2);
AlphaBlend(hdc1,0,0,250,250,hdc2,0,0,250,250,m_bf);
DDBuf1->ReleaseDC(hdc1);
DDBuf2->ReleaseDC(hdc2);
DDSURFACEDESC2 DDde;
LPDIRECTDRAW7 DD;DirectDrawCreateEx(NULL, (VOID**)&DD, IID_IDirectDraw7, NULL);//建立 DirectDraw 对象
DD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );//设定协调等级
SetDisplayMode(1024,768,16,0,DDSDM_STANDARDVGAMODE); //设定显示模式//建立主绘图页
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
DDde.dwBackBufferCount = 2;
DDde.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP|DDSCAPS_VIDEOMEMORY;
DD->CreateSurface(&DDde,&DDSur,NULL);
//连结后缓冲区
DDcaps.dwCaps = DDSCAPS_BACKBUFFER;
DDSur->GetAttachedSurface(&DDcaps,&DDBuf); //声明幕后幕存区的共同特性
memset(&DDde,0,sizeof(DDde));
DDde.dwSize = sizeof(DDde);
DDde.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
DDde.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
//面
DDde.dwWidth=1024;
DDde.dwHeight=768;
DD->CreateSurface(&DDde, &DDSur, NULL); //设颜色键值
key.dwColorSpaceHighValue = RGB(200,0,200);
key.dwColorSpaceLowValue = RGB(255,0,255);
DDSur->SetColorKey(DDCKEY_SRCBLT,&key);后面用LoadImage()将图载入到DDSur面
DDSur->SetColorKey(DDCKEY_SRCBLT,&key);//设透明
用BltFast(DDBLTFAST_SRCCOLORKEY);//到幕后缓冲
再用Flip();//翻页就可以了