使用MFC做D3D的框架
转载请注明出处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的框架的更多相关文章
- 用VC++MFC做文本编辑器(单文档模式)
用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlna ...
- int不可为null引发的 MyBatis做持久层框架,返回值类型要为Integer问题
MyBatis做持久层框架,返回值类型要为Integer MyBatis 做持久层时,之前没注意,有时候为了偷懒使用了int类型做为返回的类型,这样是不可取的,MyBatis做持久层框架,返回值类型要 ...
- 使用VC++编写QQ群发器,MFC做UI
由于公司业务需要,QQ群发器经常被用来发送QQ广告,购买的QQ群发器不好用不说,而且是按机器收费的,有些功能还不能修改. 所以公司派我来开发一款自己的QQ群发器,我给群发器取名叫做飞速群发器,用来给软 ...
- 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’
这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...
- MFC单文档框架分析及执行流程(转)
原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...
- MFC项目依赖 BCG框架示例
1.创建一个简单的MFC工程: 2.将BCG框架项目导入到新建的mfc解决方案中,例如将BCGCBPro\BCGCBPRO140.vcxproj添加到解决方案. 3.修改mfc项目属性,包含BCG框架 ...
- 关于MFC视图文档框架的理解-1
一.单个文档和多个文档的区别: MFC分为对话框程序,单文档程序和多文档程序. 单个文档程序:一个主框架内仅允许打开一个视图,若要打开另一个,则当前的文档必须得关闭.单文档程序可以打开不同格式的文档. ...
- MFC中 SDI/MDI框架各部分指针获取方式
VC MFC SDI/MDI框架各部分指针获取方式 整理总结一下,希望能帮助到别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument 获得CV ...
- ElasticSearch做实时OLAP框架~实时搜索、统计和OLAP需求,甚至可以作为NOSQL来使用(转)
使用ElasticSearch作为大数据平台的实时OLAP框架 – lxw的大数据田地 http://lxw1234.com/archives/2015/12/588.htm 一直想找一个用于大数据平 ...
随机推荐
- JavaScript 高程三读书笔记;
1. 在使用 <script> 嵌入 JavaScript 代码时,记住不要在代码中的任何地方出现 "</script>" 字符串. 例如,浏览器在加载下面 ...
- C语言 · 数对
算法训练 数对 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数. 输入格式:输入只有一行, ...
- linux - camera capture
//cut a picture#include <stdio.h>#include <stdlib.h>#include <string.h>#include &l ...
- Btrace的使用方法
本文基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版> 写在前面: Btrace有很多用法,比如说性能监视,连接泄露,内存泄漏,多线程竞争,而本文说的只是最基本的应用打印调用 ...
- 新手入门贴:史上最全Web端即时通讯技术原理详解
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- 我的vim 自动实例括号函数
不废话,直接上代码: """"""""""""""" ...
- [android] android 获取网络连接信息
效果图: 工具类 /** * 获取网络连接信息 * * 根据NetworkInfo可以知道有很多的连接方式和信息 * * ① 当没有任何可用网络的时候,networkinfo为null 判断netw ...
- 解决阿里云部署 office web apps ApplicationFailedException 报错问题
查找这个问题,确实花费了很长时间,所以具体解析一下问题原因吧. 报错如下: 问题详情链接 New-OfficeWebAppsFarm:Office Online服务无法启动.有关详细信息,请参阅Win ...
- Could not contact Selenium Server; have you started it on 'localhost:4444'
今天学习selenium RC例子的时候遇到一个问题:java.lang.RuntimeException: Could not contact Selenium Server; have you s ...
- java深度搜索与广度优先搜索
图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class GraphNode { public List<GraphEdge> ...