转载请注明出处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. python内置函数之print()

    定义:将值打印到一个流对象,或者默认打印到sys.stdout. 语法: print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fal ...

  2. 每日英语:When Social Skills Are A Warning

    An uncle starts believing all your sarcastic comments. Or a kindhearted friend never understands any ...

  3. 1.3 Seven Testing Principles

    1.3 Seven Testing Principles 2015-06-23 Principle 1 - Testing shows presence of defects(测试显示存在缺陷) Te ...

  4. python判断一个对象是否可迭代

    如何判断一个对象是可迭代对象? 方法是通过collections模块的Iterable类型判断: >>> from collections import Iterable >& ...

  5. FreeRTOS——任务调度—抢占式,时间片和合作式

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 FreeRTOS 操作系统支持的任务调度方式:抢占式,时间片和合作式,这部分算是 Fr ...

  6. Jquery弹窗

    <title>弹窗</title> <script src="JS/jquery-1.7.2.js"></script> <s ...

  7. hdu6149 Valley Numer II 分组背包+状态压缩

    /** 题目:hdu6149 Valley Numer II 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意: 众所周知,度度熊非常喜欢图. ...

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

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

  9. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree

    E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...

  10. jQuery控制的不同方向的滑动(横向滑动等)

    引入jquery.js,复制以下代码,即可运行. <style type="text/css"> .slide { position: relative; height ...