定义公用的函数方法 //d3dUtility.cpp ////////////////////////////////////////////////////////// // // File: d3dUtility.cpp // Author: hsg (c) All Rights Reserved // System: // 功能:提供通用函数 // ////////////////////////////////////////////////////////// #pragma once #include "d3dUtility.h" //实现方法d3d::InitD3D bool d3d::InitD3D(HINSTANCE hInstance,int width,int height,bool windowed,D3DDEVTYPE deviceType,IDirect3DDevice9** device) { //create the main application window. //创建一个主应用程序窗体 WNDCLASS wc; wc.style =CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc =(WNDPROC)d3d::WndProc; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hInstance =hInstance; wc.hIcon =LoadIcon(0,IDI_APPLICATION); wc.hCursor =LoadCursor(0,IDC_ARROW); wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName =0; wc.lpszClassName ="Direct3D9App"; if(!RegisterClass(&wc)) { ::MessageBox(0,"RegisterClass()-失败",0,0); return false; } //创建窗体 HWND hwnd=0; hwnd=::CreateWindow("Direct3D9App","Direct3D9App",WS_EX_TOPMOST,0,0,width,height,0 /*parent hwnd*/,0 /*menu*/,hInstance,0/*extra*/); if(!hwnd) { ::MessageBox(0,"CreateWindow()-失败",0,0); return false; } //显示窗体 ::ShowWindow(hwnd,SW_SHOW); ::UpdateWindow(hwnd); //初始化D3D Init D3D HRESULT hr=0; //第一步:创建一个IDirect3D9对象 IDirect3D9* d3d9=0; d3d9=Direct3DCreate9(D3D_SDK_VERSION); if(!d3d9) { ::MessageBox(0,"Direct3DCreate9()-失败",0,0); return false; } //第二步:检查硬件 vp D3DCAPS9 caps; d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,deviceType,&caps); int vp=0; if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;; } else { vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING; } //第三步:填充一个D3DPRESENT_PARAMETERS 结构 D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth =width; d3dpp.BackBufferHeight =height; d3dpp.BackBufferFormat =D3DFMT_A8R8G8B8; d3dpp.BackBufferCount =1; d3dpp.MultiSampleType =D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality =0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow =hwnd; d3dpp.Windowed =windowed; d3dpp.EnableAutoDepthStencil =true; d3dpp.AutoDepthStencilFormat =D3DFMT_D24S8; d3dpp.Flags =0; d3dpp.FullScreen_RefreshRateInHz =D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval =D3DPRESENT_INTERVAL_IMMEDIATE; //第四步:创建设备 device. hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,deviceType,hwnd,vp,&d3dpp,device); if(FAILED(hr)) { d3dpp.AutoDepthStencilFormat =D3DFMT_D16; hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,deviceType,hwnd,vp,&d3dpp,device); if(FAILED(hr)) { d3d9->Release(); ::MessageBox(0,"CreateDevice()-失败",0,0); return false; } } d3d9->Release(); //done with d3d9 object return true; } //实现进入消息循环 int d3d::EnterMsgLoop(bool (*ptr_display)(float timeDelta)) { MSG msg; ::ZeroMemory(&msg,sizeof(MSG)); static float lastTime=(float)timeGetTime(); while(msg.message !=WM_QUIT) { //不是退出系统消息 if(::PeekMessage(&msg,0,0,0,PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } else { float currTime=(float)timeGetTime(); float timeDelta=(currTime-lastTime)*0.001f; ptr_display(timeDelta); lastTime=currTime; } } return msg.wParam; } //WndProc 事件处理方法 LRESULT CALLBACK d3d::WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_DESTROY: //退出系统处理 ::PostQuitMessage(0); break; case WM_KEYDOWN: if(wParam==VK_ESCAPE) //ESC键 发出退出系统消息 ::DestroyWindow(hwnd); break; } return ::DefWindowProc(hwnd,msg,wParam,lParam); }