Direct3DCreate9( D3D_SDK_VERSION )的返回值为NULL!

psychickk 2006-11-28 05:40:30
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;
}



...全文
114 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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