|
我高兴的太早了,画出来的窗口是我的建立window时用的白画刷,白色的,可在初始化的时候应该是蓝色的.要说是我的显卡不支持那为什么书上的代码可以编译啊,我的代码是全复制过去的啊.我的显卡是GF2,最新的驱动,98和2000sp2双系统.要看代码在下面:
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
LPDIRECT3D9 g_pD3D=NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
HRESULT InitD3D( HWND hWnd );
HRESULT InitVB();
VOID Cleanup();
VOID Render();
VOID GameLoop();
LRESULT WINAPI MsgProc( HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam );
HRESULT InitD3D( HWND hWnd )
{
if( ( g_pD3D=Direct3DCreate9( D3D_SDK_VERSION ) )==NULL )
return E_FAIL;
D3DDISPLAYMODE d3ddm;
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT,
&d3ddm ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=d3ddm.Format;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
HRESULT InitVB()
{
CUSTOMVERTEX g_Vertices[]={ {150.0f,50.0f,0.5f,1.0f,0xffff0000,},
{250.0f,250.0f,0.5f,1.0f,0xff00ff00,},
{50.0f,250.0f,0.5f,0xff00ffff,},};
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL )))
return E_FAIL;
VOID *pVertices;
if( FAILED(g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices,
0)) )
return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
g_pVB->Unlock();
return S_OK;
}
VOID Cleanup()
{
if( g_pd3dDevice!=NULL )
g_pd3dDevice->Release();
if( g_pD3D!=NULL )
g_pD3D->Release();
}
VOID Render()
{
if( NULL==g_pd3dDevice )
return;
//D3DRECT rect={ 100, 100, 300, 300 };
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB( 0,0,255 ),1.0f,0 );
g_pd3dDevice->BeginScene();
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
g_pd3dDevice->EndScene();
g_pd3dDevice-> resent( NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
switch( msg )
{
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
case WM_CREATE:
break;
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
void GameLoop()
{
//Enter the game loop
MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage)
{
//Process message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//No message to process, so render the current scene
Render();
}
}
}
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR c_s,
INT c_show )
{
MSG msg;
WNDCLASS wndclass={ CS_HREDRAW, MsgProc, 0, 0, hInst, NULL,
NULL, (HBRUSH) GetStockObject( 0 ),
NULL, "Direct" };
RegisterClass( &wndclass );
HWND hWnd=CreateWindow( "Direct", "direct001",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 300,300, NULL, NULL,
wndclass.hInstance, NULL );
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
}
GameLoop();
UnregisterClass( "Direct", wndclass.hInstance );
Cleanup();
return 0;
}
还有记得原来用OPGL要显示一个黑色的窗口,可是只是屏幕四周是黑的.中间却是桌面上的东西.唉,不明白啊?????? |
|