过程:
WinMain
- 窗口类 -> 注册窗口类
- 创建窗口 -> 显示和更新窗口
- 消息循环 -> 窗口过程
#include <Windows.h>
#define WINDOW_CLASS "UGPDX"
#define WINDOW_TITLE "Demo Window"
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(9);
return 0;
break;
case WM_KEYUP:
if(wParam == VK_ESCAPE) PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE prevInst,
LPTSTR cmdLine, int show )
{
//定义窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,
hInst,NULL,NULL,(HBRUSH)GetStockObject(WHITE_BRUSH),NULL,WINDOW_CLASS,NULL };
RegisterClassEx(&wc);
HWND hWnd = CreateWindow(WINDOW_CLASS,WINDOW_TITLE,WS_OVERLAPPEDWINDOW,
100,100,640,480,GetDesktopWindow(),NULL,hInst,NULL);
ShowWindow( hWnd,SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass(WINDOW_CLASS,hInst);
}
创建Direct3D窗口
- D3D对象 -> IDirect3D9
- D3D设备对象 -> IDirect3DDevice9
- Clear()
- BeginScene()
- EndScene()
- Present()//显示
#include <Windows.h> #include <d3d9.h> #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #define WINDOW_CLASS "UGPDX" #define WINDOW_TITLE "Demo Window" LPDIRECT3D9 gd3d = NULL; LPDIRECT3DDEVICE9 gd3ddevice = NULL; bool InitializeD3D(HWND hWnd); void RenderScene(); void Shutdown(); LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(9); return 0; break; case WM_KEYUP: if(wParam == VK_ESCAPE) PostQuitMessage(0); break; } return DefWindowProc(hWnd,msg,wParam,lParam); } int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE prevInst, LPTSTR cmdLine, int show ) { //定义窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0, hInst,NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL }; RegisterClassEx(&wc); HWND hWnd = CreateWindow(WINDOW_CLASS,WINDOW_TITLE,WS_OVERLAPPEDWINDOW, 100,100,640,480,GetDesktopWindow(),NULL,hInst,NULL); if(InitializeD3D(hWnd)) { ShowWindow( hWnd,SW_SHOWDEFAULT ); UpdateWindow( hWnd ); MSG msg; ZeroMemory(&msg,sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { //没有消息处理时,做其他工作(常用做游戏开发) RenderScene(); } } } Shutdown(); UnregisterClass(WINDOW_CLASS,hInst); } bool InitializeD3D(HWND hWnd) { D3DDISPLAYMODE displayMode; gd3d = Direct3DCreate9(D3D_SDK_VERSION); if(gd3d == NULL) return false; if(FAILED(gd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode))) { return false; } //创建D3D设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.BackBufferFormat = displayMode.Format; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; if(FAILED(gd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&gd3ddevice))) { return false; } return true; } void Shutdown() { if(gd3ddevice != NULL) gd3ddevice->Release(); if(gd3d != NULL) gd3d->Release(); } void RenderScene() { gd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0), 1.0f,0); gd3ddevice->BeginScene(); //输出显示3D图形 gd3ddevice->EndScene(); //显示 gd3ddevice->Present(NULL,NULL,NULL,NULL); }
D3D模版
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#define WINDOW_CLASS "UGPDX"
#define WINDOW_TITLE "Demo Window"
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();
LPDIRECT3D9 gd3d = NULL;
LPDIRECT3DDEVICE9 gd3ddevice = NULL;
D3DXMATRIX g_projection; //投影变换
D3DXMATRIX g_ViewMatrix; //视图变换
D3DXMATRIX g_WorldMatrix; //世界变换
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(9);
return 0;
break;
case WM_KEYUP:
if(wParam == VK_ESCAPE) PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE prevInst,
LPTSTR cmdLine, int show )
{
//定义窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,
hInst,NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL };
RegisterClassEx(&wc);
HWND hWnd = CreateWindow(WINDOW_CLASS,WINDOW_TITLE,WS_OVERLAPPEDWINDOW,
100,100,640,480,GetDesktopWindow(),NULL,hInst,NULL);
if(InitializeD3D(hWnd,false))//false表示不是全屏
{
ShowWindow( hWnd,SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{ //没有消息处理时,做其他工作(常用做游戏开发)
RenderScene();
}
}
}
Shutdown();
UnregisterClass(WINDOW_CLASS,hInst);
return 0;
}
bool InitializeD3D(HWND hWnd,bool fullscreen)
{
D3DDISPLAYMODE displayMode;
gd3d = Direct3DCreate9(D3D_SDK_VERSION);
if(gd3d == NULL) return false;
if(FAILED(gd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
{
return false;
}
//创建D3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
if(fullscreen)
{
d3dpp.Windowed = FALSE;
d3dpp.BackBufferWidth = WINDOW_WIDTH;
d3dpp.BackBufferHeight = WINDOW_HEIGHT;
}else
d3dpp.Windowed = TRUE;
d3dpp.BackBufferFormat = displayMode.Format;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
if(FAILED(gd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&gd3ddevice)))
{
return false;}
if(!InitializeObjects())
return false;
return true;
}
bool InitializeObjects()
{ //D3DXMatrixOrthoLH(&g_ortho,WINDOW_WIDTH,WINDOW_HEIGHT,0.1f,1000.0f),
D3DXMatrixPerspectiveFovLH(&g_projection,45.0f,WINDOW_WIDTH/WINDOW_HEIGHT,0.1f,100.0f),
gd3ddevice->SetTransform(D3DTS_PROJECTION,&g_projection);
gd3ddevice->SetRenderState(D3DRS_LIGHTING,FALSE);//光照
//gd3ddevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);//背面削影
D3DXVECTOR3 cameraPos(0.0f,0.0f,-1.0f);
D3DXVECTOR3 lookAtPos(0.0f,0.0f,0.0f);
D3DXVECTOR3 upDir(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&g_ViewMatrix, &cameraPos, &lookAtPos, &upDir);
return true;
}
void RenderScene()
{
gd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
gd3ddevice->BeginScene();
gd3ddevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix);
//输出显示3D图形
gd3ddevice->EndScene();
//显示
gd3ddevice->Present(NULL,NULL,NULL,NULL);
}
void Shutdown()
{
if(gd3ddevice != NULL) gd3ddevice->Release();
if(gd3d != NULL) gd3d->Release();
gd3ddevice = NULL;
gd3d = NULL;
}