千古难题!半透明绘图,实时移动闪烁的问题,,大家都来聊聊~~ 要实现无移动的半透明绘图很容易,但当移动透明图的时候,半透明的处理要先绘制背景图,再绘制半透明的前景,所以就会产生闪烁,各路高手有什么好方法和经验? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ImageList_DragEnterImageList_DragMove 下载我网站的代码 http://www.hoocode.com hoocode 网站的的代码不错,我把上面的代码取了部分到我的工程之中,我是想将一个CView的派生类让它透明,,我现在的情况是这样,当View刚刚创建的时候有透明的效果,当我一移动那个View,就会渐变成不透明了,我估计是因为多个透明的图贴到上面,就重叠起来,变成了不透明的图,请问Hoocode,这个问题用什么方法解决? 下面是我的代码:void CCompareView::OnPaint() { CPaintDC dc(this); // device context for painting HDC hdc = dc.m_hDC; RECT r; GetClientRect(&r); RECT r1; BITMAP bm; GetObject(bitmap, sizeof(bm), &bm); r1.left = 0; r1.top = 0; r1.bottom = bm.bmHeight; r1.right = bm.bmWidth; //Rectangle(hdc,r.left,r.top,r.right,r.bottom); DrawAlphaBlend(hdc,r,bitmap,r1,0,128);}void CCompareView::DrawAlphaBlend(HDC hdc,RECT rcDes,HBITMAP bmp,RECT rcBmp,COLORREF cTranColor, BYTE blend){ HDC hScrDC; hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL); HDC BkDC =CreateCompatibleDC(hScrDC); HBITMAP bit = CreateCompatibleBitmap(hScrDC,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top); SelectObject(BkDC,bit); BitBlt(BkDC,0,0,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top,hdc,rcDes.left,rcDes.top,SRCCOPY); HDC memdc; memdc = CreateCompatibleDC(hdc); SelectObject(memdc,bmp); TransparentBlt2(BkDC,rcBmp.left,rcBmp.top,rcBmp.right-rcBmp.left,rcBmp.bottom-rcBmp.top, memdc,0,0,rcBmp.right-rcBmp.left,rcBmp.bottom-rcBmp.top,cTranColor); BLENDFUNCTION rBlend; //半透明 rBlend.BlendOp = AC_SRC_OVER; // rBlend.BlendFlags = 0; // rBlend.AlphaFormat = 0; // rBlend.SourceConstantAlpha=blend; AlphaBlend(hdc,rcDes.left,rcDes.top,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top,BkDC,0,0,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top,rBlend); DeleteObject(hScrDC); DeleteObject(BkDC); DeleteObject(bit); DeleteObject(memdc);}void CCompareView::TransparentBlt2(HDC hdc0, //目标DC int nX0,int nY0,int nW0,int nH0,//目标左坐标,目标宽高宽 HDC hdc1, //源DC int nX1,int nY1,int nW1,int nH1,//源起点坐标,源宽高宽 UINT Tcol) //透明色,COLORREF类型{ HBITMAP hBMP =CreateCompatibleBitmap(hdc0,nW0, nH0); //创建位图内存 ////**创建设备兼容位图** //VOID *frame_buffer; //HBITMAP hBitmap; //BITMAPINFO binfo; //memset(&binfo,0, sizeof(binfo)); //binfo.bmiHeader.biSize = sizeof(binfo); //binfo.bmiHeader.biPlanes = 1; //binfo.bmiHeader.biBitCount = 32; //binfo.bmiHeader.biCompression = BI_RGB; //binfo.bmiHeader.biHeight = nH0; //binfo.bmiHeader.biWidth = nW0; //HBITMAP hBMP = CreateDIBSection(hdc0, &binfo, DIB_RGB_COLORS, &frame_buffer, NULL, 0); //::SetMapMode(hdc0, MM_TEXT); ////******************** 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); // 将源DC中的位图拷贝到临时DC中 if (nW0==nW1&&nH0==nH1) 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); //"与"运算,在hdc0生成掩模 BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);//"或"运算,生成最终透明效果 SelectObject(hDC,oldBMP); SelectObject(mDC,oldmBMP); DeleteDC(hDC); DeleteDC(mDC); DeleteObject(hBMP); DeleteObject(mBMP);} VC 字符串分割问题求救 网络编程中如何把以十六进制的子网掩码地址转变为十进制ip地址? 如何禁止访问某个目录 COM+组件中如何操作HTTP包 请问论坛里的Blog和FAQ分别是做什么用的啊? 200分!!!请问怎么往XML中添加一个新的节点?多谢了!!!!!! 不用chtmlview类,来显示网页的例子 急!ACCESS数据库打不开 视图类TreeView和ListView能连用吗? 请问,如何给对话框加工具栏和状态栏? 请教一个问题 用VC写的DLL,VB调用,怎样传递字符串
请问Hoocode,这个问题用什么方法解决?
:void CCompareView::OnPaint()
{
CPaintDC dc(this); // device context for painting
HDC hdc = dc.m_hDC;
RECT r;
GetClientRect(&r);
RECT r1;
BITMAP bm;
GetObject(bitmap, sizeof(bm), &bm);
r1.left = 0;
r1.top = 0;
r1.bottom = bm.bmHeight;
r1.right = bm.bmWidth;
//Rectangle(hdc,r.left,r.top,r.right,r.bottom);
DrawAlphaBlend(hdc,r,bitmap,r1,0,128);}void CCompareView::DrawAlphaBlend(HDC hdc,RECT rcDes,HBITMAP bmp,RECT rcBmp,COLORREF cTranColor, BYTE blend)
{
HDC hScrDC;
hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL);
HDC BkDC =CreateCompatibleDC(hScrDC);
HBITMAP bit = CreateCompatibleBitmap(hScrDC,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top);
SelectObject(BkDC,bit);
BitBlt(BkDC,0,0,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top,hdc,rcDes.left,rcDes.top,SRCCOPY); HDC memdc;
memdc = CreateCompatibleDC(hdc);
SelectObject(memdc,bmp);
TransparentBlt2(BkDC,rcBmp.left,rcBmp.top,rcBmp.right-rcBmp.left,rcBmp.bottom-rcBmp.top,
memdc,0,0,rcBmp.right-rcBmp.left,rcBmp.bottom-rcBmp.top,cTranColor); BLENDFUNCTION rBlend; //半透明
rBlend.BlendOp = AC_SRC_OVER; //
rBlend.BlendFlags = 0; //
rBlend.AlphaFormat = 0; //
rBlend.SourceConstantAlpha=blend;
AlphaBlend(hdc,rcDes.left,rcDes.top,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top,BkDC,0,0,rcDes.right-rcDes.left,rcDes.bottom-rcDes.top,rBlend);
DeleteObject(hScrDC);
DeleteObject(BkDC);
DeleteObject(bit);
DeleteObject(memdc);
}
void CCompareView::TransparentBlt2(HDC hdc0, //目标DC
int nX0,int nY0,int nW0,int nH0,//目标左坐标,目标宽高宽
HDC hdc1, //源DC
int nX1,int nY1,int nW1,int nH1,//源起点坐标,源宽高宽
UINT Tcol) //透明色,COLORREF类型
{
HBITMAP hBMP =CreateCompatibleBitmap(hdc0,nW0, nH0); //创建位图内存
////**创建设备兼容位图**
//VOID *frame_buffer;
//HBITMAP hBitmap;
//BITMAPINFO binfo;
//memset(&binfo,0, sizeof(binfo));
//binfo.bmiHeader.biSize = sizeof(binfo);
//binfo.bmiHeader.biPlanes = 1;
//binfo.bmiHeader.biBitCount = 32;
//binfo.bmiHeader.biCompression = BI_RGB;
//binfo.bmiHeader.biHeight = nH0;
//binfo.bmiHeader.biWidth = nW0;
//HBITMAP hBMP = CreateDIBSection(hdc0, &binfo, DIB_RGB_COLORS, &frame_buffer, NULL, 0);
//::SetMapMode(hdc0, MM_TEXT);
////********************
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);
// 将源DC中的位图拷贝到临时DC中
if (nW0==nW1&&nH0==nH1)
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); //"与"运算,在hdc0生成掩模
BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);//"或"运算,生成最终透明效果
SelectObject(hDC,oldBMP);
SelectObject(mDC,oldmBMP);
DeleteDC(hDC);
DeleteDC(mDC);
DeleteObject(hBMP);
DeleteObject(mBMP);
}