游戏开发论坛

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

求助:IDirect3DSurface不能在窗口中输出图片(求原因或修改

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-3-17 21:21:00 | 显示全部楼层 |阅读模式
以下就是全部代码:

//=============================================================================
// Desc: 最简单的Direct3D程序,
//=============================================================================

#include <d3d9.h>
#include "d3dx9tex.h"

//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D       = NULL; //Direct3D对象
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //Direct3D设备对象
LPDIRECT3DSURFACE9 g_Surface = NULL;
LPDIRECT3DSURFACE9 BackBuffer = NULL;
D3DXIMAGE_INFO Info;

//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
        //创建Direct3D对象, 该对象用来创建Direct3D设备对象
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

        //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

        //创建Direct3D设备对象
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }
       
        D3DXGetImageInfoFromFile(L"F:\\tiger.jpg", &Info);
        g_pd3dDevice->CreateOffscreenPlainSurface(Info.Width, Info.Height, Info.Format, D3DPOOL_SYSTEMMEM,&g_Surface, NULL);
        D3DXLoadSurfaceFromFile(g_Surface, NULL, NULL, L"F:\\tiger.jpg", NULL, D3DX_FILTER_NONE, 0, NULL);


   return S_OK;
}


//-----------------------------------------------------------------------------
// Desc: 释放创建对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
        if(BackBuffer != NULL)
                BackBuffer->Release();
        if(g_Surface!= NULL)
                g_Surface->Release();
        //释放Direct3D设备对象
    if( g_pd3dDevice != NULL)
        g_pd3dDevice->Release();

        //释放Direct3D对象
    if( g_pD3D != NULL)
        g_pD3D->Release();
}


//-----------------------------------------------------------------------------
// Desc: 渲染图形
//-----------------------------------------------------------------------------
VOID Render()
{
    //清空后台缓冲区
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
   
    //开始在后台缓冲区绘制图形
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        //在此在后台缓冲区绘制图形
            g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
                g_pd3dDevice->UpdateSurface(g_Surface, NULL, BackBuffer, NULL);
        //结束在后台缓冲区渲染图形
        g_pd3dDevice->EndScene();
    }

    //将在后台缓冲区绘制的图形提交到前台缓冲区显示
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}


//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
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 );
}


//-----------------------------------------------------------------------------
// Desc: 程序入口
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    //注册窗口类
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"ClassName", NULL };
    RegisterClassEx( &wc );

    //创建窗口
    HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序",
                              WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
                              NULL, NULL, wc.hInstance, NULL );

    //初始化Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        //显示主窗口
                ShowWindow( hWnd, SW_SHOWDEFAULT );
                UpdateWindow( hWnd );

                //进入消息循环
                MSG msg;
                ZeroMemory( &msg, sizeof(msg) );
                while( msg.message!=WM_QUIT )
                {
                        if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                        {
                                TranslateMessage( &msg );
                                DispatchMessage( &msg );
                        }
                        else
                        {
                                Render();  //渲染图形
                        }
                }
    }

    UnregisterClass( L"ClassName", wc.hInstance );
    return 0;
}

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-3-17 22:16:00 | 显示全部楼层

Re:求助:IDirect3DSurface不能在窗口中输出图片(求原因或修

其实我只在一个基本窗口框架中加了以下的几行,但是什么运行时只有一个空窗口,急求不能输出图的原因谢谢了
LPDIRECT3DSURFACE9 g_Surface = NULL;
LPDIRECT3DSURFACE9 BackBuffer = NULL;
D3DXIMAGE_INFO Info;
D3DXGetImageInfoFromFile(L"F:\\tiger.jpg", &Info);
g_pd3dDevice->CreateOffscreenPlainSurface(Info.Width, Info.Height, Info.Format, D3DPOOL_SYSTEMMEM,&g_Surface, NULL);
D3DXLoadSurfaceFromFile(g_Surface, NULL, NULL, L"F:\\tiger.jpg", NULL, D3DX_FILTER_NONE, 0, NULL);
g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
g_pd3dDevice->UpdateSurface(g_Surface, NULL, BackBuffer, NULL);

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-3-17 22:26:00 | 显示全部楼层

Re:求助:IDirect3DSurface不能在窗口中输出图片(求原因或修

你这是当direct draw用啊,汗~~~~
D3D不是这么用的 [em10]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-3-18 01:11:00 | 显示全部楼层

Re:求助:IDirect3DSurface不能在窗口中输出图片(求原因或修

你是说D3D里面不能这样用IDirect3DSurface吗?那应该怎么样啊?我还以为可以好像texture和sprite差不多的呢所以就直接放进去了...因为正在看那本《DirectX 9 User Interfaces Design and Implementation》学UI....被这个问题困住了..又没有源代码,只能靠猜的了...假如知道的告诉一下小弟,代码还例子或教程都行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 02:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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