The Programming world of Alex

Ogre多窗口显示在MFC下实现

项目中需要小地图效果自然想到了Ogre教程中的画中画显示,但是小地图把主窗口遮盖的比较严重。索性就再开个窗口单独作为小地图的显示吧
主要的思路就是在高度200处架设一个位置不变的Camera,用这个Camera显示出的效果作为小地图的输出
有图有真相,看图再继续


在说明实现方法之前,需要理清楚Ogre中的一些关系:Root,RenderWindow,SceneManager,Camera,ViewPort
第一,Root在程序中是唯一的,是万物之源
第二,RenderWindow和Root是一对多的关系,而RenderWindow和MFC中的View(或者是Win32中的窗口)是一对一的关系,这也是Ogre能多窗口显示的基础
第三,SceneManager和Root是一对多关系,但本例中关系不大,我只用了一个SM
第四,RenderWindow和ViewPort是一对多关系,但一个RenderWindow必须有一个主ViewPort。
第五,Viewport和Camera是一对一关系,
第六,SceneManager和Camera是一对多关系,但通常一个程序中只显示一个Camera的内容,除非你在一个RenderWindow中设置了多个ViewPort,每个ViewPort对应不同的Camera(教程中的画中画就是这么来的)
画个图把关系理清楚些吧
 
这个例子中我的设计思路是这样的:
创建两个RenderWindow,分别对应主窗口和小地图窗口,他们对应不同的ViewPort,而不同的ViewPort对应不同的Camera(主窗口就是原来的Camera,小地图窗口用的是新创建高度200的Camera)。
步骤大致如下:
1。用之前生成Curve窗口一样的方法创建一个可用的View类窗口
2。用与生成主窗口相同的方法来显示Ogre中的内容(SetupOgre。。。若干等等)
关键的是产生RenderWindow(用MinimapView窗口的句柄),SM采用getSceneManager获得主窗口的SM,再对Camera,ViewPort一一设置就行,总之就是对MFCView类照葫芦画瓢。

大功告成!

最后温习下Invalidate的知识:
Invalidate(TRUE);//擦除背景
Invalidate(FALSE);//不擦除背景
程序View类里的OnEraseBkgnd直接返回TRUE,并且定时器中用Invalidate(TRUE);就能避免窗口闪烁啦

posted @ 2009-03-02 18:19 Alex@VCC 阅读(5790) | 评论 (8)编辑 收藏

MFC调试时的一些常见链接错误

创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

各类项目的入口点:
main:控制台项目
WinMain:Win32 项目
DllMain:Win32 DLL 项目(如果与 CRT 库链接,则无须指定项目,因为它会添加一个默认的 DllMain)


下面介绍解决的方法:

1. Windows子系统设置错误, 提示:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

“C/C++”选项卡,将预处理器定义从 WIN32、_DEBUG、_CONSOLE 和 _MBCS 更改为 WIN32、_DEBUG 和 _WINDOWS

[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:console改成/subsystem:windows

2. Console子系统设置错误, 提示:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16

控制台项目要使用Console子系统, 而不是Windows, 设置:

“C/C++”选项卡,将预处理器定义从 WIN32、_DEBUG、_WINDOWS和 _MBCS 更改为 WIN32、_DEBUG 和 _CONSOLE
[Project] --> [Settings] --> 选择"Link"属性页,

在Project Options中将/subsystem:windows改成/subsystem:console

3. 程序入口设置错误, 提示:

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:

[Project] --> [Settings] --> 选择"C/C++"属性页,

在Category中选择Output,

再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 线程运行时库设置错误, 提示:

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

这是因为MFC要使用多线程时库, 需要更改设置:

[Project] --> [Settings] --> 选择"C/C++"属性页,

在Category中选择Code Generation,

再在Use run-time library中选择Debug Multithreaded或者multithreaded

其中,

Single-Threaded 单线程静态链接库(release版本)

Multithreaded 多线程静态链接库(release版本)

multithreaded DLL 多线程动态链接库(release版本)

Debug Single-Threaded 单线程静态链接库(debug版本)

Debug Multithreaded 多线程静态链接库(debug版本)

Debug Multithreaded DLL 多线程动态链接库(debug版本)

单线程: 不需要多线程调用时, 多用在DOS环境下

多线程: 可以并发运行

静态库: 直接将库与程序Link, 可以脱离MFC库运行

动态库: 需要相应的DLL动态库, 程序才能运行

release版本: 正式发布时使用

debug版本: 调试阶段使用

posted @ 2009-01-30 10:19 Alex@VCC 阅读(612) | 评论 (0)编辑 收藏

Ogre+MFC+Xtreme框架完成

之前已经做好了OgreMFC和XtremeMFC两个框架,今天花了点时间融合到一起,效果还不错,比较满意
虽然肯定有Bug,不过留着以后再改吧,呵呵
截图留念吧

posted @ 2009-01-06 21:08 Alex@VCC 阅读(2458) | 评论 (4)编辑 收藏

Xtreme实现Office2007风格SDI

今天终于实现了Office07风格的SDI,发图留念下

之前一直出现的运行错误是由于找不到对应资源文件引起的,在rc文件中加入#include "Styles\Office2007Blue\Office2007Blue.rc"就可以找到资源文件了。

另外实现了VS2005里面的ContextSticker

蛮实用的一个功能,代码也简单
 //显示ContextSticker
 m_paneManager.SetAlphaDockingContext(TRUE);
 m_paneManager.SetShowDockingContextStickers(TRUE);
 m_paneManager.SetDockingContextStickerStyle(xtpPaneStickerStyleVisualStudio2005);
 m_paneManager.SetShowContentsWhileDragging();

posted @ 2009-01-03 12:22 Alex@VCC 阅读(1623) | 评论 (1)编辑 收藏

CFormView注意

项目中要用Xtreme里的DockingPanel实现一些浮动窗口的效果,为了能实现控件自然想到了CDialog,不过把CDialog“填”到Panel里有些小问题,比如说按Esc后Dialog关闭,focus有问题等等。Xtreme中的示例中使用的是CFormView来完成这个功能,想必也是有些道理的,之前的那些问题都没有了。

但是我在自己的Demo程序中创建CFormView却出现了运行时错误。。。创建的代码直接用的Samples里动态创建的代码,应该是没错的,然后就网上找阿找。。。

终于在一哥们的Blog中找到答案了:
CFormView所使用的对话框资源的Style属性一定要设置为Child。试了下果然OK。这害人的属性阿,整整搞一天

想想也是,如果Style属性可以是PopUp的话还真见鬼了呢,以后遇到类似情况要多留个心眼才行

posted @ 2008-12-31 16:16 Alex@VCC 阅读(1497) | 评论 (0)编辑 收藏

Xtreme ToolkitPro 使用的一些注意

这几天刚接触Xtreme,最开始发现上手挺麻烦的,资料也不是很多,用了会之后发现其实还是满好用的,有UserGuide和实例代码之后,一些基本想要实现的效果就OK了

最开始从官网下载的12.1.0试用版安装之后Deployment安装有问题-_,-还好后来到csdn下载到了标准版,里面还有源码,之前的问题也没了。嘎嘎

第一个做的实例是Create an application with office style toolbar,按UserGuide基本就可以了,唯一注意的是把IDR_MIDSAMTYPE改为IDR_MAINFRAME,否则会报编译错。

我的项目里面使用Ogre作为渲染引擎,但是在已经有了的OgreMFC框架里面只要加上#include"XTToolkitPro.h"就报些奇怪的错误:

正在编译...
stdafx.cpp
d:\Program Files\Codejock Software\MFC\Xtreme ToolkitPro v12.0.0\Source\Common\XTPVC50Helpers.h(569) : error C2514: “LONG” : 类没有构造函数
        d:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinNT.h(259) : 参见“LONG”的声明
d:\Program Files\Codejock Software\MFC\Xtreme ToolkitPro v12.0.0\Source\Common\XTPVC50Helpers.h(569) : error C3861: “min”: 即使使用参数相关的查找,也未找到标识符
d:\Program Files\Codejock Software\MFC\Xtreme ToolkitPro v12.0.0\Source\Common\XTPVC50Helpers.h(569) : error C3861: “max”: 即使使用参数相关的查找,也未找到标识符
d:\Program Files\Codejock Software\MFC\Xtreme ToolkitPro v12.0.0\Source\Controls\XTMaskEdit.h(37) : fatal error C1903: 无法从以前的错误中恢复;正在停止编译

于是建个MFC的SDI框架慢慢尝试,只在stdafx.h中添加这两个头文件"XTToolkitPro.h","Ogre.h",但就是这样都会报错。
之后颠倒了两个头文件的顺序之后报堆栈大小限制。

倒是这个堆栈限制提醒了我,估计有可能是预编译头里的东西太多了,然后发生些奇怪的问题。索性就只在stdafx.h里包含"XTToolkitPro.h",而"Ogre.h"只在需要的头文件中包含(当然要用define宏来防止重复包含)。果然OK了!

之后着重看了DockingPanel的代码,按Guide的来也就差不多了,不过有个小问题就是icon图标。icon大小必须为16*16,有几个图标那么图标文件就是16n*16,不能多也不能少,否则运行期错误

Panel的用处很多,可以显示View,Dlg还有其他一些乱七八糟的控件。如果做View的话必须重新写一个CXXView类继承自CView类。这个工作量还是挺大的,不过小心点的话也没太多难度。

“时间紧,任务多,定计划,保完成”
牢记这四句话,寒假前顺利完成项目!

posted @ 2008-12-31 10:17 Alex@VCC 阅读(4826) | 评论 (2)编辑 收藏

仅列出标题
共2页: 1 2 
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(5)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜