Direct3DCreate9( D3D_SDK_VERSION )的返回值为NULL,无法显示窗口,怎么办?

psychickk 2006-11-29 06:37:09
我的操作系统是WindowsXP Sp2,DirectX的版本是DirectX9.0c,
我的DirectX SDK的版本是Microsoft DirectX SDK (April 2006)
开发工具是VC6.0

程序的运行结果本应该是一个蓝色的窗口,但是我的运行结果却总是见不到窗口的出现,(没有错误也没有警告)经过设置断点,发现程序中有一句程序:g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )的返回值g_pD3D=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;
}
...全文
437 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
psychickk 2006-12-02
  • 打赏
  • 举报
回复
运行dxdiag没有问题,后来我把d3d9.h中的#define D3D_SDK_VERSION 32改为#define D3D_SDK_VERSION 31,能显示蓝色的窗口了,但是我觉得修改头文件好像不好,有什么更好的办法吗?
上面的源文件是SDK上sample里的的一个程序.
  • 打赏
  • 举报
回复
既然能运行,链接是通过的

看看d3d runtime是否装好了,比如打开dxdiag能测试正确吗
lambochan 2006-11-29
  • 打赏
  • 举报
回复
link了d3d9.lib没?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧