准备条件:VS2005、Microsoft DirectX SDK (April 2007)
测试环境:Xp SP2、M440、GF7300go、1G DDR2 667
1、在VS2005中创建空项目,新建文件CreateDeviceMy.cpp代码如下:
// 包含Dx9的头文件
#include < d3d9.h >
#pragma warning( disable : 4996 ) // 除去警告
#include < strsafe.h >
#pragma warning( default : 4996 ) 
// -----------------------------------------------------------------------------
// 全局参数
// -----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // 创建 D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 我们使用的渲染设备
// -----------------------------------------------------------------------------
// 名称: InitD3D()
// 描述: 初始化 Direct3D
// -----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
... {
// 根据版本创建D3D对象
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
//设置参数
D3DPRESENT_PARAMETERS d3dpp; //参数对象,用于下面的设备创建
ZeroMemory( &d3dpp, sizeof(d3dpp) ); //用0来填充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;
} 
// -----------------------------------------------------------------------------
// 名称: Cleanup()
// 描述: 释放所有初始化对象
// -----------------------------------------------------------------------------
VOID Cleanup()
... {
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
} 



// -----------------------------------------------------------------------------
// 名称: Render()
// 描述: 绘制场景
// -----------------------------------------------------------------------------
VOID Render()
... {
if( NULL == g_pd3dDevice )
return;
//清除背景缓存并重新设置为蓝色
g_pd3dDevice->Clear( 0, // pRects中的矩形数,如果 pRects为NULL着该参数必须为0
NULL, //一个指向D3DRECT结构体的指针
D3DCLEAR_TARGET, //D3DCLEAR标志,现在为清空当前的渲染器
D3DCOLOR_XRGB(0,0,255), //颜色
1.0f, // depth buffer的新z值
0 //模板
);
// 开始渲染场景
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
...{
// 可以在这里渲染场景
// 结束渲染
g_pd3dDevice->EndScene();
}
// 清苦当前缓存中的数据
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
} 
// -----------------------------------------------------------------------------
// 名称: MsgProc()
// 描述: Windows窗体句柄
// -----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( 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 );
} 
// WinMain函数入口
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT)
... {
//直接初始化结构体
/**//*
GetModuleHandle 函数是返回一个模块在当前进程地址空间的HMODULE
如果函数参数值为NULL则返回一个虚拟当前句柄.
*/
WNDCLASSEX wc = ...{ sizeof(WNDCLASSEX), //指定了以字节为单位的结构的大小
CS_CLASSDC, //所有属于该类的窗口实例共享相同的DC
MsgProc, //是指向窗口过程的指针
0L, //…………
0L, //…………
GetModuleHandle(NULL), //是指向窗口过程实例的句柄
NULL, //指向窗口图标的句柄
NULL, //指向窗口光标的句柄
NULL, //背景刷
NULL, //菜单
"D3D Tutorial", //类名
NULL //指向小图标的句柄
};
//注册窗体类
RegisterClassEx( &wc );
//创建窗体
HWND hWnd = CreateWindow( "D3D Tutorial", //窗体的类名
"D3D Tutorial 01: CreateDevice", //标题
WS_OVERLAPPEDWINDOW, //窗体风格
100, //位置坐标x
100, //位置坐标y
300, //宽
300, //高
NULL, //父窗口
NULL, //菜单
wc.hInstance, //窗体类句柄,2000以上的系统无含义!
NULL //窗体结构参数
);
// Initialize Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
...{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// Enter the message loop
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
...{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}
2、环境设置如图:
包含文件设置
附加依赖
库文件
编译时会出现一个比较烦人的C4819的警告,这里我们也通过设置把它给去了。
运行之后可以看到下面的结果:
:)
最后该终结一下了,初始化设备流程如下:
1、g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ),创建D3D对象
2、D3D对象创建D3DPRESENT_PARAMETERS d3dpp,参数对象
3、通过g_pD3D->CreateDevice( )函数,返回一个设备对象g_pd3dDevice
整个程序的流程图如下:
终于写完了~~这个东西代码完全是Direct自己的教程~我不过将其运行了一下:)有什么不对的地方希望指证:)!
版权声明:本文为sagakiss原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。