游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2670|回复: 3

不能创建DIRECT3DDEVICE9,新手求助。

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-2-25 11:59:00 | 显示全部楼层 |阅读模式
本人刚刚开始学习DirectX,运行下面自己写的代码后弹出对话框:Can Not Create the DirectX3D Device!
但是我运行其他实例却能创建。不知道为何,求助。
以下代码:
//以下是 Game.h 文件。
#include <d3d9.h>
#include <windows.h>
class Game
{
public:
        Game();
        ~Game();

        bool InitInstance(HWND hWnd);
        bool Update();
        bool ShutDown();
private:
        LPDIRECT3D9                                m_pD3D;
        LPDIRECT3DDEVICE9                m_pD3DDevice;

};
Game::Game()
{
        m_pD3D                                = NULL;
        m_pD3DDevice                = NULL;

}
Game::~Game()
{
        if(m_pD3D) m_pD3D->Release();
        if(m_pD3DDevice) m_pD3DDevice->Release();
}


bool Game::InitInstance(HWND hWnd)
{

        D3DPRESENT_PARAMETERS PresentParams;

        m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
        if (!m_pD3D)
        {
                MessageBox (NULL, TEXT("Can Not Create m_pD3D"),TEXT("Error"), MB_ICONERROR);
                return 0;
        }
       
        ZeroMemory( &ampresentParams, sizeof(PresentParams) );

        PresentParams.BackBufferHeight                        = 480;
        PresentParams.BackBufferWidth                        = 640;
        PresentParams.SwapEffect                                = D3DSWAPEFFECT_DISCARD;
        PresentParams.Windowed                                        = true;
        PresentParams.BackBufferCount                        = 1;
        PresentParams.hDeviceWindow                                = hWnd;

        if(!(m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &PresentParams, &m_pD3DDevice)))
        {
                MessageBox (NULL, TEXT("Can Not Create the DirectX3D Device!"),TEXT("Error"), MB_ICONERROR);
                return 0;
        }
        return 0;


}


//以下是 Main.cpp 文件
#include "Game.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
Game m_game;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int iCmdShow)
{
       
        USHORT Width        = 640;
    USHORT Height       = 480;
        static TCHAR        szAppName[] = TEXT("DEMO");
        HWND                        hWnd;
        MSG                                msg;
        WNDCLASS                wndclass;
        wndclass.style                        = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc        = WndProc;
        wndclass.cbClsExtra                = 0;
        wndclass.cbWndExtra                = 0;
        wndclass.hbrBackground        = (HBRUSH) GetStockObject(WHITE_BRUSH);
        wndclass.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wndclass.hIcon                        = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hInstance                = hInstance;
        wndclass.lpszClassName        = szAppName;
        wndclass.lpszMenuName        = NULL;
       
        if (!RegisterClass (&wndclass))
        {
                MessageBox (NULL, TEXT("Can Not Register Windows Class."),szAppName, MB_ICONERROR);
                return 0;
        }

        hWnd= CreateWindow( szAppName,
                                                TEXT ("DEMO"),
                                                WS_OVERLAPPEDWINDOW,
                                                CW_USEDEFAULT,
                                                CW_USEDEFAULT,
                                                Width,
                                                Height,
                                                NULL,
                                                NULL,
                                                hInstance,
                                                NULL );
        m_game.InitInstance(hWnd);
       
        ShowWindow(hWnd, iCmdShow);
        while (1)
        {
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                        if (msg.message==WM_QUIT) break;
                        TranslateMessage( &msg );
                        DispatchMessage ( &msg );

                }
                else
                {
                        //
                }
        }
        return 0;
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam)
{
       
        switch(message)
        {
        case WM_CREATE:
                break;

        case WM_CLOSE:
                PostQuitMessage(0);
                break;

        case WM_DESTROY:
                PostQuitMessage(0);
                break;

        case WM_SIZE:
                break;

        default:
                return DefWindowProc( hWnd, message, wParam, lParam);
        }
        return 0;
}

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2010-2-26 18:27:00 | 显示全部楼层

Re:不能创建DIRECT3DDEVICE9,新手求助。

不是不能创建吧。你看一下CreateDevice()的返回值,如果成功的话返回的是D3D_OK。而D3D_OK的定义有
#define D3D_OK   S_OK
#define S_OK     ((HRESULT)0L)
如果你的函数运行成功,生成了D3D设备对象,那么返回D3D_OK时,你做了一个!D3D_OK的操作,那不就出现“Can Not Create the DirectX3D Device!”了吗。
建议你改为
HRESULT hr;
hr = m_pD3D->CreateDevice();
if ( FAILED(hr) )
{
……
}

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2010-2-26 18:34:00 | 显示全部楼层

Re:不能创建DIRECT3DDEVICE9,新手求助。

另外你用的是窗口模式,我发现你的窗口模式的大小和你在pp中设置的后备缓冲区的大小一样,这样不好。
因为在窗口模式下,实际的Client区域要比窗口要小,。这样你的后备缓冲区和实际Client区域大小对不上,你如果想做拣去操作的话会很麻烦。根据MSDN的说明
If Windowed is TRUE and either of these values is zero, the corresponding dimension of the client area of the hDeviceWindow (or the focus window, if hDeviceWindow is NULL) is taken.
建议你将pp中的后备缓冲区宽度或高度设为0。

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-3-1 15:46:00 | 显示全部楼层

Re:不能创建DIRECT3DDEVICE9,新手求助。

同意楼上的,用FALSE()或者SUCCESS()检查COM返回值比较合适。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 18:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表