DirectX 3D图形与动画程序设计第104-108页异常

DirectX 3D图形与动画程序设计第104-108页错误
那段代码无法正确执行,还有一个全局变量定义后一直没用
程序执行后无法实现书中的效果!~
D3DRECT g_ClentRect;这个变量一直未使用 ,全部代码如下
C/C++ code

#include<d3dx9.h>
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

LPDIRECT3D9            g_pD3D            =NULL;
LPDIRECT3DDEVICE9    g_pd3dDevice    =NULL;
LPDIRECT3DVERTEXBUFFER9        g_pVB    =NULL;
HWND                g_Wnd            =NULL;
D3DRECT                g_ClentRect;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ)|(D3DFVF_DIFFUSE)//书上的代码不正确,编译不过,

//--------------------------------------
// Desc:顶点结构
//--------------------------------------
struct CUSTOMVERTEX
{
    D3DXVECTOR3 position;
    DWORD color;
};



//--------------------------------------
// Desc:设置世界矩阵
//--------------------------------------
VOID SetupWorldMatrice(){
    //建立一个绕X轴动态旋转的世界矩阵
    D3DXMATRIX matWorld;
    UINT iTime = timeGetTime() % 1000;
    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    D3DXMatrixIdentity(&matWorld);
    D3DXMatrixRotationX(&matWorld,fAngle);

    //设置世界矩阵
    g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
}




//--------------------------------------
// Desc:设置观察矩阵和投影矩阵
//--------------------------------------
VOID SetupViewandProjMatrices()
{
    //建立并设置观察矩阵
    D3DXVECTOR3 vEyePt(0.0f,3.0f,-5.0f);
    D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f);
    D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
    g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);

    //建立并设置投影矩阵
    D3DXMATRIX matProj;
    D3DXMatrixPerspectiveFovLH(&matView,D3DX_PI/4,1.0f,1.0f,100.0f);
    g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}



//--------------------------------------
// Desc:设置视区
//--------------------------------------
VOID SetupViewPort()
{
    RECT rect;
    GetClientRect(g_Wnd,&rect);
    D3DVIEWPORT9 vp;
    vp.X        =0;
    vp.Y        =0;
    vp.Width    =rect.right;
    vp.Height    =rect.bottom;
    vp.MinZ        =0.0f;
    vp.MaxZ        =1.0f;
    g_pd3dDevice->SetViewport(&vp);
}



//--------------------------------------
// Desc:初始化Direct3D
//--------------------------------------
HRESULT InitD3D(HWND hWnd){
    if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp,sizeof(d3dpp));
    d3dpp.Windowed=TRUE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,//D3DDEVTYPE_HAL创建失败!硬件不支持!
                                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                    &d3dpp,&g_pd3dDevice)))
    {
        return E_FAIL;
    }
    
    //设置剔除模式为不剔除任何表面(正面和反面)
    g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);

    //关闭光照处理,默认情况下启用光照处理
    g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
    
    //设置观察和投影矩阵
    SetupViewandProjMatrices();
    
    //设置视区
    SetupViewPort();
    return S_OK;
}



//--------------------------------------
// Desc:创建场景图形
//--------------------------------------
HRESULT InitGeometry()
{
    //创建顶点缓冲区
    if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX),
                                                0,D3DFVF_CUSTOMVERTEX,
                                                D3DPOOL_DEFAULT,&g_pVB,NULL)))
    {
        return E_FAIL;
    }

    //填充顶点缓冲区
    CUSTOMVERTEX* pVertices;
    if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0)))
        return E_FAIL;
    for(DWORD i=0;i<50;i++)
    {
        FLOAT theta = (2*D3DX_PI * i)/(50-1);
        pVertices[2*i+0].position = D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta));
        pVertices[2*i+0].color= 0xffffff00;
        pVertices[2*i+1].position = D3DXVECTOR3(sinf(theta),1.0f,cosf(theta));
        pVertices[2*i+1].color=0xffffff00;
    }
    g_pVB->Unlock();
    return S_OK;
}


//--------------------------------------
// Desc:释放对象资源
//--------------------------------------
VOID Cleanup(){
    if(g_pVB != NULL)
        g_pVB->Release();
    if(g_pd3dDevice != NULL)
        g_pd3dDevice->Release();
    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()))
    {
        SetupWorldMatrice();

        //在后台缓冲区绘制图形
        g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
        g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2*50-2);
        //结束在后台缓冲区绘制图形
        g_pd3dDevice->EndScene();
    }
    g_pd3dDevice->Present(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_KEYDOWN:
        switch(wParam)
        {
        case VK_ESCAPE:
            Cleanup();
            PostQuitMessage(0);
            break;
        }
    }
    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"DxPro",NULL};
    RegisterClassEx(&wc);

    HWND hWnd = CreateWindow(L"DxPro",L"DxPro",
                            WS_OVERLAPPEDWINDOW,200,100,500,500,
                            GetDesktopWindow(),NULL,wc.hInstance,NULL);
    g_Wnd = hWnd;
    if(SUCCEEDED(InitD3D(hWnd)))
    {
        if(SUCCEEDED(InitGeometry()))
        {
            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;
}