如题,,能否提供代码参考。

解决方案 »

  1.   

    你装了directx8的话就有例子程序的啊,看D:\DXSDK\samples\Multimedia\DirectDraw\WindowedMode
      

  2.   

    基本上就是锁定页面,然后根据模式一行一行的复制过去
    //将图片和掩膜直接绘制到后备缓冲
    void CGraphics::DrawAlpha(CDoubleSurface* pSurface, int nDesX,int nDesY)
    {
    DDSURFACEDESC2 ddba,ddsp,ddma;
    DDRAW_INIT_STRUCT(ddba);
    DDRAW_INIT_STRUCT(ddsp);
    DDRAW_INIT_STRUCT(ddma);
    m_pddsBackBuffer->Lock(     NULL, &ddba, DDLOCK_WAIT, NULL );
    pSurface->m_pMask->Lock( NULL, &ddma, DDLOCK_WAIT, NULL );
    pSurface->m_pSprite->Lock( NULL, &ddsp, DDLOCK_WAIT, NULL ); int nEndX=ddsp.dwWidth;
    int nEndY=ddsp.dwHeight;
    int  nStartX=0;
    int nStartY=0;
    int nCurrent;
    int y;
    //裁剪图片如果超出了边界
    if( nDesX < 0 )
    {
    nStartX=-nDesX;
    nDesX = 0;
    }
    if( nDesY < 0 )
    {
    nStartY= -nDesY;
    nDesY = 0;
    }
    if (nDesY>=FRONT_WINDOW_HEIGHT-nEndY)
    {
    nEndY=FRONT_WINDOW_HEIGHT-nDesY;
    }
    if (nDesX>=FRONT_WINDOW_WIDTH-nEndX)
    {
    nEndX=FRONT_WINDOW_WIDTH-nDesX;
    } if( ddba.ddpfPixelFormat.dwRGBBitCount == 32 )
    {
    const DWORD dwBackPatch=ddba.lPitch;
    const DWORD dwSrcPatch  =ddsp.lPitch; BYTE* pbB = (BYTE*)(ddba.lpSurface)+nDesY*dwBackPatch+(nDesX<<2);
    BYTE* pbS = (BYTE*)(ddsp.lpSurface)+nStartY*dwSrcPatch+(nStartX<<2) ;
    BYTE* pbM= (BYTE*)(ddma.lpSurface)+nStartY*dwSrcPatch+(nStartX<<2) ; for(y=nStartY; y<nEndY; y++ )
    {
    nCurrent=nStartX;
    while( nCurrent<nEndX )
    {
    if(0== pbM[0])//colorkey
    {
    if (nCurrent+pbM[1]<nEndX)
    {
    nCurrent+= pbM[1];
    pbB += pbM[1]<<2;
    pbS += pbM[1]<<2;
    pbM += pbM[1]<<2;
    }
    else
    {
    pbB += (nEndX-nCurrent)<<2;
    pbS += (nEndX-nCurrent)<<2;
    pbM +=(nEndX-nCurrent)<<2;
    nCurrent=nEndX;
    }
    }
    else if( 255==pbM[0])
    {
    if (nCurrent+pbM[1]<nEndX)
    {
    ::memcpy((void*)pbB,(void*)pbS,pbM[1]<<2);
    nCurrent+=pbM[1];
    pbB += pbM[1]<<2;
    pbS += pbM[1]<<2;
    pbM += pbM[1]<<2;
    }
    else
    {
    ::memcpy((void*)pbB,(void*)pbS,(nEndX-nCurrent)<<2);
    pbB += (nEndX-nCurrent)<<2;
    pbS += (nEndX-nCurrent)<<2;
    pbM += (nEndX-nCurrent)<<2;
    nCurrent=nEndX;
    }
    }
    else//Alpha
    {
    pbB[0]  = (pbB[0]*pbM[1]>>8) +pbS[0];
    pbB[1]  = (pbB[1]*pbM[1]>>8) +pbS[1];
    pbB[2]  = (pbB[2]*pbM[1]>>8) +pbS[2];
    pbB+=4;
    pbM+=4;
    pbS+=4;
    nCurrent++;
    }
    }//end while
    pbB+=dwBackPatch-((nEndX-nStartX)<<2);
    pbS+=dwSrcPatch-((nEndX-nStartX)<<2);
    pbM+=dwSrcPatch-((nEndX-nStartX)<<2); }//end for
    }
    else
    if( ddba.ddpfPixelFormat.dwRGBBitCount == 16 )
    {
    const DWORD dwBackPatch16=ddba.lPitch>>1;
    const DWORD dwSrcPatch16  =ddsp.lPitch>>1;
    WORD* pwB =(WORD*)(ddba.lpSurface)+(nDesY*dwBackPatch16)+nDesX;
    WORD* pwS =(WORD*)(ddsp.lpSurface)+(nStartY*dwSrcPatch16)+nStartX;
    WORD* pwM =(WORD*)(ddma.lpSurface)+(nStartY*dwSrcPatch16)+nStartX;
    DWORD R,G,B,_R,_G,/*_B,*/RR,GG,BB;
    int  nLow;
    for( y=nStartY; y<nEndY; y++ )
    {
    nCurrent=nStartX;
    while( nCurrent<nEndX )
    {
    if(*pwM<32)
    { if (nCurrent+*pwM<nEndX)
    {
    nCurrent+= *pwM;
    pwB +=*pwM;
    pwS +=*pwM;
    pwM +=*pwM;
    }
    else
    {
    pwB += (nEndX-nCurrent);
    pwS += (nEndX-nCurrent);
    pwM +=(nEndX-nCurrent);
    nCurrent=nEndX;
    }
    }
    else if (*pwM>=63488)//31<<11
    {
    nLow=*pwM-63488;
    if (nCurrent+nLow<nEndX)
    {
    ::memcpy((void*)pwB,(void*)pwS,nLow<<1);
    pwB += nLow;
    pwS += nLow;
    pwM += nLow;
    nCurrent+=nLow;
    }
    else
    {
    ::memcpy((void*)pwB,(void*)pwS,(nEndX-nCurrent)<<1);
    pwB += nEndX-nCurrent;
    pwS += nEndX-nCurrent;
    pwM +=nEndX-nCurrent;
    nCurrent=nEndX;
    }
    }
    else
    {
    _R=*pwM>>11;//只保留最高位
    _G=_R<<1;//(*pwM-(_R<<11))>>5;
    //_B=(*pwM-(_R<<11)-(_G<<5)); R=*pwS>>11;
    G=(*pwS-(R<<11))>>5;
    B=(*pwS-(R<<11)-(G<<5)); RR=*pwB>>11;
    GG=(*pwB-(RR<<11))>>5;
    BB=(*pwB-(RR<<11)-(GG<<5)); RR=(R*_R+RR*(32-_R))>>5;
    GG=(G*_G+GG*(64-_G))>>6;
    BB=(B*_R+BB*(32-_R))>>5; *pwB = (WORD)((RR<<11)+(GG<<5)+BB);
    pwB++;
    pwS++;
    pwM++;
    nCurrent++;
    }
    }
    pwB+=dwBackPatch16-(nEndX-nStartX);
    pwS+=dwSrcPatch16-(nEndX-nStartX);
    pwM+=dwSrcPatch16-(nEndX-nStartX); } 
    } pSurface->m_pSprite->Unlock( NULL );
    pSurface->m_pMask->Unlock( NULL );
    m_pddsBackBuffer->Unlock( NULL );}