|
|

楼主 |
发表于 2004-11-25 16:26:00
|
显示全部楼层
Re:?於IDirectDraw7能否?IDirect3D9在同一???窗?同?r使用
?臀铱纯丛?怎?改吧
IDirect3D9* m_pDirect3D9 = Direct3DCreate9(D3D_SDK_VERSION);
if ( !m_pDirect3D9 )
{
return false;
}
D3DCAPS9 caps;
D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;
bool windowed = true;
m_pDirect3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DFORMAT Format;
if (m_bIs565)
Format = D3DFMT_R5G6B5;
else
Format = D3DFMT_X1R5G5B5;
D3DPOOL Pool = D3DPOOL_SYSTEMMEM;
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = m_nDisplayWidth; //800
d3dpp.BackBufferHeight = m_nDisplayHeight; //600
d3dpp.BackBufferFormat = Format;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = m_hWnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
int hr = m_pDirect3D9->CreateDevice( D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
m_hWnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
&m_pDirect3DDevice9 // return created device
);
if ( FAILED(hr) )
{
// try again using a 16-bit depth buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = m_pDirect3D9->CreateDevice( D3DADAPTER_DEFAULT,
deviceType,
m_hWnd,
vp,
&d3dpp,
&m_pDirect3DDevice9
);
if( FAILED(hr) )
{
m_pDirect3D9->Release(); // done with d3d9 object
m_pDirect3D9 = NULL;
return false;
}
}
hr = m_pDirect3DDevice9->GetRenderTarget( 0,// DWORD RenderTargetIndex,
&m_pDirect3DSurface9
);
//IDirectDrawSurface7* m_pSurfaceSystem (由2D先建立1份, 避免3D建立失??r, ?2D都?不出??
if (m_pSurfaceSystem)
{
D3DLOCKED_RECT D3DLockedRect;
ZeroMemory(&D3DLockedRect, sizeof(D3DLOCKED_RECT));
RECT D3DRect;
D3DRect.left = 0;
D3DRect.top = 0;
D3DRect.right = m_nDisplayWidth -1;
D3DRect.bottom = m_nDisplayHeight -1;
DWORD dwD3DFlags = NULL;//D3DLOCK_DISCARD;
hr = m_pDirect3DSurface9->LockRect(&D3DLockedRect, &D3DRect, dwD3DFlags);
DDSURFACEDESC2 ddsd2;
ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2));
ddsd2.dwSize = sizeof(ddsd2);
ddsd2.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_LPSURFACE |
DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_CAPS;
ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
DDSCAPS_SYSTEMMEMORY;
ddsd2.dwWidth = m_nDisplayWidth;
ddsd2.dwHeight = m_nDisplayHeight;
ddsd2.lPitch = (LONG)D3DLockedRect.Pitch;
void* lpSurfaceData = D3DLockedRect.pBits;
ddsd2.lpSurface = lpSurfaceData;
ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
if (m_bIs565)
{
ddsd2.ddpfPixelFormat.dwFlags = DDPF_RGB;
ddsd2.ddpfPixelFormat.dwRGBBitCount = 16;
ddsd2.ddpfPixelFormat.dwRBitMask = 0x0000F800;
ddsd2.ddpfPixelFormat.dwGBitMask = 0x000007E0;
ddsd2.ddpfPixelFormat.dwBBitMask = 0x0000001F;
}
else
{
ddsd2.ddpfPixelFormat.dwFlags = DDPF_RGB;
ddsd2.ddpfPixelFormat.dwRGBBitCount = 16;
ddsd2.ddpfPixelFormat.dwRBitMask = 0x00007C00;
ddsd2.ddpfPixelFormat.dwGBitMask = 0x000003E0;
ddsd2.ddpfPixelFormat.dwBBitMask = 0x0000001F;
}
LPDIRECTDRAWSURFACE7 pIDirectSurface7 = NULL;
hr = m_pDDraw->CreateSurface(&ddsd2, &pIDirectSurface7, NULL);
if (hr != DD_OK)
{
return false;
}
m_pSurfaceSystem->Release();
m_pSurfaceSystem = pIDirectSurface7;
}
return true; |
|