转载请注明出处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. poj2082单调栈

    本来实在做后缀数组的题目的,不巧,碰到了pku3415这题,需要用到单调栈来维护,但是之前又没有学习过单调栈这方面的知识,于是水了几题....... 题意:给你一些连续的小矩形,高宽不定,求最大的矩形 ...

  2. EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

    EAGAIN.EWOULDBLOCK.EINTR与非阻塞 长连接 EWOULDBLOCK用于非阻塞模式,不需要重新读或者写 EINTR指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到 ...

  3. Android基础总结(六)Activity

    创建第二个Activity(掌握) 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <ac ...

  4. GitHub 上 57 款最流行的开源深度学习项目【转】

    GitHub 上 57 款最流行的开源深度学习项目[转] 2017-02-19 20:09 334人阅读 评论(0) 收藏 举报 分类: deeplearning(28) from: https:// ...

  5. thymeleaf教程

    本教程涵盖了常见的前端操作,比如,判断,循环,引入模板,常用函数(日期格式化,字符串操作)下拉,js和css中使用,基本可以应对一般场景. 怎么使用? 前端html页面标签中引入如下: <htm ...

  6. Canvas组件:画布,可以实现动画操作

    Canvas组件:画布,可以实现动画操作. TextArea:文本域. 在单行文本域中回车会激发ActionEvent. 用CheckBoxGroup实现单选框功能. Java中,单选框和复选框都是使 ...

  7. Thinkphp整合各个功能

    thinkphp整合Auth权限管理.支付宝.微信支付.阿里oss.友盟推送.融云即时通讯.云通讯短信.Email.Excel.PDF等等: 基于thinkphp扩展了大量的功能:而不改动thinkp ...

  8. when case group by 的用法集合

    1.用那个以前大家都熟悉的例子,要求是依旧下面的表格求每个大洲的人口总和 国家(countrcoungry) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法 ...

  9. identity_insert---实验性插入大批量数据和分页存储过程

    OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 1create database data_Test --创建数据库data_Test 2use da ...

  10. WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法

    WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法 在WPF的TextBox的LostFocus事件中直接使用Focus()方法会出现死循环的问题 正确的使用方式有2中方法: 方法一 ...