PNG-File in OffscreenPlainSurface zeichnen



  • Hi,

    ich habe ein Problem, und zwar probiere ich gerade mit DirectX9 ein Screenshot-Programm zu basteln. Das klappt auch soweit ganz gut.

    void initD3D(HWND hWnd)
    {
        d3d = Direct3DCreate9(D3D_SDK_VERSION);
    	D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow = hWnd;
        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          hWnd,
                          D3DCREATE_HARDWARE_VERTEXPROCESSING,
                          &d3dpp,
                          &d3ddev);
    
    	d3ddev->GetDisplayMode( 0, &DisplayMode);
    	d3ddev->CreateOffscreenPlainSurface(DisplayMode.Width, DisplayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &SurfaceFrontBuffer, NULL );
    }
    
    void cleanD3D(void)
    {
        SurfaceFrontBuffer->Release( );
    	d3ddev->Release();
        d3d->Release();
    }
    
    void takeScreenShotDirect3D9(std::string strFileName)
    {
    	d3ddev->GetFrontBufferData(0, SurfaceFrontBuffer );
    	D3DXSaveSurfaceToFile(strFileName.c_str(), D3DXIFF_BMP, SurfaceFrontBuffer, NULL, NULL);
    }
    

    Bei der TakeScreenShotMethode möchte ich nun noch in das SurfaceFrontBuffer
    eine kleine png-Grafik mit reinzeichnen, bevor das ganze in die BMP-Datei geht. Aber ich bekomme das nicht hin.

    Meine erste Idee war es, einfach ein 2. OffscreenImage machen und dann mit
    D3DXLoadSurfaceFromFile eine PNG darein laden. Dann das ganze mit StretchRect
    dann einfach auf das Frontsurface kopieren.....aber das StretchRect schlägt hier fehl!

    d3ddev->CreateOffscreenPlainSurface( 32, 32, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &SurfaceCursor, NULL );
    	HRESULT result = D3DXLoadSurfaceFromFile(
    								SurfaceCursor, //destination surface
    								NULL, //destination palette
    								NULL, //destination rectangle
    								"cursor.bmp", //source filename
    								NULL, //source rectangle
    								D3DX_DEFAULT, //controls how image is filtered
    								0, //for transparency (0 for none)
    								NULL); //source image info (usually NULL)
    

    und

    RECT dest;
    dest.left   = 0;
    dest.top    = 0;
    dest.right  = 31;
    dest.bottom = 31;
    HRESULT result = d3ddev->StretchRect(SurfaceCursor,NULL,SurfaceFrontBuffer,&dest, D3DTEXF_NONE);
    

    ..ich hab keine Ahnung warum das nicht klappt, StretchRect gibt mir da kein D3D_OK zurück. Glaube man kann vielleicht nicht von offscreen to Offscreen?
    Ein andere Idee war dann, eine Surface über eine Textur zu holen und die dann mit StretchRect...

    RECT dest;
    	dest.left   = 0;
    	dest.top    = 0;
    	dest.right  = 31;
    	dest.bottom = 31;
    
    	LPDIRECT3DTEXTURE9 pTex;
    	LPDIRECT3DSURFACE9 pSourceSurface;
    
    	HRESULT  result = D3DXCreateTextureFromFile( d3ddev, "cursor.bmp", &pTex );
    
    	if (result != D3D_OK)
    	{
    		logString(std::string("ERROR"));
    	}
    	else
    	{
    		logString(std::string("GUT"));
    	}
    
    	result = pTex->GetSurfaceLevel(0,&pSourceSurface);
    
    	if (result != D3D_OK)
    	{
    		logString(std::string("ERROR"));
    	}
    	else
    	{
    		logString(std::string("GUT"));
    	}
    
    	result = d3ddev->StretchRect(pSourceSurface,NULL,SurfaceFrontBuffer,&dest, D3DTEXF_LINEAR);
    
    	if (result != D3D_OK)
    	{
    		logString(std::string("ERROR"));
    	}
    	else
    	{
    		logString(std::string("GUT"));
    	}
    
    	D3DXSaveSurfaceToFile(strFileName.c_str(), D3DXIFF_BMP, SurfaceFrontBuffer, NULL, NULL);
    

    wieder geht hier StretchRect nicht..muss ich da vielleicht irgendetwas locken oder so ? es wäre toll, wenn mir jemand da einen tipp geben könnte, wie ich denn
    da mein Surface noch manipulieren kann, wenn das überhaupt so geht....ich will nämlich zu dem Screenshot den Mauscursor mit reinspeichern....

    Vielen Dank und bitte habt Nachsicht...ich bin noch blutiger anfänger (aber kein Depp!) bei direct3D ...nur früher mal was mit directdraw gemacht...

    thnx and greetz
    Soul


Log in to reply