Direct3DCreate9( D3D_SDK_VERSION )的返回值为NULL!
Direct3DCreate9( D3D_SDK_VERSION )的返回值为NULL!,我的DirectX是9.0c,SDK是Microsoft DirectX SDK (April 2006),我刚学好DirectX,请各位好心人帮帮忙!
全部代码如下:编译能够通过,通过断点设置,发现Direct3DCreate9( D3D_SDK_VERSION )的返回值为NULL!,编译能通过,但是却无法显示出窗口。
/**-----------------------------------------------------------------------------
* \brief 创建设备
* 文件: CreateDevice.cpp
*
* 说明: 创建D3D设备, 学习清除画面的方法.
*
*
**-----------------------------------------------------------------------------
*/
/// 使用的Direct3D9的首部
#include <d3d9.h>
/**-----------------------------------------------------------------------------
* 全局参数
*------------------------------------------------------------------------------
*/
LPDIRECT3D9 g_pD3D = NULL; /// 创建D3D 设备的D3D对象参数
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; /// 渲染中使用的D3D设备
/**-----------------------------------------------------------------------------
* Direct3D初始化
*------------------------------------------------------------------------------
*/
HRESULT InitD3D( HWND hWnd )
{
/// 创建一个用来创建设备的D3D对象
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp; /// 创建设备的结构体
ZeroMemory( &d3dpp, sizeof(d3dpp) ); /// 必须调用ZeroMemory()函数将结构体清零.
d3dpp.Windowed = TRUE; /// 创建窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; /// 最有效的SWAP效果
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; /// 建立一个与当前显示模式相匹配的后置缓冲
/// 按照以下设置,创建设备.
/// 1. 使用缺省设置的显卡(大部分显卡都是一个).
/// 2. 创建HAL设备(使用HW加速装置).
/// 3. 顶点处理由支持所有显卡的SW创建(由HW创建性能更佳).
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
/// 处理设备状态信息时,从这里进行.
return S_OK;
}
/**-----------------------------------------------------------------------------
* 删除初始化对象.
*------------------------------------------------------------------------------
*/
VOID Cleanup()
{
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
}
/**-----------------------------------------------------------------------------
* 绘图.
*------------------------------------------------------------------------------
*/
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
/// 将后置缓冲清除,同时设置为蓝色(0,0,255).
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
/// 开始渲染
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
/// 实际渲染命令列
/// 结束渲染
g_pd3dDevice->EndScene();
}
/// 显示后置缓冲的画面!
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
/**-----------------------------------------------------------------------------
* 窗口过程
*------------------------------------------------------------------------------
*/
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 );
}
/**-----------------------------------------------------------------------------
* 本程序的起始地址
*------------------------------------------------------------------------------
*/
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
/// 注册窗口类
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, 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, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
/// Direct3D初始化
int j=SUCCEEDED( InitD3D( hWnd ) ) ;
if(j )
{
/// 显示窗口
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
/// 消息循环
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
/// 删除注册的类
UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}