Magic3D(MyGUI)简单使用

Magic3D的界面是基于MyGUI制作的,MyGUI的界面布局详细信息位于.layout文件中,.xml文件中是界面图标的详细信息。

1.添加按钮

添加按钮属于界面设计,应在.layout文件中添加相关信息,各个界面的.layout文件在Media文件夹下的子文件夹中。以点云界面布局(PointShopApp.layout)为例进行说明。添加按钮的方式有两种,一种是直接在相应的.layout文件中添加,另一种是通过 UI编辑器LayoutEditor添加。

1)直接在文件中添加

打开相应的.layout文件,在其中加入以下代码:

<Widget type="Button" skin="Button" position="15 405 60 60" align="Left Top" name="But_Clear"/>

type是加入的控件类型,Button是按钮控件类型,也有其他如ProgressBar进度条控件类型等;skin是对应控件上的皮肤,即图标名称,“Button”是MyGUI默认的按钮皮肤类型,也可定义自己的图标;position是添加控件的所在位置,前两个数字(15, 405)为控件在画布(界面)上的位置坐标,后两个数字(60, 60)为控件的大小;align为对齐方式,一般按钮的对齐方式均为Left Top;name为控件的名称。

注意:值得注意的是,在自定义图标时,skin,也就是图标名称,须在Magic.xml文件(皮肤信息文件)中声明,并和控件一一对应。

2)通过UI编辑器添加

上述界面为UI编辑器(LayoutEditor)的界面,通过file->load导入想要修改的界面,如下图所示。

上图就是导入PointShopApp.layout布局的界面,创建按钮大体需经过以下步骤:

  1. 在右侧Widgets选项卡中选择想要添加的控件类型;
  2. 然后在左侧的画布中选择位置画出控件即可;
  3. perties选项卡可以设置相关属性,如名称,位置、大小等。

这种方式添加按钮比较方便快捷,不必准确计算按钮的位置坐标,方法一则需要计算出控件的位置坐标。添加完控件之后,在相应的.layout文件中会自动生成相应的代码。

2.为按钮添加图标

1)直接在文件中添加

皮肤信息的文件在Media/MyGUIResource/MagicSkin.xml文件中,在文件中添加如下格式的信息:

<Resource type="ResourceSkin" name="But_Home" size="86 86" texture="MagicSkin.png"><BasisSkin type="SubSkin" offset="0 0 86 86" align="Stretch"><State name="disabled" offset="86 1 86 86"/><State name="normal" offset="86 88 86 86"/><State name="highlighted" offset="86 175 86 86"/><State name="pushed" offset="86 262 86 86"/></BasisSkin>
</Resource>

有以下注意点:

  1. 需要将所添加的图片放置在Magic.xml所在同一路径下,texture即为所要添加的图片;
  2. 或者将图片放在Magic.xml所在同一路径的文件夹(文件夹名字须为英文)中,在texture后表明图标所在位置,如"texture = “”./Image/MagicSkin.png";
  3. name为皮肤名称,在界面创建按钮时,自定义的图标会对应到这里。

按钮的皮肤属性,一般需要激活以上四个属性,分别为disable、normal、highlighted、pushed。在Magic3D中,是将所有图标集成在一张大图片上,通过索引每个小图标的在大图片上的位置坐标来添加图标。offset代表小图标在大图片上的偏移量,前两个元素是小图标的位置坐标,后两个数字是小图标的尺寸大小;normal,代表按钮在正常情况下显示的图标;highlighted,代表鼠标放置在该按钮上显示的图标;pushed,代表按钮被按下时显示的图标;disabled,尚未理解该属性的含义。以上四种属性对应的图标呈渐变趋势,以此呈现出一种按钮被按下、聚焦的动态变化。

但在我们的项目中,可以不需要激活以上全部属性,激活normal和highlighted属性即可,如下:

<Resource type="ResourceSkin" name="But_FeatureAlignment" size="86 86" texture="feature.png"><BasisSkin type="SubSkin" offset="0 0 86 86" align="Stretch"><State name="normal" offset="0 0 86 86"/><State name="highlighted" offset="0 1 86 86"/></BasisSkin>
</Resource>

因为我们添加的图标是单张图标,不是集成大图片,所以偏移量为0,highlighted可以偏移1-2个单位,鼠标聚焦在按钮位置时,可以呈现出动态变化。

2)使用皮肤编辑器添加

以上为皮肤编辑器(SkinEditor)的界面,需要做以下配置:File->Settings->Folders->Add,将图片所在路径添加进来,保存,退出,再次打开皮肤编辑器,导入Magic.xml文件,在右侧Texture栏即可找到自己要添加的图片。

点击Create即可创建,Rename给皮肤命名,Texture为图标;States栏即可激活上述的相应属性,在Position可指定偏移量;Separators和Regions可不用配置。

hots\屏幕截图(6).png" alt=“屏幕截图(6)” style=“zoom:80%;” />

3.按钮链接到功能函数

通过以上过程可以在界面中创建按钮和相应的图标,接下来就是将按钮和对应的功能函数链接起来。

在Magic3D中,类名称后缀带有UI的是界面类,界面的呈现会在这个类里实现,不带UI的类是功能的具体实现。如PointShopAppUI类是将点云处理的界面呈现出来,而PointShopApp类是点云处理功能的具体实现。ModelManager类是模型管理类,包括点云、网格的导入与获取,在各个类中,处理的点云网格都是基于这个类里的点云网格。

1.资源文件的加载

我们在上边已经在.layout和.xml文件中分别添加了按钮和图标,接下来我们需要将这些资源加载进来并呈现,这些都在PointShopAppUI.cpp中的Setup()函数中:

MagicCore::ResourceManager::LoadResource("../../Media/PointShopApp", "FileSystem", "PointShopApp");
mRoot = MyGUI::LayoutManager::getInstance().loadLayout("PointShopApp.layout");

通过以上代码将所需资源加载进来。接下来就要将按钮和功能函数链接起来:

mRoot.at(0)->findWidget("But_FeatureAlign")->castType<MyGUI::Button>()->eventMouseButtonClick += MyGUI::newDelegate(this, &PointShopAppUI::PointCloudFeatureAlignment);

其中,

  1. findWidget(“But_FeatureAlign”),找到对应名称的Widget(小部件);

  2. castType MyGUI::Button(),指定Widget为按钮类型,eventMouseButtonClick为鼠标按钮单击(鼠标按下和抬起)事件;

  3. MyGUI::newDelegate(this, &PointShopAppUI::PointCloudFeatureAlignment),指定了链接到的对应的功能函数。PointCloudFeatureAlignment函数参数的定义有固定格式,这种格式取决于eventMouseButtonClick事件,可通过查看eventMouseButtonClick的定义来确定,这种事件对应的功能函数定义格式为

    void PointShopAppUI::PointCloudFeatureAlignment(MyGUI::Widget* pSender)
    

2.功能函数的实现

然后在PointCloudFeatureAlignment函数中写出功能实现,如下:

void PointShopAppUI::PointCloudFeatureAlignment(MyGUI::Widget* pSender)
{PointShopApp* pointShop = dynamic_cast<PointShopApp*>(AppManager::Get()->GetApp("PointShopApp"));if (pointShop != NULL){pointShop->PointCloudFeatureAlignment(true);}
}

因为在Maic3D中,点云处理功能的具体实现是在PointShopApp.cpp中实现的,所以通过指针对象pointShop调用具体实现,分在PointShopApp.h和PointShopApp.cpp文件中定义功能函数的具体实现。

PointShopApp.cpp的具体实现如下:

void PointShopApp::PointCloudFeatureAlignment(bool isSubThread)
{if (!IsCommandAvaliable()){return;}if (isSubThread){mCommandType = ALIGNMENT;DoCommand(true);}else{/* 这里为功能函数的据题实现*/ModelManager::Get()->SetPointCloudInfo(NULL);ResetSelection();//可有可无,不影响最后效果的呈现mUpdatePointCloudRendering = true;//标志位为true就可实现渲染mpUI->SetPointCloudInfo(ModelManager::Get()->GetPointCloud()->GetPointCount());}}

这段函数可将具体实现加入子线程,是通过DoCommand(true)函数将实现推入子线程;mUpdatePointCloudRendering = true,此语句实现了点云的渲染,加在函数最后即可;mpUI->SetPointCloudInfo(ModelManager::Get()->GetPointCloud()->GetPointCount()),指明了点云具体个数。

BGL文档,常用点云网格函数[1]http://geometryhub.net/bgl/document

Magic3D(MyGUI)简单使用相关推荐

  1. mygui初探(二)皮肤编辑器

    mygui初探(二)皮肤编辑器 作者:游蓝海(http://blog.csdn.net/you_lan_hai) mygui(官网http://mygui.info),是一个开源的游戏ui库,号称高速 ...

  2. 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面

    [Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...

  3. OSG+MyGUI结合下中文输入的若干问题

    好久又没写文章了,经过这两天的研究,终于搞定了OSG+MYGUI的中文输入问题,现在进行一下所遇问题的汇总,方便自己以后查阅 问题1.小键盘数字的输入问题(这个是很久以前解决的) osg并不能给你真正 ...

  4. 网游UI解决方案的选择(CEGUI/MYGUI/Hikari/Scaleform/...)

    网游UI解决方案的选择 作者 鸣·铭 转载请注明出自http://www.mobilegamebase.com 由于新项目动工,UI方面需要确定方向,所以最近纠结于各种解决方案的选择.以下是对各方案的 ...

  5. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

  6. Linux下tomcat的安装与卸载以及配置(超简单)

    无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...

  7. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  8. Docker的安装、镜像源更换与简单应用

    Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...

  9. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

最新文章

  1. java doc 编写
  2. HTC推出新款VR头显,奇怪的是只在日本销售
  3. Windows核心编程 第三章 内核对象
  4. Codeforces 486D. Valid Sets
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)成员模板
  6. js ejs for语句的第二种遍历用法
  7. 线程池选择使用的hash算法
  8. 赠票福利 | 2018人工智能计算大会报名开启:算力爆燃,AI进化
  9. 关于字符集和字符编码格式
  10. 程序设计语言的发展过程
  11. 音量放大器--软件实现
  12. 非线性光纤光学_《Nature》子刊:解决大纵横比光纤中传质不匀的难题!
  13. 程序员学习交流的网站论坛
  14. excel取消按颜色排序_在Excel中按颜色排序
  15. pandas shift函数的用法
  16. linux 如何清理垃圾文件,Linux系统怎样清理垃圾文件
  17. 163邮箱苹果设置不成功_iphone手机,苹果手机如何登陆网易163邮箱
  18. Zhishi.me - Weaving Chinese Linking Open Data
  19. 初级计算机基础知识教程,计算机基础知识(初中级教程)
  20. 解决视频切片转码后无法无法快进的问题

热门文章

  1. 纯CSS自定义checkbox对号
  2. javascript大全
  3. C++语法(二十)常函数、常对象
  4. 室内设计和平面设计哪个更适合女生学习?
  5. ubuntu永中office的快捷键
  6. 大数据4V+1C 的特征
  7. Java代码关于TIFF/TIF图片转PNG
  8. 一文解读时间序列基本概念
  9. labelImg打开闪退怎么解决
  10. keil5安装包下载