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         else
14         {
15             AfxMessageBox(L"error");
16         }
17     }
18     else
19     {
20         Render();
21     }
22     
23     // TODO: 在此处为本机数据添加绘制代码
24 }
OnDraw

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

原文地址:https://www.cnblogs.com/yhlx125/p/3914617.html