要实现无移动的半透明绘图很容易,但当移动透明图的时候,半透明的处理要先绘制背景图,再绘制半透明的前景,所以就会产生闪烁,各路高手有什么好方法和经验?

解决方案 »

  1.   

    ImageList_DragEnterImageList_DragMove
      

  2.   

    下载我网站的代码 http://www.hoocode.com
      

  3.   

    hoocode 网站的的代码不错,我把上面的代码取了部分到我的工程之中,我是想将一个CView的派生类让它透明,,我现在的情况是这样,当View刚刚创建的时候有透明的效果,当我一移动那个View,就会渐变成不透明了,我估计是因为多个透明的图贴到上面,就重叠起来,变成了不透明的图,
    请问Hoocode,这个问题用什么方法解决?
      

  4.   

    下面是我的代码
    :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);
    }