游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5683|回复: 5

为什么老说 CreateDevice() 失败~~~~请教高手

[复制链接]

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2008-5-4 20:53:00 | 显示全部楼层 |阅读模式
#include"d3d9.h"

IDirect3DDevice9* device                                                                = 0;

LRESULT CALLBACK WndProc( HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam )
{
        switch( msg )
        {
        case WM_DESTROY:
                :ostQuitMessage( 0 );
                break;
        case WM_KEYDOWN:
                if( wparam == VK_ESCAPE )
                        :estroyWindow( hwnd );
                break;
        }
        return ::DefWindowProc( hwnd,msg,wparam,lparam );
}

bool InitD3D( HINSTANCE hinstance,
                         int width,int height,
                         bool windowed,
                         D3DDEVTYPE deviceType,
                         IDirect3DDevice9** device )
{
        WNDCLASS wc;
        wc.cbClsExtra                                                                                = 0;                       
        wc.cbWndExtra                                                                                = 0;
        wc.hbrBackground                                                                        = ( HBRUSH )GetStockObject( WHITE_BRUSH );
        wc.hCursor                                                                                        = LoadCursor( 0,IDC_ARROW );
        wc.hIcon                                                                                        = LoadIcon( 0,IDI_APPLICATION );
        wc.hInstance                                                                                = hinstance;
        wc.lpfnWndProc                                                                                = ( WNDPROC )WndProc;
        wc.lpszClassName                                                                        = L"Demo Window";
        wc.lpszMenuName                                                                                = 0;
        wc.style                                                                                        = CS_HREDRAW | CS_VREDRAW;

        if( !RegisterClass( &wc ) )
        {
                ::MessageBox( 0,L"RegisterClass() - FAILED",0,0 );
                return false;
        }

        HWND hwnd                                                                                        = 0;
        hwnd                                                                                                = ::CreateWindow( L"Demo_window",L"Demo_window",
                                                                                                                                                        WS_EX_TOPMOST,
                                                                                                                                                        0,0,width,height,
                                                                                                                                                        0,0,hinstance,0 );

        ::ShowWindow( hwnd,SW_SHOW );
        ::UpdateWindow( hwnd );

        HRESULT hr                                                                                        = 0;

        IDirect3D9* d3d9                                                                        = 0;

        d3d9                                                                                                = Direct3DCreate9( D3D_SDK_VERSION );

        if( !d3d9 )
        {
                ::MessageBox( 0,L"Direct3DCreate9() - FAILED",0,0 );
                return false;
        }

        D3DCAPS9 caps;
        d3d9->GetDeviceCaps( D3DADAPTER_DEFAULT,deviceType,&caps );

        int vp                                                                                                = 0;
        if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
                vp                                                                                                = D3DCREATE_HARDWARE_VERTEXPROCESSING;
        else
                vp                                                                                                = D3DCREATE_SOFTWARE_VERTEXPROCESSING;



        D3DPRESENT_PARAMETERS d3dpp;

        d3dpp.BackBufferWidth                                                                = width;
        d3dpp.BackBufferHeight                                                                = height;
        d3dpp.BackBufferFormat                                                                = D3DFMT_A8R8G8B8;
        d3dpp.BackBufferCount                                                                = 1;
        d3dpp.MultiSampleType                                                                = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality                                                        = 0;
        d3dpp.SwapEffect                                                                        = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow                                                                        = hwnd;
        d3dpp.Windowed                                                                                = windowed;
        d3dpp.EnableAutoDepthStencil                                                = true;
        d3dpp.AutoDepthStencilFormat                                                = D3DFMT_D24S8;
        d3dpp.Flags                                                                                        = 0;
        d3dpp.FullScreen_RefreshRateInHz                                        = D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval                                                        = D3DPRESENT_INTERVAL_IMMEDIATE;
       


        hr = d3d9->CreateDevice(
                D3DADAPTER_DEFAULT,
                deviceType,         
                hwnd,               
                vp,                 
            &d3dpp,            
            device);            

        if( FAILED(hr) )
        {
               
                d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
               
                hr = d3d9->CreateDevice(
                        D3DADAPTER_DEFAULT,
                        deviceType,
                        hwnd,
                        vp,
                        &d3dpp,
                        device);

                if( FAILED(hr) )
                {
                        d3d9->Release();
                        ::MessageBox(0, L"CreateDevice() - FAILED", 0, 0);
                        return false;
                }
        }
       

        d3d9->Release();
        return true;
}

bool Setup()
{
        return true;
}

void Cleanup()
{
}

bool Display( float timeDelta )
{
        if( device )
        {
                device->Clear( 0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0 );
                device-&gtresent( 0,0,0,0 );
        }
        return true;
}

int EnterMsgLoop( bool ( *display )( float timeDelta ) )
{
        MSG msg;
        ::ZeroMemory( &msg,sizeof( MSG ) );

        static float lastTime = ( float )timeGetTime();

        while( msg.message != WM_QUIT )
        {
                if( ::PeekMessage( &msg,0,0,0,PM_REMOVE ) )
                {
                        ::TranslateMessage( &msg );
                        ::DispatchMessage( &msg );
                }
                else
                {
                        float currTime = ( float )timeGetTime();
                        float timeDelta = ( currTime - lastTime )*0.001f;

                        display( timeDelta );
                        lastTime = currTime;
                }
        }
        return msg.wParam;
}

int WINAPI WinMain( HINSTANCE hinstance,
                                   HINSTANCE hprevInstance,
                                   LPSTR cmdline,
                                   int showCmd )
{
        if( !InitD3D( hinstance,640,480,true,D3DDEVTYPE_HAL,&device ) )
        {
                ::MessageBox( 0,L"InitD3D() - FAILED",0,0 );
                return false;
        }
        if( !Setup() )
        {
                ::MessageBox( 0,L"setup() - FAILED",0,0 );
                return false;
        }

        EnterMsgLoop( Display );
       
        Cleanup();

        device->Release();

        return 0;
}

0

主题

16

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2008-5-4 21:45:00 | 显示全部楼层

Re:为什么老说 CreateDevice() 失败~~~~请教高手

首先 : 有很多字符串前面有 L, 比如 wc.lpszClassName = L"Demo Window"; 我不知道是否是粘贴过来的原因,编译通不过, 我改成了  wc.lpszClassName = "Demo Window"; 。

老是失败的原因是 hwnd = ::CreateWindow( L"Demo_window",L"Demo_window", ...  使用的窗口类名称和你创建的窗口类名称 不一致。 改成 hwnd = ::CreateWindow( "Demo window","Demo_window",  这样就可以

2

主题

683

帖子

687

积分

高级会员

Rank: 4

积分
687
发表于 2008-5-5 16:55:00 | 显示全部楼层

Re:为什么老说 CreateDevice() 失败~~~~请教高手

他用的unicode

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2008-5-5 19:24:00 | 显示全部楼层

Re:为什么老说 CreateDevice() 失败~~~~请教高手

.....不关L的事~~~~~

0

主题

16

帖子

20

积分

注册会员

Rank: 2

积分
20
发表于 2008-5-5 22:29:00 | 显示全部楼层

Re:为什么老说 CreateDevice() 失败~~~~请教高手

你试试  hwnd = ::CreateWindow( L"Demo_window",L"Demo_window", ...  把里面的下划线去掉,这样和 wc.lpszClassName = L"Demo Window"; 中定义的就一致了。

我用的VC6, 运行没有问题。

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2008-5-6 01:17:00 | 显示全部楼层

Re:为什么老说 CreateDevice() 失败~~~~请教高手

谢谢高手指教!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 14:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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