|

楼主 |
发表于 2010-7-11 21:43:00
|
显示全部楼层
Re:怎么用c语言初始化d3d
#include <string.h>
#include <d3d9.h>
#include <strsafe.h>
#pragma comment(lib,"d3d9.lib")
HRESULT (*CreateDevice)(
LPDIRECT3D9 * ,
UINT ,
D3DDEVTYPE ,
HWND ,
DWORD ,
D3DPRESENT_PARAMETERS * ,
IDirect3DDevice9 **
);
void (*cdr)(LPDIRECT3D9 *);
void (*r)(LPDIRECT3DDEVICE9*);
HRESULT (*Clear)(
LPDIRECT3DDEVICE9*,
DWORD ,
CONST D3DRECT * ,
DWORD ,
D3DCOLOR ,
float ,
DWORD
);
HRESULT (*Present)(
LPDIRECT3DDEVICE9* ,
CONST RECT * ,
CONST RECT * ,
HWND,
CONST RGNDATA *
);
HRESULT (*BeginScene)(LPDIRECT3DDEVICE9*);
HRESULT (*EndScene)(LPDIRECT3DDEVICE9*);
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
void ini()
{
long l,ll;
memcpy(&l,&g_pD3D,4);
memcpy(&cdr,(long*)(l)+2,4);
memcpy(&CreateDevice,(long*)(l)+8,4);
memcpy(&ll,&g_pd3dDevice,4);
memcpy(&r,(long*)(ll)+2,4);
memcpy(& resent,(long*)(ll)+76,4);
memcpy(&BeginScene,(long*)(ll)+3,4);
memcpy(&EndScene,(long*)(ll)+28,4);
memcpy(&Clear,(long*)(ll)+5,4);
}
HRESULT InitD3D( HWND hWnd )
{
D3DPRESENT_PARAMETERS d3dpp;
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( CreateDevice(&g_pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
VOID Cleanup()
{
if( g_pd3dDevice != NULL )
r(&g_pd3dDevice);
if( g_pD3D != NULL )
cdr(&g_pD3D);
}
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
Clear(&g_pd3dDevice, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );
if( SUCCEEDED( BeginScene(&g_pd3dDevice) ) )
{
EndScene(&g_pd3dDevice);
}
Present(&g_pd3dDevice, NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_CLASSDC;
wc.lpfnWndProc=MsgProc;
wc.cbClsExtra=0L;
wc.cbWndExtra=0L;
wc.hInstance=GetModuleHandle(NULL);
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=NULL;
wc.lpszMenuName=NULL;
wc.lpszClassName=L"D3D Tutorial";
wc.hIconSm=NULL;
RegisterClassEx( &wc );
hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
NULL, NULL, wc.hInstance, NULL );
ini();
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
UnregisterClass( L"D3D Tutorial", wc.hInstance );
return 0;
}
还是有问题
虽然编译可以通过 , 但窗口没显示出来
我猜是CreateDevice这些成员函数 的偏移不对
也有可能是我的思路本来就错了
希望路过的高手指点迷津
|
|