dx 文档资料里面没有说明啊!谁能帮我??

解决方案 »

  1.   

    /************************************************************************************************************
       THIS FUNCTION DESIGN BY WYLING
       MUST USE CoInitialze(NULL); and CoUninitialize();
        INCLUDE:#include "ddraw.h"
                //#include <DXTrans.h>
                //#include <DXTGuid.c>
                //#include <DXBounds.h>
                #include <DXHelper.h>
                //#include <DXTError.h>
                //#include <dxtmsftguid.h>        
    *   LIB:    kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ddraw.lib 
    *************************************************************************************************************/
    #define SafeRelease(x) if (x) { x->Release(); x=NULL;}class DXTRANS
    {
    public:
    LPDIRECTDRAW lpDD;
    IDXSurface* lpDDSPrimary;
    IDXSurface* lpOutputSurface;
    IDXSurfaceFactory* lpSurfaceFactory; 
    IDXTransformFactory* lpTransformFactory; 
    IDXTransform* lpTransform; 
    IDXEffect* lpDXEffect; DXTRANS()
    {
    lpDD = NULL;
    lpDDSPrimary = NULL;
    lpOutputSurface = NULL;
    lpSurfaceFactory = NULL; 
    lpTransformFactory = NULL; 
    lpTransform = NULL; 
    lpDXEffect = NULL;
    } ~DXTRANS()
    {
    Cleanup();
    }

    bool InitDDraw(HWND hWnd)//初始化DirectDraw组件,使lpDD有效
    {
    HRESULT ddrval;
    ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
    if (ddrval != DD_OK){return false;}
    ddrval = lpDD->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
    if (ddrval != DD_OK){return false;}
    return true;
    }
    /**************************************************************************************************************
    const CLSID CLSID_effect1 = {0xAF279B30,0x86EB,0x11D1,0x81,0xBF,0x00,0x00,0xF8,0x75,0x57,0xDB};//抹去
    const CLSID CLSID_effect2 = {0xAA0D4D03,0x06A3,0x11D2,0x8F,0x98,0x00,0xC0,0x4F,0xB9,0x2E,0xB7};//波浪
    const CLSID CLSID_effect3 = {0xAA0D4D0A,0x06A3,0x11D2,0x8F,0x98,0x00,0xC0,0x4F,0xB9,0x2E,0xB7};//液体流过
    const CLSID CLSID_effect4 = {0x3F69F351,0x0379,0x11D2,0xA4,0x84,0x00,0xC0,0x4F,0x8E,0xFB,0x69};//方块分割
    const CLSID CLSID_effect5 = {0x107045C8,0x06E0,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//向两边扩散
    const CLSID CLSID_effect6 = {0x0E6AE022,0x0C83,0x11D2,0x8C,0xD4,0x00,0x10,0x4B,0xC7,0x5D,0x9A};//虫孔
    const CLSID CLSID_effect7 = {0x107045CA,0x06E0,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//透镜
    const CLSID CLSID_effect8 = {0x16B280C5,0xEE70,0x11D1,0x90,0x66,0x00,0xC0,0x4F,0xD9,0x18,0x9D};//退色 
    const CLSID CLSID_effect9 = {0x2A54C908,0x07AA,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//Color退色
    const CLSID CLSID_effect10 ={0x2A54C90B,0x07AA,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//吹风
    const CLSID CLSID_effect11 ={0xAA0D4D0C,0x06A3,0x11D2,0x8F,0x98,0x00,0xC0,0x4F,0xB9,0x2E,0xB7};//剥落
    const CLSID CLSID_effect12 ={0x107045D1,0x06E0,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//黑色的晕
    const CLSID CLSID_effect13 ={0x00C429C0,0x0BA9,0x11d2,0xA4,0x84,0x00,0xC0,0x4F,0x8E,0xFB,0x69};//卷连门
    const CLSID CLSID_effect14 ={0xC3BDF740,0x0B58,0x11d2,0xA4,0x84,0x00,0xC0,0x4F,0x8E,0xFB,0x69};//从中间向两边扩散
    const CLSID CLSID_effect15 ={0x9C61F46E,0x0530,0x11D2,0x8F,0x98,0x00,0xC0,0x4F,0xB9,0x2E,0xB7};//卷动
    const CLSID CLSID_effect16 ={0x7658F2A2,0x0A83,0x11d2,0xA4,0x84,0x00,0xC0,0x4F,0x8E,0xFB,0x69};//拉伸
    const CLSID CLSID_effect17 ={0x107045C5,0x06E0,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//左右摇摆的波浪
    const CLSID CLSID_effect18 ={0x2A54C915,0x07AA,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//侵蚀
    const CLSID CLSID_effect19 ={0x2A54C904,0x07AA,0x11D2,0x8D,0x6D,0x00,0xC0,0x4F,0x8E,0xF8,0xE0};//峡口
    ***************************************************************************************************************/ bool InitDTransform(int cx,int cy,REFCLSID transStyle)//cx,cy表示输出界面的大小
    {
    CDXDBnds ImageBounds;
    HRESULT hres, ddrval;
        hres = CoCreateInstance(CLSID_DXTransformFactory,NULL,CLSCTX_INPROC,IID_IDXTransformFactory,(void**)&lpTransformFactory);
    if (hres != S_OK){return false;}
    hres = lpTransformFactory->QueryInterface(IID_IDXSurfaceFactory,(void**)&lpSurfaceFactory);
    if (hres != S_OK){return false;}
        hres = lpTransformFactory->CreateTransform( NULL,0,NULL,0,NULL,NULL,transStyle,IID_IDXTransform,(void**)&lpTransform);
    if (hres != S_OK){return false;}
    hres = lpTransform->QueryInterface(IID_IDXEffect,(void**)&lpDXEffect);
    if (hres != S_OK){return false;}
    ImageBounds.SetXYSize(cx, cy);
    hres = lpSurfaceFactory->CreateSurface( NULL,NULL,&DDPF_PMARGB32,&ImageBounds,0,NULL,IID_IDXSurface,(void**)&lpOutputSurface);
    if (hres != S_OK){return false;}
        DDSURFACEDESC ddsd;
    ZeroMemory(&ddsd,sizeof(ddsd));
        ddsd.dwSize = sizeof(ddsd);
        ddsd.dwFlags = DDSD_CAPS;
        ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
    ddrval=lpSurfaceFactory->CreateSurface(NULL,&ddsd,NULL,NULL,0,NULL,IID_IDXSurface,(void **)&lpDDSPrimary);
    if (ddrval != DD_OK){return false;}
    return true;
    }
    bool SetupTransform(IUnknown **in,int inNum)//用法: IUnknow *in[2];in[0]=(IDXSurface).
    {
    HRESULT hres;
        IUnknown* out[1];
    out[0] = lpOutputSurface;
    hres = lpTransform->Setup(in, inNum, out, 1, 0);
    if (hres != S_OK){return false;}
    return true;
    }
        bool LoadDXSurface(char FileName[256],IDXSurface** surface)
    {
    HRESULT hres;
    WCHAR WFileName[256];
    mbstowcs(WFileName, FileName, 256);
    SafeRelease((*surface));
    if (lpSurfaceFactory == NULL){return false;}
    hres = lpSurfaceFactory->LoadImage(WFileName,NULL,NULL,NULL,IID_IDXSurface,(void**)surface);
    if (hres != S_OK){return false;}
        return true;
    }
        bool RunImageTransform(float step,DXVEC desc,DXBNDS src)//step应该是1.0的倍数  
                                                            //desc:目标坐标   CDXDVec Placement( (WindowWidth - width)/2, (WindowHeight - height)/2, 0, 0 );
    //src: 源距形     CDXDBnds PortionBnds(width, height);
    {
    HRESULT hres;
    DXVEC TransformPlacement = { DXBT_DISCRETE, 0 };
        if (lpOutputSurface == NULL){return false;}
    hres = DXFillSurface(lpOutputSurface, 0x0, FALSE);
    if (hres != S_OK) return false;
    static float progress=0.0f,add=step;
    progress += add;
    if (progress > 1.0f)
    {
    add = (-step);
    progress = 1.0f;
    }
    if (progress < 0.0f)
    {
    add = step;
    progress = 0.0f;
    }
    lpDXEffect->put_Progress(progress);// 0:代表第一个图形 1:代表第二个图形
    hres = lpTransform->Execute(NULL,NULL,&TransformPlacement);
    hres = lpSurfaceFactory->BitBlt( lpDDSPrimary,&desc,lpOutputSurface,&src,DXBOF_DO_OVER);
    if (hres != S_OK)return false;
    return true;
    }    void Cleanup()
    {
        SafeRelease(lpDDSPrimary);
        SafeRelease(lpOutputSurface);
        SafeRelease(lpSurfaceFactory);
        SafeRelease(lpTransform);
        SafeRelease(lpTransformFactory);
        SafeRelease(lpDD);
    }
    };只实现了几个效果,你看看DX的文档资料,里面有说明