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