学习利用位图拷贝BitBlt()的逻辑运算生成透明位图的方法。
介绍刷屏和一个最简单的刷屏方法。
介绍了VC的编译模式的设置方法。
重点:透明位图的原理和生成方法。
- MemDC =CreateCompatibleDC(0); //创建两个兼容dc,图像dc
- DCBak =CreateCompatibleDC(0); //背景dc
- void CMyDlg::OnTimer(UINT nIDEvent) //加载人的图片
- { CClientDC dc(this);
- int x=200,y=200;
- BitBlt(dc.m_hDC,x,y,100,100,DCBak,x,x,SRCCOPY); //将地图的200,200,的像素拷贝到dc中
- //dc.m_hDC可以说是背景设备描述表
- if(getpic("人",p)==FALSE)
- {AfxMessageBox(cc+"没找到!");return;}
- SelectObject(MemDC,bit);
- TransparentBlt2(dc.m_hDC,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));//显示透明背景的位图
- p++;
- if(p>m1) p=m0;
- CDialog::OnTimer(nIDEvent);
- }
创建透明背景的位图算法
- void TransparentBlt2( HDC hdc0,
- int nX0,int nY0,
- int nW0,int nH0,
- HDC hdc1,
- int nX1,int nY1,
- int nW1,int nH1,
- UINT Tcol
- )
- { HBITMAP hBMP =CreateCompatibleBitmap(hdc0,nW0, nH0);// 创建兼容位图
- HBITMAP mBMP =CreateBitmap(nW0,nH0,1,1,NULL); // 创建单色掩码位图
- HDC hDC =CreateCompatibleDC(hdc0);
- HDC mDC =CreateCompatibleDC(hdc0);
- HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
- HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
- if (nW0==nW1&&nH0==nH1)// 将源DC中的位图拷贝到临时DC中
- BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
- else
- StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);
- SetBkColor(hDC, Tcol); // 设置透明色
- BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY); // 生成透明区域为白色,其它区域为黑色的掩码位图
- // 生成透明区域为黑色,其它区域保持不变的位图
- SetBkColor(hDC, RGB(0,0,0));
- SetTextColor(hDC, RGB(255,255,255));
- BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
- // 透明部分保持屏幕不变,其它部分变成黑色
- SetBkColor(hdc0,RGB(255,255,255));
- SetTextColor(hdc0,RGB(0,0,0));
- BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND);
- // "或"运算,生成最终效果
- BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);
- // 清理、恢复
- SelectObject(hDC, oldBMP);
- DeleteDC(hDC);
- SelectObject(mDC, oldmBMP);
- DeleteDC(mDC);
- DeleteObject(hBMP);
- DeleteObject(mBMP);
- }
本文出自 “不曾远去” 博客,谢绝转载!