5 UserInterface

官方代码($sdk)\examples\05.UserInterface

这个例子是讲irr引擎的用户图形界面。里面只演示了窗口、按钮、滚动条、静态字体和列表框这几样常用的图形界面元素,其实这已经是irr用户图形界面的大部分内容了。irr用户图形界面,个人认为是鸡肋。用它,它太难看了,想要让它好看,得自己写扩展,这基本等于用irr的接口规范自己从新做一遍用户图形界面的基本元素。不用,得自己重新找一套GUI来和irr结合,使用起来不一定有irr原生的那么简单。下面看具体如何使用irr的GUI。

使用GUI一般都会产生一些用户反馈的交互信息,这些信息就是GUI事件。要想对这些GUI事件进行处理,首先就得获取这些事件。获取GUI事件最简单的方法就是上一个例子里用到的事件接收器,事件接收器所接收的事件就包括GUI事件,只是上个例子里没有使用而已。本例里同样自定义了一个MyEventReceiver事件接收器,只是这次的OnEvent方法里处理的事件换成了EET_GUI_EVENT事件。接收到的GUI事件是以SGUIEvent数据结构存储的。

structSGUIEvent

{

产生GUI事件的GUI元素Caller

gui::IGUIElement*Caller;

与Caller一起产生事件的GUI元素,一般不用

gui::IGUIElement*Element;

GUI事件的类型

gui::EGUI_EVENT_TYPEEventType;

};

GUI事件类型定义在EGUI_EVENT_TYPE枚举里

enumEGUI_EVENT_TYPE

{

失去焦点

EGET_ELEMENT_FOCUS_LOST= 0,

获得焦点

EGET_ELEMENT_FOCUSED,

光标停留在GUI元素上

EGET_ELEMENT_HOVERED,

光标离开元素

EGET_ELEMENT_LEFT,

元素关闭

EGET_ELEMENT_CLOSED,

按钮被点击

EGET_BUTTON_CLICKED,

滚动条被移动

EGET_SCROLL_BAR_CHANGED,

复选框发生变化

EGET_CHECKBOX_CHANGED,

列表框发生变化

EGET_LISTBOX_CHANGED,

列表框被再次选择

EGET_LISTBOX_SELECTED_AGAIN,

文件被选择

EGET_FILE_SELECTED,

目录被选择

EGET_DIRECTORY_SELECTED,

文件对话框选择取消

EGET_FILE_CHOOSE_DIALOG_CANCELLED,

消息框YES被按下

EGET_MESSAGEBOX_YES,

消息框NO被按下

EGET_MESSAGEBOX_NO,

消息框OK被按下

EGET_MESSAGEBOX_OK,

消息框取消被按下

EGET_MESSAGEBOX_CANCEL,

文本编辑框里按下回车键

EGET_EDITBOX_ENTER,

文本编辑框内容改变

EGET_EDITBOX_CHANGED,

文本编辑框标记区域改变

EGET_EDITBOX_MARKING_CHANGED,

TAB键控着元素改变

EGET_TAB_CHANGED,

菜单项被选中

EGET_MENU_ITEM_SELECTED,

组合框改变

EGET_COMBO_BOX_CHANGED,

旋转框改变

EGET_SPINBOX_CHANGED,

表格改变

EGET_TABLE_CHANGED,

表格头改变

EGET_TABLE_HEADER_CHANGED,

表格被再次选中

EGET_TABLE_SELECTED_AGAIN,

观察树节点失去选择

EGET_TREEVIEW_NODE_DESELECT,

观察树节点被选中

EGET_TREEVIEW_NODE_SELECT,

观察树节点被展开

EGET_TREEVIEW_NODE_EXPAND,

观察树节点被收拢

EGET_TREEVIEW_NODE_COLLAPSE,

EGET_TREEVIEW_NODE_COLLAPS= EGET_TREEVIEW_NODE_COLLAPSE,

GUI事件总数

EGET_COUNT

};

从GUI事件的数据结构可以看出,GUI事件很简单,通过区分GUI事件类型,可以很轻易的筛选出自己关心的GUI事件,再从产生GUI事件的Caller,就可以明确这个事件是不是自己关心的元素产生的。

例子里因为使用的GUI元素较少,同时为了使例子看似去更加简单明了,它为GUI元素设定了几个固定ID,如:GUI_ID_QUIT_BUTTON、GUI_ID_NEW_WINDOW_BUTTON、GUI_ID_FILE_OPEN_BUTTON和GUI_ID_TRANSPARENCY_SCROLL_BAR。这样就不必用全局变量或其他的方法保存动态生成的GUI元素的指针用来筛选是不是自己关注的元素,直接通过Caller的ID就可以区分出来。但这方法也有缺点,如果GUI是在程序外通过配置文件配置的,不同功能的GUI很有可能使用了相同的ID,这样会导致错误。

创建GUI元素的方法,在《HelloWorld!》例子里已经出现过。首先就是IGUIEnvironment*env =device->getGUIEnvironment(),通过irr设备获取GUI环境;然后再通过GUI环境的addXXXX方法添加不同的GUI元素。

GUI的字体设置,这也是个重要问题。在例子里字体设置部分如下:

获取环境GUI的默认皮肤

IGUISkin*skin = env->getSkin();

读取一个外部字体库

IGUIFont*font = env->getFont("../../media/fonthaettenschweiler.bmp");

将该外部设为默认皮肤的字体

if(font)

skin->setFont(font);

设置提示文字的字体为内嵌的标准字体

skin->setFont(env->getBuiltInFont(),EGDF_TOOLTIP);

但这方法只适合英文,如果要使用其他的文字,得对irr进行文字的扩展,这种载入一张图片作为字库的方法肯定是不行的。

在例子中,还有设置GUI透明度的方法。这部分在自定义的MyEventReceiver类的OnEvent方法中。捕获到EGET_SCROLL_BAR_CHANGED事件后,如下操作。

获取滚动条的位置,将该位置作为设置GUI透明度的参数

s32pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();

对皮肤里每一种颜色重设透明度

for(u32 i=0; i<EGDC_COUNT ; ++i)

{

获取皮肤的第i个颜色

SColorcol = env->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);

设置颜色的透明度

col.setAlpha(pos);

设置皮肤的第i个颜色

env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i,col);

}

在irr里还可以自己扩展IGUIElement,创建出引擎没有的GUI元素,在IGUIElement的OnEvent方法里,可以直接从消息循环里直接获取GUI事件,对自己扩展的GUI元素里的子元素事件直接进行相应的处理,不必通过事件接收器处理。如果嫌irr的GUI实在难看的话,可以在自己扩展的元素里,用重载draw方法,写一个更漂亮的GUI元素出来。不过这种重载draw方法来使GUI更漂亮的方法也有致命缺陷,就是不能灵活的设计出自己想要的界面,总不能对每一次的一小点需求变化都来进行一次draw的重载吧!如果要强行解决irr界面的美观和灵活性,这就不再是对irr扩展了,而是需要对irr进行改造了。

Irrlicht学习备忘录——5 UserInterface相关推荐

  1. Irrlicht学习笔记(5)--UserInterface

    1.说明: 这个例子介绍irrlicht引擎的用户界面接口部分, 展示了Irrlicht引擎GUI设计的部分内容. 本例内容包括: 1)创建和使用窗口 2)按钮 3)滑动条 4)静态文本 5)列表盒子 ...

  2. CORE ANIMATION的学习备忘录

    CORE ANIMATION的学习备忘录(第一天) 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性 ...

  3. Python基础学习备忘录上

    Python基础学习 备忘录上 Python语法 1.1 输出 1.1.1 输出换行的更改 1.1.2 输出整型 1.1.3 输出字符串 1.1.4 字符串拼接与多行输出 1.1.5 输入输出类型转换 ...

  4. android备忘录教学_Android学习备忘录

    看的框架层相关的概念容易忘记,写个备忘录把理解的重点和遇到的疑惑记下. Context:用Android最早接触到的一个类,使用非常非常广泛,在各个地方都要用到,像Toast.Dialog.new T ...

  5. Python3.5.2官方文档学习备忘录

    网址:https://docs.python.org/3/ 虽然学习官方文档有些耗时,不过看最原版的还是感觉好一点,原汁原味没有曲解没有省略. 从命令行向Python传递参数,运行:python - ...

  6. Irrlicht学习笔记(8)--SpecialFX

    说明: 本例程介绍: 阴影 粒子系统 布告板 动态光照 水面节点 1.载入一个房间 用于表现动态光照 关键步骤为;1.1,1.3. 1.2是为了优化贴图效果 //1.加载一个房间模型 1.1加载模型网 ...

  7. [学习备忘录]编译gdb及gdbserver

    调试的重要大家都知道,不多说.本文简单写一下编译gdb的步骤,当然还有gdbserver,本文不强调"交叉"."交叉编译"等等关键字,这些技术没什么的,很普通. ...

  8. [学习备忘录]Linux平台静态库、动态库的一些笔记

    先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...

  9. python官方文档学习_Python3.5.2官方文档学习备忘录

    一个简单oop的changeTab 好多地方都会用到这样一个效果"点击tab切换内容页",根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对 ...

最新文章

  1. 什么样的数据适合缓存?
  2. is_callable — 检测参数是否为合法的可调用结构
  3. 终于有人把 Elasticsearch 原理讲透了
  4. JS中闭包的应用自定义JS模块2
  5. php authcode java_PHP(authcode)加密解密
  6. dnf台服升级mysql_MySQL Yum存储库 安装、升级、集群
  7. java 画笔跟swing组件_「软帝学院」:2019思维最清晰的java学习路线
  8. 5 Ways to Speed Up Your Rails App
  9. CentOS 6.8下ELK+filebeat+redis 日志分析平台
  10. @AuotoWired+@Qualifier(百度百科)
  11. androidstudio4.1.1 build model卡主_在C++中加载PyTorch1.4的FasterRCNN模型
  12. VC6.0代码移植到VS2008运行时乱码问题解决
  13. 微信公众号使用:设置开发者密码(AppSecret)的步骤
  14. kubernetes 源码安装1.18.3 (7)部署cni网络
  15. Android上的CPU和GPU是共享内存,为什么有的手机从GPU读取数据还是很慢?
  16. 【渝粤教育】国家开放大学2018年春季 8624-21T物业管理案例分析 参考试题
  17. java动态图片_java实现gif效果(java显示动态图片)
  18. Excel数据透视表按指定文字顺序排序方法
  19. dir-616 c1语言包,D-Link DIR616无线路由器设置教程
  20. python 抓取lol主播排行

热门文章

  1. 图形化编程实现模块化和面向对象编程
  2. 关于补码1.0000的真值为什么是-1的解答
  3. 韩信点兵C++算法实现
  4. 学习一个Cena和Lemon的SPJ
  5. t检验orF检验and多重比较
  6. 二叉树(二)----->链式二叉树(上)
  7. codeforces 614B Geda's Code
  8. Python使用HMACSHA1加密生成签名
  9. android pak文件_Android 获取手机中已安装apk文件信息
  10. 三种代码版本控制系统的简介 以及 SVN的安装