首页 > 代码库 > MFC和Direct3D9一起使用

MFC和Direct3D9一起使用

 第一步:新建MFC单文档项目,向导如下: 

第二步:添加引用,在项目属性的VC++目录中修改Include和lib文件夹。

第三步:在stdafx.h文件Include部分的最后添加如下引用。

#include "d3d9.h"#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")

第四步:在视图类头文件中添加如下代码:

1     LPDIRECT3D9             g_pD3D     ; //Direct3D对象2     LPDIRECT3DDEVICE9       g_pd3dDevice; //Direct3D设备对象3     HRESULT InitD3D( HWND hWnd );4     VOID Render();

第五步:在实现文件中添加如下代码。

构造函数中添加:

1 g_pD3D       = NULL; //Direct3D对象2 g_pd3dDevice = NULL; //Direct3D设备对象

实现InitD3D(HWND hWnd):

 1 HRESULT CDirect3DFirstView:: InitD3D( HWND hWnd ) 2 { 3     //创建Direct3D对象, 该对象用来创建Direct3D设备对象 4     if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) 5         return E_FAIL; 6  7     //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象 8     D3DPRESENT_PARAMETERS d3dpp;  9     ZeroMemory( &d3dpp, sizeof(d3dpp) );10     d3dpp.Windowed = TRUE;11     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;12     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;13 14     //创建Direct3D设备对象15     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,16                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,17                                       &d3dpp, &g_pd3dDevice ) ) )18     {19         return E_FAIL;20     }21 22    return S_OK;23 }
View Code

实现Render():

 1 VOID CDirect3DFirstView:: Render() 2 { 3     //清空后台缓冲区 4     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 ); 5      6     //开始在后台缓冲区绘制图形 7     if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) 8     { 9         //在此在后台缓冲区绘制图形10     11         //结束在后台缓冲区渲染图形12         g_pd3dDevice->EndScene();13     }14 15     //将在后台缓冲区绘制的图形提交到前台缓冲区显示16     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );17 }
Render

OnDraw中的代码:

 1 void CDirect3DFirstView::OnDraw(CDC* /*pDC*/) 2 { 3     CDirect3DFirstDoc* pDoc = GetDocument(); 4     ASSERT_VALID(pDoc); 5     if (!pDoc) 6         return; 7     if    (g_pD3D==NULL) 8     { 9         if( SUCCEEDED( InitD3D( this->m_hWnd ) ) )10         { 11            Render();12         }13         else14         {15             AfxMessageBox(L"error");16         }17     }18     else19     {20         Render();21     }22     23     // TODO: 在此处为本机数据添加绘制代码24 }
OnDraw

 第六步:编译运行,结果如下: