基于win32创建的direct3d程序
2012-11-03 19:53
106 查看
源代码:
#pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include <d3d9.h> #include <windows.h> LPDIRECT3D9 g_pD3D=NULL;//direct3d对象 LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//direct3d设备对象 LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer=NULL;//点表 struct CUSTOMVERTEX { FLOAT X,Y,Z,rhw; DWORD colour; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) HRESULT InitD3D(HWND hWnd) { //创建direct3d对象,该对象用来创建direct3d设备对象 if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; //设置d3dpresent_parameters结构,准备创建direct3d设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed=TRUE; d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat=D3DFMT_UNKNOWN; //创建direct3d设备对象 if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))) return E_FAIL; return S_OK; } HRESULT InitialiseVertexBuffer() { void *pVertices; CUSTOMVERTEX cvVertices[]= { {250.0f,100.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0), }, { 400.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0), }, { 100.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255), }, }; if(FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL))) return E_FAIL; if(FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(void**)&pVertices,0))) return E_FAIL; memcpy(pVertices,cvVertices,sizeof(cvVertices)); g_pVertexBuffer->Unlock(); return S_OK; } void Render() { if(g_pd3dDevice==NULL) return; g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0); //开始在后台缓冲区绘制图行 if (SUCCEEDED(g_pd3dDevice->BeginScene())) { //在此在后台缓冲区绘制图形 g_pd3dDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);//设置点的样式 g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1); //结束在后台缓冲区的渲染图形 g_pd3dDevice->EndScene(); } //将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present(NULL,NULL,NULL,NULL); } void CleanUp() { if (g_pVertexBuffer!=NULL) { g_pVertexBuffer->Release(); g_pVertexBuffer=NULL; } if (g_pd3dDevice!=NULL) { g_pd3dDevice->Release(); g_pd3dDevice=NULL; } if (g_pD3D!=NULL) { g_pD3D->Release(); g_pD3D=NULL; } } LRESULT WINAPI WinProc(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 WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR ,INT) { WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L, GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"ClassName",NULL}; RegisterClassEx(&wc); //创建窗口 HWND hWnd=CreateWindow("ClassName","第一个Directx程序",WS_OVERLAPPEDWINDOW,200,100,600,500, NULL,NULL,wc.hInstance,NULL); //初始化 if (SUCCEEDED(InitD3D(hWnd))) { ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd); if (SUCCEEDED(InitialiseVertexBuffer())) { MSG msg; ZeroMemory(&msg,sizeof(msg)); while (msg.message!=WM_QUIT) { if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else Render();//渲染图形 } } } UnregisterClass("ClassName",wc.hInstance); return 0; }
相关文章推荐
- Python基于win32ui模块创建弹出式菜单示例
- Python使用Windows API创建窗口示例【基于win32gui模块】
- Python创建普通菜单示例【基于win32ui模块】
- 基于Win32的VTK多窗口程序创建
- 基于SDK的Win32窗口创建
- 【OpenGL】VS2005下创建基于Win32项目的OpenGL窗口
- 创建基于 Win32 的应用程序 (C++)
- 用 C++ 创建简单的 Win32 服务程序
- 基于PHP创建Cookie数组的详解
- 基于Jquery的动态创建DOM元素的代码
- 创建基于模板的小部件(Widget)
- 基于PHP——简单的WSDL的创建(WSDL篇)
- 利用GDI+基于WIN32实现桌面雪花效果(二)
- 利用Win32的网络函数创建一个网络浏览器
- 用Win32 API创建不规则窗口
- 基于Linux的oracle数据库管理 part2( 数据库 准备,安装,创建 )
- 基于WinSvr2012共享文件夹的Hyper-V实时迁移之二文件服务器及迁移用虚拟机的创建
- 基于物化视图创建分区(分区的物化视图)
- phoneMe的编译过程,基于win32平台
- mysql-5.6.24-win32.zip 下载 安装 配置 创建数据库