如题!希望有成熟的代码段

解决方案 »

  1.   

    需要用到掩碼,AlphBend,如需要代碼,則需要money.
      

  2.   

    CBitmap bmp1, bmp2;
    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);
      

  3.   

    上述代码就是AlphaBlend的一个例子.
    自己准备两幅位图资源IDB_BITMAP1,IDB_BITMAP2.
    m_nAlpha2和m_nAlpha是源和目标的Alpha值, 你可以试着改这两个值,看看结果.
    我觉得一般, 把m_nAlpha=255,改m_nAlpha2就可以达到从透明到不透明的效果了.
      

  4.   

    网上现成的函数
    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);
    }
      

  5.   

    HDC hdc1,hdc2;m_bf.BlendFlags=0;
    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);
      

  6.   

    也可以设了颜色键值之后,用BLT(DDBLTFAST_SRCCOLORKEY)是最快最简单的!
      

  7.   

    LPDIRECTDRAWSURFACE7       DDSur;
    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();//翻页就可以了
      

  8.   

    如果你不希望程序是独占模式,可采用directx的镂空做法。独占模式可采用色键。
      

  9.   

    http://www.vckbase.com/document/viewdoc/?id=532