格雅百科

vs2010学mfc教程 pdf_OgreMFC+VS2010+傻瓜级教程+win7-32位系统+windows xp系统

格雅百科

???? VS2010之MFC入门到精通教程。名字虽有点浮夸但照着文档敲一遍,是可以快速掌握MFC基本技巧,足以应对项目的简单需求。当年我刚入行还是小菜鸟的时候就是通过这个文档快速参与项目的!

文档链接地址(pdf版):http://www.gyballet.com/detail/yuanchunsi/9895176

文档连接地址(docx版):http://www.gyballet.com/detail/yuanchunsi/9895208

一、VS2010/MFC编程入门教程之目录?????? 第一部分:VS2010/MFC开发环境?????? VS2010/MFC编程入门之前言 ?????? VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)?????? 第二部分:VS2010/MFC应用程序框架?????? VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架) ?????? VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构) ?????? VS2010/MFC编程入门之四(MFC应用程序框架分析) ?????? VS2010/MFC编程入门之五(MFC消息映射机制概述)?????? 第三部分:对话框?????? VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性) ????? ?VS2010/MFC编程入门之七(对话框:为对话框添加控件) ???????VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量) ?????? VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数) ?????? VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序) ?????? VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程) ?????? VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示) ?????? VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍) ?????? VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示) ?????? VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示) ???????VS2010/MFC编程入门之十六(对话框:消息对话框) ?????? VS2010/MFC编程入门之十七(对话框:文件对话框) ?????? VS2010/MFC编程入门之十八(对话框:字体对话框) ?????? VS2010/MFC编程入门之十九(对话框:颜色对话框)?????? 第四部分:常用控件?????? VS2010/MFC编程入门之二十(常用控件:静态文本框) ?????? VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control) ?????? VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box) ?????? VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例) ?????? VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox) ?????? VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box) ?????? VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar) ?????? VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) ?????? VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上) ?????? VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下) ?????? VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上) ?????? VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下) ?????? VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上) ?????? VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)?????? 第五部分:菜单、工具栏与状态栏?????? VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解) ?????? VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用) ?????? VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类) ?????? VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用) ?????? VS2010/MFC编程入门之三十八(状态栏的使用详解)?????? 第六部分:文档、视图和框架?????? VS2010/MFC编程入门之三十九(文档、视图和框架:概述) ?????? VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系) ?????? VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)?????? 第七部分:MFC常用类?????? VS2010/MFC编程入门之四十二(MFC常用类:CString类) ?????? VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类) ?????? VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer) ?????? VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类) ?????? VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)?????? 第八部分:字体和文本输出?????? VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类) ?????? VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)?????? 第九部分:图形图像?????? VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数) ?????? VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen) ?????? VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)?????? 第十部分:Ribbon界面开发?????? VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架) ?????? VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件) ?????? VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

??? 在网上有很多有关Ogre嵌入MFC的文章,(我看了几乎所有的有关的文章,下载了几乎所有的所谓的源代码),不过总结起来其实都基本是一个版本的,不知道转载的人没有看懂,有没有亲自编译过,那些教程写的不是很清楚,或者那些就足够一个高手看懂了,但是对一个C++新手而言貌似有点深了,致使很多人照着做却出现很多错误,浪费了很多时间。为了让更多的人更快的学会如何将Ogre嵌入MFC框架之中,便写了这篇教程。废话不多说,直接上教程:

?????? 以下内容是结合网上找的例程进行整理的,主要参考下面链接中文章:但有少许改动以使本程序适合VS2010及Ogre1.8版本,

特别说明:以下文章所述内容可在Win7 -32位系统,XP系统,均可通过正常运行。

原文地址:http://www.gyballet.com/tulun/article/details/5486828

第一步:建立一个名为OgreMFC的单文档应用程序

点击确定后出现下面界面:

点击下一步:

然后按图上所标示部分进行选择,完成后点击下一步:

其实可以在上一步就点击完成,哈哈。我只是想说明后面都保持的默认值。出现的界面是下面这个样子的,

接下来就是打开头文件OgreMFCView.h粘入以下代码

// OgreMFCView.h : COgreMFCView 类的接口

//

#pragma once

//添加的代码

#include "ogre.h"

#include "OgreConfigFile.h"

using namespace Ogre;

class COgreMFCView : public CView

{

protected: // 仅从序列化创建

COgreMFCView();

DECLARE_DYNCREATE(COgreMFCView)

// 属性

public:

COgreMFCDoc* GetDocument() const;

// 操作

public:

// 重写

public:

virtual void OnDraw(CDC* pDC); // 重写以绘制该视图

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

void setupResources();//添加的代码

// 实现

public:

virtual ~COgreMFCView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// 生成的消息映射函数

protected:

DECLARE_MESSAGE_MAP()

public:

afx_msg BOOL OnEraseBkgnd(CDC* pDC);

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

private:

CPoint m_mouseLast;

Root* mRoot;

RenderWindow* mWindow;

SceneManager* mSceneMgr;

Camera* mCamera;//添加的代码

public:

afx_msg void OnMouseMove(UINT nFlags, CPoint point);

afx_msg void OnTimer(UINT_PTR nIDEvent);

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnDestroy();

};

#ifndef _DEBUG // OgreMFCView.cpp 中的调试版本

inline COgreMFCDoc* COgreMFCView::GetDocument() const

{ return reinterpret_cast(m_pDocument); }

#endif

?然后打开

OgreMFCView.cpp粘入以下代码:

// OgreMFCView.cpp : COgreMFCView 类的实现

//

#include "stdafx.h"

#include "OgreMFC.h"

#include "OgreMFCDoc.h"

#include "OgreMFCView.h"

#define OGRE_DEBUG_MEMORY_MANAGER 1

//#ifdef _DEBUG

//#define new DEBUG_NEW

//#endif

// COgreMFCView

IMPLEMENT_DYNCREATE(COgreMFCView, CView)

BEGIN_MESSAGE_MAP(COgreMFCView, CView)

// 标准打印命令

ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

ON_WM_ERASEBKGND()

ON_WM_LBUTTONDOWN()

ON_WM_MOUSEMOVE()

ON_WM_TIMER()

ON_WM_CREATE()

ON_WM_DESTROY()

END_MESSAGE_MAP()

// COgreMFCView 构造/析构

COgreMFCView::COgreMFCView()

{

// TODO: 在此处添加构造代码

mRoot = 0;

}

COgreMFCView::~COgreMFCView()

{

delete mRoot;

}

BOOL COgreMFCView::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: 在此处通过修改

// CREATESTRUCT cs 来修改窗口类或样式

return CView::PreCreateWindow(cs);

}

void COgreMFCView::setupResources()

{

// Load resource paths from config file

ConfigFile cf;

cf.load("resources.cfg");

// Go through all sections & settings in the file

ConfigFile::SectionIterator seci = cf.getSectionIterator();

String secName, typeName, archName;

while (seci.hasMoreElements())

{

secName = seci.peekNextKey();

ConfigFile::SettingsMultiMap *settings = seci.getNext();

ConfigFile::SettingsMultiMap::iterator i;

for (i = settings->begin(); i != settings->end(); ++i)

{

typeName = i->first;

archName = i->second;

ResourceGroupManager::getSingleton().addResourceLocation(

archName, typeName, secName);

}

}

}

// COgreMFCView 绘制

void COgreMFCView::OnDraw(CDC*/*pDC*/)

{

static bool once =true;

COgreMFCDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

if(once)

{

mRoot = new Root();

setupResources();

RenderSystemList rl = Root::getSingleton().getAvailableRenderers();

//D3D9RenderSystem

RenderSystem* rsys = NULL;

RenderSystemList::iterator it = rl.begin();

while( it != rl.end() )

{

if( -1 != ( *it )->getName().find("Direct3D9" ) )

{

rsys = (RenderSystem*)( *it );

break;

}

it++;

}

//mRoot->showConfigDialog();

rsys->initConfigOptions();

//rsys->setConfigOption("Colour Depth", "32" );

rsys->setConfigOption("Anti aliasing", "None" );

rsys->setConfigOption("Floating-point mode", "Fastest" );

rsys->setConfigOption( "Full Screen","No" );

rsys->setConfigOption("Rendering Device","NVIDIA GeForce FX 5700VE");

rsys->setConfigOption( "VSync","No" );

//rsys->setConfigOption( "Video Mode", "800 x 600 @ 32-bit colour" );

rsys->setConfigOption( "Video Mode","640 x 480" );

//rsys->setConfigOption( "Display Frequency", "60" );

// 起用

mRoot->setRenderSystem( rsys );

mRoot->initialise( false );

NameValuePairList miscParams;

unsigned int h = (unsigned int)this->GetSafeHwnd();

miscParams["externalWindowHandle"] = StringConverter::toString(h);

mWindow = NULL;

mWindow = mRoot->createRenderWindow( "View", 640, 480,false, &miscParams );

once = false;

mSceneMgr = mRoot->createSceneManager(ST_GENERIC, "ExampleSMInstance");

// Create the camera

mCamera = mSceneMgr->createCamera("PlayerCam");

// Position it at 500 in Z direction

mCamera->setPosition(Vector3(0,0,500));

// Look back along -Z

mCamera->lookAt(Vector3(0,0,-300));

mCamera->setNearClipDistance(5);

// Create one viewport, entire window

Viewport* vp = mWindow->addViewport(mCamera);

vp->setBackgroundColour(ColourValue(0,0,0));

// Alter the camera aspect ratio to match the viewport

mCamera->setAspectRatio(

Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

//createScene();

// Set ambient light

mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));

// Create a skydome

mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);

// Create a light

Light* l = mSceneMgr->createLight("MainLight");

// Accept default settings: point light, white diffuse, just set position

// NB I could attach the light to a SceneNode if I wanted it to move automatically with

// other objects, but I don't

l->setPosition(20,80,50);

Entity *ent;

// Define a floor plane mesh

Plane p;

p.normal = Vector3::UNIT_Y;

p.d = 200;

MeshManager::getSingleton().createPlane("FloorPlane",

ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,

p,2000,2000,1,1,true,1,5,5,Vector3::UNIT_Z);

// Create an entity (the floor)

ent = mSceneMgr->createEntity("floor","FloorPlane");

ent->setMaterialName("Examples/RustySteel");

mSceneMgr->getRootSceneNode()->attachObject(ent);

ent = mSceneMgr->createEntity("head","ogrehead.mesh");

// Attach to child of root node, better for culling (otherwise bounds are the combination of the 2)

mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

mWindow->update();

}

else

{

//mRoot->startRendering();

mWindow->update();

//drawScene();

}

}

// COgreMFCView 打印

BOOL COgreMFCView::OnPreparePrinting(CPrintInfo* pInfo)

{

// 默认准备

return DoPreparePrinting(pInfo);

}

void COgreMFCView::OnBeginPrinting(CDC*/*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: 添加额外的打印前进行的初始化过程

}

void COgreMFCView::OnEndPrinting(CDC*/*pDC*/, CPrintInfo* /*pInfo*/)

{

// TODO: 添加打印后进行的清除过程

}

// COgreMFCView 诊断

#ifdef _DEBUG

void COgreMFCView::AssertValid()const

{

CView::AssertValid();

}

void COgreMFCView::Dump(CDumpContext& dc)const

{

CView::Dump(dc);

}

COgreMFCDoc* COgreMFCView::GetDocument() const// 非调试版本是内联的

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COgreMFCDoc)));

return (COgreMFCDoc*)m_pDocument;

}

#endif //_DEBUG

// COgreMFCView 消息处理程序

BOOL COgreMFCView::OnEraseBkgnd(CDC* pDC)

{

// TODO: Add your message handler code here and/or call default

//return CView::OnEraseBkgnd(pDC);

return true;

}

void COgreMFCView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_mouseLast = point;

CView::OnLButtonDown(nFlags, point);

}

void COgreMFCView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(nFlags & MK_LBUTTON)

{

CPoint mouseDiff = point - m_mouseLast;

m_mouseLast = point;

mCamera->yaw(Degree(mouseDiff.x) * 0.2);

mCamera->pitch(Degree(mouseDiff.y) * 0.2);

}

CView::OnMouseMove(nFlags, point);

}

void COgreMFCView::OnTimer(UINT_PTR nIDEvent)

{

// TODO: Add your message handler code here and/or call default

Invalidate();

CView::OnTimer(nIDEvent);

}

int COgreMFCView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: Add your specialized creation code here

SetTimer(1, 30, NULL);

return 0;

}

void COgreMFCView::OnDestroy()

{

CView::OnDestroy();

// TODO: Add your message handler code here

KillTimer(1);

}

好了,现在代码部分已经好了,下面就要开始配置工程的属性了:

参照

http://www.gyballet.com/tikiwiki/tiki-index.php?page=Setting+Up+An+Application+-+Visual+Studio

进行配置,配置完成后;按F7编译一下试试:很不幸运我出了一个错误:

看看错误的说明:?8?IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds?

怎么办呢,改变一下吧就:项目属性打开——C\C++——代码生成——运行时库——多线程 DLL (/MD)

再编译一下:

郁闷至极又报错:错误?8?error C1083: 无法打开编译器生成的文件:“Debug\OgreMFCView.obj”: Permission denied?

怎么解决呢:网上有人说直接删除debug下所有文件重新编译一下,开始竟然还删除不掉,只能强力删除了,然后重新编译。

哈哈,编译成功后直接运行出现效果如下所示:

?

补充说明一点,其中我还在此过程中做了如下改动:

1、在项目属性页——C\C++——预处理器——预处理器定义——_AFXDLL。(添加的)

2、如果你在编译时出现了Assertain failed ,那么

看一下ogre.log 文件,发现是FileNotFind,问题解决了,只需要把62行的 cf.load("resources.cfg"); 改成cf.load("resources_d.cfg");即可(Debug下)

3、如果第二步不好使,那么请到你的

把OgreSDK_vc10_v1-8-0/bin/debug中的resources_d.cfg跟plugins_d.cfg文件重命名为resources.cfg和plugins.cfg

按道理来讲,应该不会再有编译错误了。

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~