游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2076|回复: 2

一个菜鸟请教问题,Directx窗口程序问题,不知道哪里出错

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-10-31 14:14:00 | 显示全部楼层 |阅读模式
#include<d3d9.h>
const TCHAR g_pClassName[]="HelloDirect3D";
const TCHAR g_pWindowName[]="Direct3D示例";
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//Direct3D接口设备
HRESULT InitDirect3D(HWND hWnd);//初始化Direct3D
VOID Direct3DRender();//渲染图形
VOID Direct3DCleanup();//清理Direct3D资源
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//窗口消息处理函数声明
//应用程序入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        /*初始化窗口类*/
        WNDCLASS wndclass;
        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.lpfnWndProc                        =(WNDPROC)WndProc;//消息处理函数
        wndclass.lpszClassName                        =g_pClassName;//窗口类名
        wndclass.lpszMenuName                        =NULL;
        wndclass.style                                        =CS_HREDRAW|CS_VREDRAW;//窗口样式
        /*注册窗口类*/
        if (!RegisterClass(&wndclass))
        {
                return 0;
        }
        /*创建窗口*/
        HWND hWnd=CreateWindow(
                g_pClassName,
                g_pWindowName,
                WS_OVERLAPPEDWINDOW,
                100,
                100,
                640,
                480,
                NULL,
                NULL,
                wndclass.hInstance,
                NULL);
        /*初始化Direct3D*/
        InitDirect3D(hWnd);
        /*显示窗口,更新窗口*/
        ShowWindow(hWnd,nCmdShow);
        UpdateWindow(hWnd);
        /*消息循环*/
        MSG msg;
        ZeroMemory(&msg,sizeof(msg));
        while(msg.message!=WM_QUIT)//取得消息
        {
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                        TranslateMessage(&msg);//转换消息
                        DispatchMessage(&msg);//投递消息
                }
                else
                {
                        Direct3DRender();//绘制3D场景
                }
        }
        UnregisterClass(g_pClassName,wndclass.hInstance);       
        return 0;
}
/*窗口处理函数*/
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
        case WM_PAINT://客户区重绘消息
                Direct3DRender();//渲染图形
                ValidateRect(hWnd,NULL);//更新客户区的显示
                break;
        case WM_DESTROY://窗口销毁消息
                Direct3DCleanup();//清理Direct3D
                PostQuitMessage(0);//退出程序
                break;
        }
        //默认消息处理
        return DefWindowProc(hWnd,message,wParam,lParam);
}
/*初始化Direct3D*/
HRESULT InitDirect3D(HWND hWnd)
{
        /*创建IDirect3D接口*/
        LPDIRECT3D9 pD3D=NULL;//IDirect3D接口
        pD3D=Direct3DCreate9(D3D_SDK_VERSION);//创建IDirect3D9接口对象
        if(pD3D==NULL)return E_FAIL;
        /*获取硬件设备信息*/
        D3DCAPS9 caps;
        int vp=0;
        pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
        if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
                vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
        else
                vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
        /*创建Direct3D接口设备*/
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.BackBufferWidth                        =640;
        d3dpp.BackBufferHeight                        =480;
        d3dpp.BackBufferFormat                        =D3DFMT_A8R8G8B8;
        d3dpp.BackBufferCount                        =1;
        d3dpp.MultiSampleType                        =D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality                =0;
        d3dpp.SwapEffect                                =D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow                                =hWnd;
        d3dpp.Windowed                                        =true;
        d3dpp.EnableAutoDepthStencil        =true;
        d3dpp.AutoDepthStencilFormat        =D3DFMT_D24S8;
        d3dpp.Flags                                                =0;
        d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval                =D3DPRESENT_INTERVAL_IMMEDIATE;

        pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,vp,&d3dpp,&g_pd3dDevice);
        pD3D->Release();//释放Direct3D接口
        return S_OK;
}
/*绘制3D场景*/
VOID Direct3DRender()
{
        g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
        g_pd3dDevice->BeginScene();//开始绘制
        /*图形实际绘制过程*/
        g_pd3dDevice->EndScene();//结束绘制
        g_pd3dDevice-&gtresent(NULL,NULL,NULL,NULL);//翻转
}
/*清理Direct3D,并释放COM接口*/
VOID Direct3DCleanup()
{
        if(g_pd3dDevice!=NULL)
                g_pd3dDevice->Release();
        g_pd3dDevice=NULL;
}
以上是源代码,然后编译无误,运行出错:

求哪位编译一下指出问题,大神们快来啊

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2011-10-31 19:22:00 | 显示全部楼层

Re:一个菜鸟请教问题,Directx窗口程序问题,不知道哪里

加上:
#pragma comment(lib, "d3d9.lib")

4

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-12-27 09:54:00 | 显示全部楼层

Re:一个菜鸟请教问题,Directx窗口程序问题,不知道哪里

D3D设备都没有创建成功啊...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 12:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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