www.pudn.com > D3DITEM01.rar > D3DInitfun.cpp


#include "D3DInitfun.h" 
#include "resource.h" 
 
#pragma comment(lib, "Winmm.lib") 
#pragma comment(lib, "d3d9.lib") 
 
D3DPRESENT_PARAMETERS g_d3dpp; 
 
 
bool d3d::InitD3D(HINSTANCE hInstance,int width, int height,bool windowed,D3DDEVTYPE deviceType,IDirect3DDevice9** device) 
{ 
	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(hInstance,MAKEINTRESOURCE(IDI_ICON1));  
	wc.hCursor       = LoadCursor(0, IDC_ARROW); 
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
	wc.lpszMenuName  = 0; 
	wc.lpszClassName = "D3DGAME"; 
 
	if( !RegisterClass(&wc))  
	{ 
		MessageBox(0, "Class register failed!", 0, 0); 
		return false; 
	} 
		 
	HWND hwnd = 0; 
	hwnd = CreateWindow("D3DGAME", "D3DGAME",WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,0, 0, width, height,0 , 0 , hInstance, 0);  
 
	if( !hwnd ) 
	{ 
		MessageBox(0, "Create Window failed!", 0, 0); 
		return false; 
	} 
 
	ShowWindow(hwnd, SW_SHOW); 
	UpdateWindow(hwnd); 
 
	// 初始D3D:  
	 
	HRESULT hr = 0; 
 
	// Step 1:创建D3D对象 
 
	IDirect3D9* d3d9 = 0; 
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION); 
 
    if( !d3d9 ) 
	{ 
		MessageBox(0, "D3D create failed!", 0, 0); 
		return false; 
	} 
 
	// Step 2:检测硬件是否能满足能力 
 
	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;	//以软件方式运行 
 
	// Step 3: 设置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; 
 
	// Step 4: 创建一个设备对象接口 
 
	hr = d3d9->CreateDevice( 
		D3DADAPTER_DEFAULT, //基础设备适配器硬件 
		deviceType,         //设备类型 
		hwnd,                
		vp,                 //处理方式 
	    &d3dpp,             //加栽参数 
	    device);            //得到一个d3d设备对象接口 
 
	if( FAILED(hr) ) 
	{ 
		//(上面的创建方式失败!)尝试以16位深度创建设备 
 
		d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 
		hr = d3d9->CreateDevice( 
			D3DADAPTER_DEFAULT,		//默认始配器 
			deviceType,				//设备类型 
			hwnd, 
			vp,						//处理方式 
			&d3dpp, 
			device);				//得到一个d3d设备对象接口 
 
		if( FAILED(hr))				//如果失败推出程序 
		{ 
			d3d9->Release();		//撤消一个对象 
			MessageBox(0, "Device create failed!", 0, 0); 
			return false; 
		} 
	} 
 
	d3d9->Release(); 
	 
	g_d3dpp=d3dpp; 
 
	return true; 
} 
 
int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) ) 
{ 
	MSG msg; 
	ZeroMemory(&msg, sizeof(MSG));		//把对象msg全部初始为0 
 
	static float lastTime = (float)timeGetTime(); //获得当前的内核对象时间 
 
	while(msg.message != WM_QUIT)		//D3D程序主循环 
	{ 
		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 0; 
}