|
#include<windows.h>
#include<d3dx9.h>
HWND hWnd;
HDC hDC;
HINSTANCE hInstance;
LPDIRECT3D9 p_D3D;
LPDIRECT3DDEVICE9 p_D3DDevice;
RECT rect;
int sw=640;
int sh=480;
bool fullscreen=1;
struct my_vertex
{
FLOAT x,y,z,rhw;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
/*my_vertex g_vertices[]=
{
{-1.0f,1.0f,0.0f,0xFFFFFFFF},
{-1.0f,-1.0f,0.0f,0xFFFFFFFF},
{1.0f,-1.0f,0.0f,0xFFFFFFFF},
{1.0f,1.0f,0.0f,0xFFFFFFFF}
};*/
my_vertex g_vertices[]=
{
{-1.0f,1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
{-1.0f,-1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
{1.0f,-1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
{1.0f,1.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,0,0)}
};
WORD g_Indices[]={0,1,2,0,2,3};
IDirect3DVertexBuffer9 *g_vb=NULL;
IDirect3DIndexBuffer9 *g_pb=NULL;
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
void D3DInit()
{
HRESULT hr;
unsigned char *vb_vertices;
WORD *p_index=0;
D3DXMATRIX view_matrix;
D3DXMATRIX matProj;
p_D3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
hr=p_D3DDevice->CreateVertexBuffer(4*sizeof(my_vertex),
D3DUSAGE_WRITEONLY,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_vb,0);
hr=p_D3DDevice->CreateIndexBuffer(6*sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&g_pb,0);
hr=g_vb->Lock(0,0,(void**)&vb_vertices,0);
memcpy(vb_vertices,g_vertices,sizeof(g_vertices));
g_vb->Unlock();
hr=g_pb->Lock(0,0,(void**)&p_index,0);
memcpy(p_index,g_Indices,sizeof(g_Indices));
g_pb->Unlock();
D3DXMatrixLookAtLH(&view_matrix,
&D3DXVECTOR3(0.0f,0.0f,-8.0f),
&D3DXVECTOR3(0.0f,0.0f,0.0f),
&D3DXVECTOR3(0.0f,1.0f,0.0f));
p_D3DDevice->SetTransform(D3DTS_VIEW,&view_matrix);
D3DXMatrixPerspectiveFovLH(&matProj,
D3DX_PI/4,
((float)sw/(float)sh),
1.0f,
100.0f);
p_D3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}
D3DFORMAT find_16bit_mode(void)
{
HRESULT hr;
hr=p_D3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_R5G6B5,D3DFMT_R5G6B5,FALSE);
if(SUCCEEDED(hr))
{
OutputDebugString("D3DFMT_R5G6B5\n");
return D3DFMT_R5G6B5;
}
hr=p_D3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X1R5G5B5,D3DFMT_X1R5G5B5,FALSE);
if(SUCCEEDED(hr))
{
OutputDebugString("D3DFMT_X1R5G5B5\n");
return D3DFMT_X1R5G5B5;
}
return (D3DFORMAT)NULL;
}
void D3DEnable()
{
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE display_mode;
p_D3D=Direct3DCreate9(D3D_SDK_VERSION);
hr=p_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&display_mode);
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.BackBufferCount=1;
if(fullscreen)
{
d3dpp.Windowed=FALSE;
d3dpp.BackBufferWidth=sw;
d3dpp.BackBufferHeight=sh;
d3dpp.BackBufferFormat=find_16bit_mode();
}
else
{
d3dpp.Windowed=TRUE;
d3dpp.BackBufferFormat=display_mode.Format;
}
hr=p_D3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&p_D3DDevice);
}
void D3DDisable()
{
if(p_D3DDevice)
{
p_D3DDevice->Release();
p_D3DDevice=NULL;
}
if(p_D3D)
{
p_D3D->Release();
p_D3D=NULL;
}
if(g_vb)
{
g_vb->Release();
g_vb=NULL;
}
if(g_pb)
{
g_pb->Release();
g_pb=NULL;
}
}
void D3DSceneShow()
{
D3DXMATRIX matWorld;
p_D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
if(SUCCEEDED(p_D3DDevice->BeginScene()))
{
//p_D3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
p_D3DDevice->SetStreamSource(0,g_vb,0,sizeof(my_vertex));
p_D3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
p_D3DDevice->SetIndices(g_pb);
p_D3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);
p_D3DDevice->EndScene();
}
p_D3DDevice-> resent(NULL,NULL,NULL,NULL);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
GetWindowRect(hWnd,&rect);
sw=rect.right-rect.left;
sh=rect.bottom-rect.top;
return 0;
case WM_SIZE:
return 0;
case WM_CLOSE:
ShowWindow(hWnd,SW_HIDE);
PostQuitMessage(0);
return 0;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd,WM_CLOSE,0,0);
break;
}
return 0;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wc;
MSG msg;
bool bQuit=false;
if(MessageBox(NULL,"是否选择全屏模式?","全屏方式运行?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=0;
}
wc.style=CS_OWNDC;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="Name";
RegisterClass(&wc);
if(fullscreen)
{
hWnd=CreateWindow("Name","Lesson2",WS_POPUP|WS_CLIPSIBLINGS|WS_VISIBLE,0,0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,NULL,
hInstance,
NULL);
}
else
{
hWnd=CreateWindow("Name","Lesson2",WS_TILEDWINDOW|WS_VISIBLE,
GetSystemMetrics(SM_CXSCREEN)/2-sw/2,
GetSystemMetrics(SM_CYSCREEN)/2-sh/2,
sw,sh,
NULL,NULL,
hInstance,
NULL);
ChangeDisplaySettings(NULL,0);
}
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
D3DEnable();
D3DInit();
if(!fullscreen)
{
GetWindowRect(hWnd,&rect);
sw=rect.right-rect.left;
sh=rect.bottom-rect.top;
}
while(!bQuit)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
if(msg.message==WM_QUIT)
bQuit=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
D3DSceneShow();
}
}
D3DDisable();
ShowWindow(hWnd,SW_HIDE);
DestroyWindow(hWnd);
ChangeDisplaySettings(NULL,0);
return msg.wParam;
return 0;
} |
|