转载请注明出处http://www.cnblogs.com/CAION/p/3192111.html

(程序运行时是和其他程序挺像 = =,但我保证这是原创的)

1.将D3D的初始化,渲染等等一些行为封装为图形(Graph)类

代码如下(这里使用绘制旋转的茶壶作为例子),头文件

#pragma once
#include <d3d9.h>
#include <d3dx9.h> class Graphi
{
public:
Graphi(void);
~Graphi(void); bool Initialize(int,int,HWND);
void Shutdown(); bool Setup();
bool Update();
bool Render();
private:
float GetDeltaTime();
private:
LPDIRECT3D9 m_pD3d; //Direct3D对象
LPDIRECT3DDEVICE9 m_pd3dDevice; //Direct3D设备对象
ID3DXMesh* m_Teapot; // private:
int m_Width,m_Height;
D3DXMATRIX m_world;
};

CPP文件

#include "StdAfx.h"
#include "Graphi.h"
#include "MMSystem.h" Graphi::Graphi(void)
{
m_pD3d = NULL; //Direct3D对象
m_pd3dDevice = NULL;
m_Teapot = NULL; //
m_Width = ;
m_Height = ;
} Graphi::~Graphi(void)
{
Shutdown();
} bool Graphi::Initialize(int Width,int Height,HWND hWnd)
{
//创建Direct3D对象, 该对象用来创建Direct3D设备对象
if( NULL == ( m_pD3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return false; //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //创建Direct3D设备对象
m_pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &m_pd3dDevice ) ; //
m_Width = Width;
m_Height = Height; return true;
} bool Graphi::Setup()
{
D3DXCreateTeapot(m_pd3dDevice,&m_Teapot,); D3DXVECTOR3 position(0.0f, 0.0f, -3.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &up);
m_pd3dDevice->SetTransform(D3DTS_VIEW, &V); D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f, // 90 - degree
(float)m_Width / (float)m_Height,
1.0f,
1000.0f);
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj); m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
return true;
} void Graphi::Shutdown()
{
//释放Direct3D设备对象
if( m_pd3dDevice != NULL)
m_pd3dDevice->Release(); //释放Direct3D对象
if( m_pD3d != NULL)
m_pD3d->Release(); //释放mesh对象
if( m_Teapot != NULL)
m_Teapot->Release();
} float Graphi::GetDeltaTime()
{
static float lastTime = (float)timeGetTime();
// Compute time now.
float currentTime = (float)timeGetTime();
// Compute the difference: time elapsed in seconds.
float deltaTime = (currentTime - lastTime) * 0.001f;
// Last time is now current time.
lastTime = currentTime; return deltaTime;
} bool Graphi::Render()
{ //清空后台缓冲区
m_pd3dDevice->Clear( , NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(, , ), 1.0f, ); m_pd3dDevice->BeginScene(); //在此在后台缓冲区绘制图形
m_Teapot->DrawSubset(); m_pd3dDevice->EndScene(); //将在后台缓冲区绘制的图形提交到前台缓冲区显示
m_pd3dDevice->Present( NULL, NULL, NULL, NULL ); return true;
} bool Graphi::Update()
{
D3DXMATRIX Ry;
static float y = 0.0f;
D3DXMatrixRotationY(&Ry, y);
m_world = Ry; float deltaTime = GetDeltaTime(); y += deltaTime;
if(y >= 6.28f)
y = 0.0f; m_pd3dDevice->SetTransform(D3DTS_WORLD, &m_world); return true;
}

2.在VS2010中新建MFC工程,选择基于对话框创建

3.为对话框添加一个Static控件,并把控件ID改成IDC_3DVIEW。添加控件变量m_3dview

4.重载WM_KICKIDLE消息。(关于WM_KICKIDLE消息了解更多,http://hi.baidu.com/cherven23/item/ac0d59f539a137793c198b00

5.完成回调函数WM_KICKIDLE的回调函数OnKickIdle()。

LRESULT CD3D_MFCDlg::OnKickIdle(WPARAM wParam,LPARAM lParam)
{
m_d3dGraphi->Update();
m_d3dGraphi->Render();
return ;
}

6.在初始化对话框的函数中,添加初始化D3D代码

BOOL CD3D_MFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
CRect rect;
GetWindowRect(&rect);
m_3dview.GetWindowRect( &rect ); //初始化图形代码
HWND hWnd;
hWnd = m_3dview.m_hWnd;
m_d3dGraphi = new Graphi();
m_d3dGraphi->Initialize(rect.Width(),rect.Height(),hWnd);
m_d3dGraphi->Setup(); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

7.编译运行

附:源代码下载http://download.csdn.net/detail/ok123zxx/5759675

使用MFC做D3D的框架的更多相关文章

  1. 用VC++MFC做文本编辑器(单文档模式)

    用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlna ...

  2. int不可为null引发的 MyBatis做持久层框架,返回值类型要为Integer问题

    MyBatis做持久层框架,返回值类型要为Integer MyBatis 做持久层时,之前没注意,有时候为了偷懒使用了int类型做为返回的类型,这样是不可取的,MyBatis做持久层框架,返回值类型要 ...

  3. 使用VC++编写QQ群发器,MFC做UI

    由于公司业务需要,QQ群发器经常被用来发送QQ广告,购买的QQ群发器不好用不说,而且是按机器收费的,有些功能还不能修改. 所以公司派我来开发一款自己的QQ群发器,我给群发器取名叫做飞速群发器,用来给软 ...

  4. 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’

    这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...

  5. MFC单文档框架分析及执行流程(转)

    原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...

  6. MFC项目依赖 BCG框架示例

    1.创建一个简单的MFC工程: 2.将BCG框架项目导入到新建的mfc解决方案中,例如将BCGCBPro\BCGCBPRO140.vcxproj添加到解决方案. 3.修改mfc项目属性,包含BCG框架 ...

  7. 关于MFC视图文档框架的理解-1

    一.单个文档和多个文档的区别: MFC分为对话框程序,单文档程序和多文档程序. 单个文档程序:一个主框架内仅允许打开一个视图,若要打开另一个,则当前的文档必须得关闭.单文档程序可以打开不同格式的文档. ...

  8. MFC中 SDI/MDI框架各部分指针获取方式

    VC MFC SDI/MDI框架各部分指针获取方式   整理总结一下,希望能帮助到别人.   获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument 获得CV ...

  9. ElasticSearch做实时OLAP框架~实时搜索、统计和OLAP需求,甚至可以作为NOSQL来使用(转)

    使用ElasticSearch作为大数据平台的实时OLAP框架 – lxw的大数据田地 http://lxw1234.com/archives/2015/12/588.htm 一直想找一个用于大数据平 ...

随机推荐

  1. spring-boot 集合mybatis 的分页查询

    spring-boot 集合mybatis 的github分页查询 一.依赖包 <!-- mysql 数据库驱动. --> <dependency> <groupId&g ...

  2. Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署

    Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署 系统版本:CentOS Linux release 7.4.1708 (Core) 最小化安装 内核版本:3.10.0-693. ...

  3. phpstrom直接运行和调试php

    最近想学服务器开发,但是没找到免费的虚拟主机,好在有一大把的php主机, 于是决定学php了,但并不准备学网页制作,只是把php作为服务器逻辑处理语言. 下载xampp,打开phpstrom的设置界面 ...

  4. PHP——自定义函数

    <?php //定义有默认值的函数 function Main3($f=5,$g=6) { echo $f*$g; } Main3(2,3); echo "<br />&q ...

  5. iPhone开发秘籍(第2版)--具体书签版

    http://download.csdn.net/download/fksec/4872499

  6. EntityFramework使用Code First模式创建数据库控制生成单数形式的表名

    使用Code-First模式生成数据库时,默认生成的数据库表的名称为类型的复数形式,例如实体类名称是"User",默认生成的数据库表名为“Users”,多数情况下我们并不想生成的数 ...

  7. ngx_lua模块学习示例之waf

    转自:http://www.tuicool.com/articles/FbQ3ymB WAF的主要功能为: ip黑白名单 url黑白名单 useragent黑白名单 referer黑白名单 常见web ...

  8. 修改多渠道打包的App名

    archiveNameFormat = '${flavorName}-${projectName}-${versionName}-${versionCode}'

  9. 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...

  10. svn & git 问题汇总

    svn: warning: W150002: '/Users/piercalex/svn/azzz/1' is already under version control svn: E200009: ...