Code:
HRESULT InitD3D(HWND hwnd)
{
g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if( g_pD3D == NULL ) {
MessageBox(NULL, "failure of Direct3DCreate9", "Error", MB_OK | MB_ICONEXCLAMATION);// TO DO: Respond to failure of Direct3DCreate8
return E_FAIL;
}
int nMode = 0;
D3DDISPLAYMODE d3ddm;
bool bDesiredAdaptorModeFound = false;
int nMaxAdaptorModes = g_pD3D->GetAdapterModeCount( D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8 );
for( nMode = 0; nMode < nMaxAdaptorModes; ++nMode ) {
if( FAILED( g_pD3D->EnumAdapterModes( D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, nMode, &d3ddm ) ) ) {
MessageBox(NULL, "Respond to failure of EnumAdapterModes", "Error", MB_OK | MB_ICONEXCLAMATION);
return E_FAIL;
}
if( d3ddm.Width != 640 || d3ddm.Height != 480 ) { continue; }// Does this adaptor mode support a mode of 640 x 480?
if( d3ddm.Format != D3DFMT_X8R8G8B8 ) { continue; }// Does this adaptor mode support a 32-bit RGB pixel format?
if( d3ddm.RefreshRate != 75 ) { continue; }// Does this adaptor mode support a refresh rate of 75 Hz?
bDesiredAdaptorModeFound = true; // We found a match...
break;
}
if( bDesiredAdaptorModeFound == false ) {
MessageBox(NULL, "lack of support for desired adaptor mode", "Error", MB_OK | MB_ICONEXCLAMATION);
return E_FAIL;
}
if( FAILED( g_pD3D->CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, FALSE ) ) ) {
MessageBox(NULL, "lack of support for a 32-bit back buffer", "Error", MB_OK | MB_ICONEXCLAMATION);
return E_FAIL;
}
if( FAILED( g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16 ) ) ) {
MessageBox(NULL, "lack of support for a 16-bit z-buffer", "Error", MB_OK | MB_ICONEXCLAMATION);
return E_FAIL;
}
D3DCAPS9 d3dCaps;
if( FAILED( g_pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps ) ) ) {
MessageBox(NULL, "Respond to failure of GetDeviceCaps", "Error", MB_OK | MB_ICONEXCLAMATION);
return E_FAIL;
}
DWORD dwBehaviorFlags = 0;
if( d3dCaps.VertexProcessingCaps != 0 ) {dwBehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING; }
else { dwBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING; }
D3DPRESENT_PARAMETERS d3dpp;
memset(&d3dpp, 0, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D32;
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;
d3dpp.BackBufferWidth = 1024;
d3dpp.BackBufferHeight = 768;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hwnd, dwBehaviorFlags, &d3dpp, &g_pd3dDevice ) ) ) {
MessageBox(NULL, "Respond to failure of CreateDevice", "Error", MB_OK | MB_ICONEXCLAMATION);
return E_FAIL;
}
return S_OK;
}
void Cleanup()
{
if( g_pd3dDevice != NULL ) g_pd3dDevice->Release();
if( g_pD3D != NULL ) g_pD3D->Release();
if( g_buffer!= NULL ) g_buffer->Release();
}
bool SaveScreenShot( char *fileName, _D3DXIMAGE_FILEFORMAT ImgFormat)
{
if( g_buffer!= NULL ) g_buffer->Release();
HRESULT hr;
if( FAILED( hr = g_pd3dDevice->CreateOffscreenPlainSurface(1024,768,D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_buffer, NULL ) ) ) {
MessageBox(NULL, "asd", "Error", MB_OK | MB_ICONEXCLAMATION);
return false;
}
if( FAILED( hr = g_pd3dDevice->GetFrontBufferData( 0, g_buffer ) ) ) {
MessageBox(NULL, "asd2", "Error", MB_OK | MB_ICONEXCLAMATION);
return false;
}
D3DXSaveSurfaceToFile( fileName, ImgFormat, g_buffer, NULL, NULL );
return true;
}