#pragma comment(linker, "/subsystem:windows") #include <Windows.h> #include <stdio.h> LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { WNDCLASS wndclass; wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = MsgProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "L"; if ( !RegisterClass(&wndclass) ) { return -1; } HWND hwnd = CreateWindow( "L", "Direct3D 9", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); MSG msg; BOOL bRet; while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 ) { if ( -1 == bRet ) { return GetLastError(); } else { TranslateMessage(&msg); DispatchMessage(&msg); } } UnregisterClass(wndclass.lpszClassName, wndclass.hInstance); return msg.wParam; } bool OnCreate(HWND hWnd); void OnDestroy(); void OnPaint(); void OnUp(); void OnDown(); void OnLeft(); void OnRight(); LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: if ( false == OnCreate(hWnd) ) { SendMessage(hWnd, WM_CLOSE, NULL, NULL); } break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: OnDestroy(); PostQuitMessage(0); break; case WM_PAINT: OnPaint(); break; case WM_LBUTTONDOWN: break; case WM_RBUTTONDOWN: break; case WM_KEYDOWN: switch(wParam) { case VK_UP: OnUp(); break; case VK_DOWN: OnDown(); break; case VK_LEFT: OnLeft(); break; case VK_RIGHT: OnRight(); break; case VK_ESCAPE: SendMessage(hWnd, WM_CLOSE, NULL, NULL); break; } break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } #include <d3d9.h> #include <d3dx9math.h> #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #define SAFE_RELEASE(p) / if (p)/ {/ p->Release();/ p = NULL;/ } LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pD3D_Device = NULL; LPDIRECT3DVERTEXBUFFER9 g_pD3D_VB = NULL; LPDIRECT3DTEXTURE9 g_pD3D_Texture = NULL; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1) struct CUSTOMVERTEX { float x, y, z; // vertex coordinate float u, v; // texture coordinate }; HRESULT InitD3D(HWND hWnd) { g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3D_Device ); g_pD3D_Device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); g_pD3D_Device->SetRenderState( D3DRS_LIGHTING, FALSE ); g_pD3D_Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); g_pD3D_Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); return S_OK; } HRESULT CreateAndInitVB() { CUSTOMVERTEX rgVertices[] = { { -1.0f,-1.0f, 0.0f, 0.0f, 1.0f }, { -1.0f, 1.0f, 0.0f, 0.0f, 0.0f }, { 1.0f,-1.0f, 0.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 0.0f, 1.0f, 0.0f }, }; g_pD3D_Device->CreateVertexBuffer( sizeof(rgVertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pD3D_VB, NULL ); VOID* pVertices = NULL; if( FAILED(g_pD3D_VB->Lock(0, sizeof(rgVertices), (void**)&pVertices, 0)) ) { return E_FAIL; } else { memcpy(pVertices, rgVertices, sizeof(rgVertices)); g_pD3D_VB->Unlock(); return S_OK; } } VOID Render(); float g_fltZ = -5.0f; float g_fltAngle = 0.0f; void OnUp() { g_fltZ += 1.0f; Render(); } void OnDown() { g_fltZ -= 1.0f; Render(); } void OnLeft() { FLOAT f360Deg = (2.0f * D3DX_PI); g_fltAngle += (f360Deg/36); Render(); } void OnRight() { FLOAT f360Deg = (2.0f * D3DX_PI); g_fltAngle -= (f360Deg/36); Render(); } VOID Render() { if ( g_pD3D_Device ) { D3DXMATRIXA16 matWorld; D3DXMatrixRotationY( &matWorld, g_fltAngle ); D3DXVECTOR3 vEyePt( 0.0f, 0.0f, g_fltZ ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DXMATRIXA16 matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 50.0f ); g_pD3D_Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0); if ( SUCCEEDED( g_pD3D_Device->BeginScene() ) ) { D3DXCreateTextureFromFile(g_pD3D_Device, ".//test.jpg", &g_pD3D_Texture); if ( NULL != g_pD3D_Texture ) { g_pD3D_Device->SetTexture(0, g_pD3D_Texture); } g_pD3D_Device->SetTransform( D3DTS_WORLD, &matWorld ); g_pD3D_Device->SetTransform( D3DTS_VIEW, &matView ); g_pD3D_Device->SetTransform( D3DTS_PROJECTION, &matProj ); g_pD3D_Device->SetStreamSource(0, g_pD3D_VB, 0, sizeof(CUSTOMVERTEX)); g_pD3D_Device->SetFVF( D3DFVF_CUSTOMVERTEX ); g_pD3D_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); g_pD3D_Device->EndScene(); } g_pD3D_Device->Present(NULL, NULL, NULL, NULL); } } VOID Cleanup() { SAFE_RELEASE(g_pD3D_Texture); SAFE_RELEASE(g_pD3D_VB); SAFE_RELEASE(g_pD3D_Device); SAFE_RELEASE(g_pD3D); } bool OnCreate(HWND hWnd) { ::MoveWindow(hWnd, 0, 0, 600, 600, FALSE); if ( S_OK == InitD3D(hWnd) && S_OK == CreateAndInitVB() ) { return true; } return false; } void OnPaint() { Render(); } void OnDestroy() { Cleanup(); } 把代码复制下来,用VC6或VC.net直接就可以编译了,然后在编译出的可执行文件的同目录下放一张名为test.jpg的图片,就可以执行来看看效果了,按方向键会有远近以及翻转的效果。 心情小记:夏天就这样忽然的来临了……