注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

(面向对象版本)DirectX从文件中加载网格模型/从文件加载声音  

2012-03-21 11:02:14|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

经过N久的调试终于把以前的面向过程的一大堆在一起的代码给改成了一个一个子模块的代码,废话不多说直接上图:

(面向对象版本)DirectX从文件中加载网格模型/从文件加载声音 - 刘邓 - 刘邓
(面向对象版本)DirectX从文件中加载网格模型/从文件加载声音 - 刘邓 - 刘邓
 

 下面是具体的实现代码部分:

 

/*
HeaderFile.h
这个头文件包含DX程序需要的头文件包含操作,以及安全释放对象的宏定义
*/
#pragma once;
#include<d3d9.h>
#include<d3dx9.h>
#include<stdio.h>//标准输入输出头文件,wav文件的读取用到这里的函数
#include<dsound.h>//DirectX Sound头文件

//安全释放宏定义
#define SAFE_DELETE(p){if (p){delete(p);(p) = NULL;}}
#define SAFE_RELEASE(p){if(p){(p)->Release();(p)= NULL;}}

//WAV头文件结构
struct WAVE_HEADER
{
 char riff_sig[4];    //RIFF
 long waveform_chunk_size;//8
 char wave_sig[4]; //WAVE
 char format[4];//fmt(noyice space after)??
 long format_chunk_size;//16
 short format_tag;//WAVE_FORMAT_PCM
 short channels; //声道数
 long sample_rate;//采用频率
 long bytes_per_sec;//比特率KBps
 short block_align;//线性阻碍 block障碍物 alignment线性排列
 short bits_per_sample; //位/每秒
 char data_sig[4];
 long data_size; //音频数据大小
};


 

//CDirectX.h
//类声明部分
#pragma once;
#include"HeaderFile.h"


class CInitDirectX
{
 friend class CDirectX;
public:
  HRESULT InitDevice(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice);

  void InitModel(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice,
       DWORD& dwNumMtrls,LPD3DXMESH& pMeshTiny,
       D3DMATERIAL9**   pMaterials,LPDIRECT3DTEXTURE9** pTextures);

  void InitTransform(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice);

  void InitLight(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice);

  void InitSound(HWND hWnd,LPDIRECTSOUND8&  pDirectSound,
       LPDIRECTSOUNDBUFFER&  pPrimaryBuffer,
       LPDIRECTSOUNDBUFFER8& pSecondaryBuffer);

};
class CRenderDirectX
{
 friend class CDirectX;
public:

 void RenderControl(LPDIRECT3DDEVICE9 pd3dDevice,LPD3DXMESH  pMeshTiny,
         D3DMATERIAL9* pMaterials,LPDIRECT3DTEXTURE9* pTextures,
         DWORD dwNumMtrls);
 void SoundControl(LPDIRECTSOUNDBUFFER8 pSecondaryBuffer);
};
class CDirectX
{
 friend class CinitDirectX;
 friend class CRenderDirectX;
public:
 LPDIRECT3DDEVICE9 m_pd3dDevice ;//声明Direct3D设备接口
 LPD3DXMESH    m_pMeshTiny ; //声明网格对象
 D3DMATERIAL9*   m_pMaterials; //声明材质信息
 LPDIRECT3DTEXTURE9* m_pTextures ;//网格的纹理信息
 DWORD     m_dwNumMtrls  ; //材质的数目
 //以下实现部分为DirectSound8借口对象声明
 LPDIRECTSOUND8  m_pDirectSound ;//DirectSound Interface;
 LPDIRECTSOUNDBUFFER  m_pPrimaryBuffer ;//主缓冲借口
 LPDIRECTSOUNDBUFFER8 m_pSecondaryBuffer ;//辅助缓冲区借口

 CDirectX();
 CInitDirectX InitDirectX;  //初始化DX实例对象
 CRenderDirectX RenderDirectX;//渲染图形实例对象
 void Direct3DCleanup();     //清理D3D资源 
};
CDirectX::CDirectX()
{
 LPDIRECT3DDEVICE9 m_pd3dDevice = NULL;//声明Direct3D设备接口
 LPD3DXMESH    m_pMeshTiny  = NULL;//声明网格对象
 D3DMATERIAL9*   m_pMaterials = NULL;//声明材质信息
 LPDIRECT3DTEXTURE9* m_pTextures = NULL;//网格的纹理信息
 DWORD     m_dwNumMtrls = 0;  //材质的数目
 //以下实现部分为DirectSound8借口对象声明
 LPDIRECTSOUND8  m_pDirectSound = NULL;//DirectSound Interface;
 LPDIRECTSOUNDBUFFER  m_pPrimaryBuffer = NULL;//主缓冲借口
 LPDIRECTSOUNDBUFFER8 m_pSecondaryBuffer = NULL;//辅助缓冲区借口

}
void CDirectX::Direct3DCleanup()
{
  for (DWORD i=0;i<m_dwNumMtrls;i++)
 {
  SAFE_RELEASE(m_pTextures[i])
 }
 SAFE_DELETE(m_pTextures);
 SAFE_DELETE(m_pMaterials);
 SAFE_RELEASE(m_pMeshTiny);
 SAFE_RELEASE(m_pd3dDevice);
 SAFE_RELEASE(m_pDirectSound);
 SAFE_RELEASE(m_pPrimaryBuffer);
 SAFE_RELEASE(m_pSecondaryBuffer);

}


 

//CInitDirectXImplement.h
//从头文件名可以看出这是DirectX的初始化实现头文件
#pragma once;
#include"CDirectX.h"
#include"HeaderFile.h"
void CInitDirectX::InitSound(HWND hWnd,LPDIRECTSOUND8&  pDirectSound,
           LPDIRECTSOUNDBUFFER&  pPrimaryBuffer,
           LPDIRECTSOUNDBUFFER8& pSecondaryBuffer)
{
 //以下部分为DirectSound的初始化阶段
 //创建DirectSound8借口
 DirectSoundCreate8(NULL,&pDirectSound,NULL);
 pDirectSound->SetCooperativeLevel(hWnd,DSSCL_NORMAL);//设置协作级别 //读取音频数据
 WAVE_HEADER wave_header;
 ::ZeroMemory(&wave_header,sizeof(WAVE_HEADER));
 FILE* fp=fopen("live.wav","rb");
 fread((void*)&wave_header,1,sizeof(WAVE_HEADER),fp);
 
 //创建辅助音频缓存
 WAVEFORMATEX wave_format ;
 ZeroMemory(&wave_format,sizeof(WAVEFORMATEX));
 wave_format.wFormatTag = WAVE_FORMAT_PCM;
 wave_format.nChannels = wave_header.channels;
 wave_format.nSamplesPerSec = wave_header.sample_rate;
 wave_format.wBitsPerSample =  wave_header.bits_per_sample;
 wave_format.nBlockAlign = wave_format.wBitsPerSample/8*wave_format.nChannels;
 wave_format.nAvgBytesPerSec = wave_format.nSamplesPerSec*wave_format.nBlockAlign;

 DSBUFFERDESC ds_buf_desc;//用来描述创建的主缓存的格式
 ZeroMemory(&ds_buf_desc,sizeof(DSBUFFERDESC));
 ds_buf_desc.dwSize = sizeof(DSBUFFERDESC);//j结构大小
 ds_buf_desc.dwFlags = DSBCAPS_CTRLVOLUME;//控制标志
 ds_buf_desc.dwBufferBytes = wave_header.data_size;//缓冲区大小
 ds_buf_desc.lpwfxFormat = &wave_format;//WAVE音频格式

 pDirectSound->CreateSoundBuffer(&ds_buf_desc,&pPrimaryBuffer,NULL);
 pPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8,(void**)&pSecondaryBuffer);

 //在取得辅助缓冲区接口对象后,调用该对象的Lock方法对缓冲区加锁,并得到指向缓冲区的两个指针。
 //然后WAV音频数据读取到这两个指针所指向的存储空间中

 char *ptr1,*ptr2;
 DWORD size1,size2;

 fseek(fp,sizeof(WAVE_HEADER),SEEK_SET);
 pSecondaryBuffer->Lock(0,wave_header.data_size,
             (void**)&ptr1,&size1,(void**)&ptr2,&size2,0);
 if(ptr1)fread(ptr1,1,size1,fp);
 if(ptr2)fread(ptr2,1,size2,fp);
 pSecondaryBuffer->Unlock(ptr1,size1,ptr2,size2);
 fclose(fp);
}


void CInitDirectX::InitTransform(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice)
{
  //以下部分为取景变换矩阵
 D3DXMATRIX matView;
 D3DXVECTOR3 vEye(0.0f,0.0,-1000.0f);//设置观察距离为1000
 D3DXVECTOR3 vAt(0.0f,0.0f,0.0f);
 D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
 D3DXMatrixLookAtLH(&matView,&vEye,&vAt,&vUp);
 pd3dDevice->SetTransform(D3DTS_VIEW,&matView);

 //设置投影变换矩阵
 D3DXMATRIX matProj;
 D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4.0f,1.0f,1.0f,2000.0f);
 pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}

//设置光照
void CInitDirectX::InitLight(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice)
{
 //以下部分设置光照
 D3DLIGHT9 light;
 ::ZeroMemory(&light,sizeof(light));
 light.Type = D3DLIGHT_SPOT;//光源方式:点光源,聚光灯,平行光
 light.Ambient = D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);//镜面反射
 light.Diffuse = D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);//漫反射
 light.Specular = D3DXCOLOR(0.3f,0.3f,0.3f,1.0f);//环境光强度
 light.Position = D3DXVECTOR3(0.0f,300.0f,0.0f);//位置
 light.Attenuation0 = 1.0f;//下三个位衰减值
 light.Attenuation1 = 0.0f;
 light.Attenuation2 = 0.0f;
 light.Falloff     = 1.0f;//聚光灯的辐射系数
 light.Phi         =D3DX_PI/1.0f;//聚光灯内椎体大小
 light.Theta       =D3DX_PI/3.0f;//聚光灯外椎体大小
 light.Range = 3000.0f;//光照范围
 light.Direction = D3DXVECTOR3(0.0f,-1.0f,0.0f);//光照方向

 pd3dDevice->SetLight(0,&light);
 pd3dDevice->LightEnable(0,true);
 pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS,true);
 pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE,true);
}

//从文件读取模型和材质信息
//设置纹理过滤方式
void CInitDirectX::InitModel(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice,
           DWORD& dwNumMtrls,LPD3DXMESH& pMeshTiny,
           D3DMATERIAL9**   pMaterials,LPDIRECT3DTEXTURE9** pTextures
           )
{
  //以下部分为从X文件加载网格模型
 LPD3DXBUFFER pAdjBuffer = NULL;//网格模型缓冲区
 LPD3DXBUFFER pMtrlBuffer = NULL;//材质缓冲区
 D3DXLoadMeshFromX (L"tiny.x",D3DXMESH_MANAGED,pd3dDevice,&pAdjBuffer,&pMtrlBuffer,NULL
      ,&dwNumMtrls,&pMeshTiny);//从tiny.x创建网格
 //以下部分为读取材质和纹理数据
 D3DXMATERIAL *pMtrls = (D3DXMATERIAL *)pMtrlBuffer->GetBufferPointer();
 *pMaterials = new D3DMATERIAL9 [dwNumMtrls];
 *pTextures = new LPDIRECT3DTEXTURE9[dwNumMtrls];

 for (DWORD i = 0;i<dwNumMtrls;i++)
 {
  *pMaterials[i] = pMtrls[i].MatD3D;
  (*pMaterials[i]).Ambient = (*pMaterials[i]).Diffuse;
  (*pTextures)[i] = NULL;
  D3DXCreateTextureFromFileA(pd3dDevice,pMtrls[i].pTextureFilename,&(*pTextures)[i]);
 }
 pAdjBuffer->Release();
 pMtrlBuffer->Release();
 //下面设置纹理过滤方式  什么是纹理过滤?
 //纹理过滤是为了解决纹理贴图出现的失真情况二采取的一种逼近措施
 //包括:最近点采样D3DTEXF_POINT,线性纹理过滤_LINEAR
 //各向异性过滤_ANISORTROPIC,多级渐进过滤(硬件支持)以及他们的混合
 pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
 pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
 pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR);
}

//创建和初始化Direct3D设备
HRESULT CInitDirectX::InitDevice(HWND hWnd,LPDIRECT3DDEVICE9& pd3dDevice)
{
 //创建IDirect3D接口
 LPDIRECT3D9 pD3D = NULL;//IDirect interface
 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
 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;
 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,&pd3dDevice);//创建设备
 pD3D->Release();
 return S_OK;
}

 

//CRenderDirectXImplement.h
//从头文件名可以看出这是DirectX的渲染控制实现头文件
#pragma once;
#include"HeaderFile.h"
#include"CDirectX.h"

void CRenderDirectX::RenderControl(LPDIRECT3DDEVICE9 pd3dDevice,LPD3DXMESH  pMeshTiny,
               D3DMATERIAL9* pMaterials,LPDIRECT3DTEXTURE9* pTextures,
               DWORD dwNumMtrls
               )
{
 //以下内容设置世界变换
 D3DXMATRIX matWorld,Rx,Ry,Rz;
 D3DXMatrixIdentity(&matWorld);
 
 D3DXMatrixRotationY(&Ry,-D3DX_PI);  //此语句实现绕Y轴旋转D3DX_PI+::timeGetTime()/720.f
 D3DXMatrixRotationX(&Rx,-D3DX_PI/2.0f);//-D3DX_PI/2.0f
 //D3DXMatrixRotationZ(&Rz,-1.0f);
 matWorld = Rx*Ry*matWorld;
 pd3dDevice->SetTransform(D3DTS_WORLD ,&matWorld);

 //以下内容设置填充方式
 if(::GetAsyncKeyState('F')&0x8000f)   //线框填充状态
  pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
 if(::GetAsyncKeyState('S')&0x8000f)    //面填充状态
  pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
 
 //以下内容为绘制网格
 for(DWORD i=0;i<dwNumMtrls;i++)
 {
  pd3dDevice->SetMaterial(&pMaterials[i]);
  pd3dDevice->SetTexture(0,pTextures[i]);
  pMeshTiny ->DrawSubset(i);
 }
}

void CRenderDirectX::SoundControl(LPDIRECTSOUNDBUFFER8 pSecondaryBuffer)
{
 //以下内容设置声音的播放控制
 //左右键控制声道
 //上下键控制音量
 //空格键控制开始
 //X键控制关闭
 static long lPan = 0,lVolume = 0;
 if(::GetAsyncKeyState(VK_LEFT)&0x8000f)
 {
  lPan -= 10;pSecondaryBuffer->SetVolume(lVolume);
 }
 if(::GetAsyncKeyState(VK_RIGHT)&0x8000f)
 {
  lPan+=10;pSecondaryBuffer->SetPan(lPan);
 }
 if(::GetAsyncKeyState(VK_UP)&0x8000f)
 {
  lVolume += 10;pSecondaryBuffer->SetVolume(lVolume);
 }
 if(::GetAsyncKeyState(VK_DOWN)&0x8000f)
 {
  lVolume-=10;pSecondaryBuffer->SetVolume(lVolume);
 }
 if(::GetAsyncKeyState(VK_SPACE)&0x8000f)
 {
  pSecondaryBuffer->Play(0,0,DSBPLAY_LOOPING);
 }
 if(::GetAsyncKeyState('1')&0x8000f)
 {
  pSecondaryBuffer->Stop();
 }
}


//Main.cpp
//Win32程序窗口实现文件
//包括窗口绘制和消息处理部分
#include"CDirectX.h"
#include"CInitDirectXImplement.h"
#include"CRenderDirectXImplement.h"

CDirectX DirectX;

wchar_t *g_pClassName =L"HelloDirect3D";//窗口类名
wchar_t *g_pWindowName =L"Direct3D初始化";//窗口标题

//提前声明消息处理函数
LRESULT CALLBACK WinWNDPROC(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

//整个Win32程序入口WinMain函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
 //以下部分为初始化窗口类部分
 WNDCLASS wndclass;
 wndclass.cbClsExtra = 0;
 wndclass.cbWndExtra = 0;
 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景初始化
 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);//光标(Cursor)初始化
 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);//窗口小图标初始化
 wndclass.hInstance = hInstance ;//初始化窗口类句柄
 wndclass.lpfnWndProc = WinWNDPROC; //定义窗口类的消息处理函数
 wndclass.lpszClassName = g_pClassName;//窗口类名
 wndclass.lpszMenuName = NULL;//无菜单栏所以为空
 wndclass.style = CS_HREDRAW|CS_VREDRAW;//窗口样式
 
 //以下部分为注册窗口类
 
 if(!RegisterClass(&wndclass))
  return 0;
 
 //以下部分为创建窗口部分,直接调用CreatWindow函数即可
 
 HWND hWnd = CreateWindow(
  g_pClassName,   //窗口类名
  g_pWindowName,   //窗口标题
  WS_OVERLAPPEDWINDOW, //窗口样式
  CW_USEDEFAULT,   //窗口最初x位置
  CW_USEDEFAULT,   //窗口最初y位置
  CW_USEDEFAULT,   //窗口最初宽度
  CW_USEDEFAULT,   //窗口最初高度(以上均为默认值)
  NULL,     //窗口父句柄
  NULL,     //窗口菜单句柄
  wndclass.hInstance,    //应用程序实例句柄
  NULL     //创建窗口的参数
  ); 
 
 //初始化D3D
 DirectX.InitDirectX.InitDevice(hWnd,DirectX.m_pd3dDevice);
 DirectX.InitDirectX.InitModel(hWnd,DirectX.m_pd3dDevice,DirectX.m_dwNumMtrls,
            DirectX.m_pMeshTiny,&DirectX.m_pMaterials,&DirectX.m_pTextures);
 DirectX.InitDirectX.InitTransform(hWnd,DirectX.m_pd3dDevice);
 DirectX.InitDirectX.InitLight(hWnd,DirectX.m_pd3dDevice);
 DirectX.InitDirectX.InitSound(hWnd,DirectX.m_pDirectSound,DirectX.m_pPrimaryBuffer,
            DirectX.m_pSecondaryBuffer);

 
 //以下部分为显示,更新窗口部分
 ShowWindow(hWnd,nShowCmd);
 UpdateWindow(hWnd);
 
 //以下部分为消息处理函数,即消息循环
 
 MSG msg; //定义一个message消息实例
 ZeroMemory(&msg,sizeof(msg));//把第一个参数的开始地址以及它的长度的内存段用0来填充
 while (msg.message!=WM_QUIT) //取得消息
 {
  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
   TranslateMessage(&msg);  //翻译消息(把键盘消息传入值对照映射到虚拟表中)
   DispatchMessage(&msg);    //传递消息(把消息加入Windows队列或者直接加入程序队列中)
  }
  else
  {
   DirectX.m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
   DirectX.m_pd3dDevice->BeginScene(); //开始绘制
   DirectX.RenderDirectX.RenderControl(DirectX.m_pd3dDevice,DirectX.m_pMeshTiny,
                 DirectX.m_pMaterials,DirectX.m_pTextures,DirectX.m_dwNumMtrls);
   DirectX.RenderDirectX.SoundControl(DirectX.m_pSecondaryBuffer);
   DirectX.m_pd3dDevice->EndScene();
   DirectX.m_pd3dDevice->Present(NULL,NULL,NULL,NULL);
  }
 }
 
 UnregisterClass(L"HelloMsg",wndclass.hInstance);
 return 0;
}

//消息泵 消息处理中心
LRESULT CALLBACK WinWNDPROC(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)
 {
 case WM_PAINT:
   DirectX.m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
   DirectX.m_pd3dDevice->BeginScene(); //开始绘制
   DirectX.RenderDirectX.RenderControl(DirectX.m_pd3dDevice,DirectX.m_pMeshTiny,
                 DirectX.m_pMaterials,DirectX.m_pTextures,DirectX.m_dwNumMtrls);
   DirectX.RenderDirectX.SoundControl(DirectX.m_pSecondaryBuffer);
   DirectX.m_pd3dDevice->EndScene();
   DirectX.m_pd3dDevice->Present(NULL,NULL,NULL,NULL);
  ValidateRect(hWnd,NULL);//更新客户区的显示
  break;
 case WM_DESTROY:
  DirectX.Direct3DCleanup() ;//窗口销毁消息
  PostQuitMessage(0); //显示退出消息
  break;
 }
 return DefWindowProc(hWnd,message,wParam,lParam);
}

 

 



  评论这张
 
阅读(804)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018