/** 例5 用户界面

这个例子显示了如何使用Irrlicht引擎内置的用户界面。
它会给出一个如何创建以及使用窗口,按钮,滑动条,静态文本和列表框等的简要概述。

和之前一样,我们首先包含头文件并使用引擎的命名空间。
我们还持有一个指向引擎设备的指针、控制窗口的变量以及列表框的指针

*/
#include <irrlicht.h>
#include "driverChoice.h"

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif

//生命一个结构其来持有事件接受器,这样可以使他在OnEvent函数内可见
struct SAppContext
{
IrrlichtDevice *device;
s32     counter;
IGUIListBox* listbox;
};

// 定义一些参数,我们将于用区分个人定义的控件
enum
{
GUI_ID_QUIT_BUTTON = 101,
GUI_ID_NEW_WINDOW_BUTTON,
GUI_ID_FILE_OPEN_BUTTON,
GUI_ID_TRANSPARENCY_SCROLL_BAR
};

/*
事件接收器不止能接受来自键鼠的消息,也能接受来自用户图形界面的消息。
事件可能来自各个地方:点击按钮,菜单选择,一个元素被选中等等。
为了能够及时的响应这些事件,我们创建了事件接受器。
我们只响应用户界面所发生的时间,如果接受到的时间是来自GUI,
我们将获取发出者的ID(及UI元素的ID)以及GUI环境的指针。
*/
class MyEventReceiver : public IEventReceiver
{
public:
MyEventReceiver(SAppContext & context) : Context(context) { }

//继承来自IEventReceiver的OnEvent虚函数,并且若有子类继承此MyEventReceiver类时仍需覆盖此方法。
//const SEvent& event:以SEvent类型接受此参数,并不能修改
virtual bool OnEvent(const SEvent& event)
{
   if (event.EventType == EET_GUI_EVENT)
   {
    s32 id = event.GUIEvent.Caller->getID();
    IGUIEnvironment* env = Context.device->getGUIEnvironment();

switch(event.GUIEvent.EventType)
    {

/*
    如果出触发的是改变滚动条位置事件而且是我们所添加到界面的滚动条
    (即id GUI_ID_TRANSPARENCY_SCROLL_BAR),我们接下来改变界面的透明度。
    这很容易:这里有一个皮肤对象,所有的颜色都存储于此。
    我们遍历所有的颜色存储并且调节他们的alpha值即可。
    */
    case EGET_SCROLL_BAR_CHANGED:
     if (id == GUI_ID_TRANSPARENCY_SCROLL_BAR)
     {
      s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
     
      for (u32 i=0; i<EGDC_COUNT ; ++i)
      {
       SColor col = env->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
       col.setAlpha(pos);
       env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
      }
     
     }
     break;

/*
    如果是点击按钮事件,可能是我们设置的三个按钮之一。
    如果是第一个,我们就结关闭引擎。
    如果是第二个,我们就创建一个新窗口并显示一些静态信息。
    同时,我们也在列表框里添加我们的动作记录。
    如果是第三个按钮,我们就打开一个文件系统对话框并在列表框里添加我们的动作记录。
    事件接受器就结束了。
    */
    case EGET_BUTTON_CLICKED:
     switch(id)
     {
     case GUI_ID_QUIT_BUTTON:
      Context.device->closeDevice();
      return true;

case GUI_ID_NEW_WINDOW_BUTTON:
      {
      Context.listbox->addItem(L"Window created");
      //使弹出窗口位于不同位置
      Context.counter += 30;
      if (Context.counter > 200)
       Context.counter = 0;

/*
      virtual IGUIWindow* irr::gui::IGUIEnvironment::addWindow (
         const core::rect< s32 > & rectangle,
       bool modal = false,
       const wchar_t * text = 0,
       IGUIElement * parent = 0,
       s32 id = -1)
      */
      IGUIWindow* window = env->addWindow(
       rect<s32>(100 + Context.counter, 100 + Context.counter, 300 + Context.counter, 200 + Context.counter),
       false,
       L"Test window");

/*
      virtual IGUIStaticText* irr::gui::IGUIEnvironment::addStaticText (
         const wchar_t * text,
         const core::rect< s32 > & rectangle,
         bool border = false,
         bool wordWrap = true,
         IGUIElement * parent = 0,
         s32 id = -1,
         bool fillBackground = false)
      */
      env->addStaticText(
       L"Please close me",
       rect<s32>(35,35,140,50),
       true,
       false,
       window);
      }
      return true;

case GUI_ID_FILE_OPEN_BUTTON:
      Context.listbox->addItem(L"File open");
      env->addFileOpenDialog(L"Please choose a file.");
      return true;

default:
      return false;
     }
     break;

default:
     break;
    }
   }

return false;
}

//创建Context:MyEventReceiver(SAppContext & context) : Context(context){}
private:
SAppContext & Context;
};

/*
现在我们来看写有趣的部分。
首先,创建引擎。
就像其他例子中的一样,我们要求用户去选择他们希望的类型。
*/
int main()
{
// 询问用户
video::E_DRIVER_TYPE driverType=driverChoiceConsole();
if (driverType==video::EDT_COUNT)
   return 1;

//创建设备,若失败则退出。
IrrlichtDevice * device = createDevice(driverType, core::dimension2d<u32>(640, 480));

if (device == 0)
   return 1; //创建所选类型失败

/* The creation was successful, now we set the event receiver and
   store pointers to the driver and to the gui environment. */

device->setWindowCaption(L"Irrlicht Engine - User Interface Demo");
device->setResizable(true);

video::IVideoDriver* driver = device->getVideoDriver();
IGUIEnvironment* env = device->getGUIEnvironment();

/*
为了让字体更好看些,我们载入额外的字体并在皮肤中设置为新的默认字体。
为了让提示文本显示标准,我们设置为内置字体。
(???:To keep the standard font for tool tip text, we set it to the built-in font.)
*/

IGUISkin* skin = env->getSkin();
IGUIFont* font = env->getFont("http://www.cnblogs.com/media/fonthaettenschweiler.bmp");
if (font)
   skin->setFont(font);

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

/*
我们添加三个按钮。
第一个用于关闭引擎。
第二个创建窗口,第三个打开文本系统的对话框。
第三个参数是按钮的ID,这样我们可以在事件接收器离开方便的定位按钮。
*/

env->addButton(rect<s32>(10,240,110,240 + 32), 0, GUI_ID_QUIT_BUTTON,
    L"Quit", L"Exits Program");
env->addButton(rect<s32>(10,280,110,280 + 32), 0, GUI_ID_NEW_WINDOW_BUTTON,
    L"New Window", L"Launches a new Window");
env->addButton(rect<s32>(10,320,110,320 + 32), 0, GUI_ID_FILE_OPEN_BUTTON,
    L"File Open", L"Opens a file");

/*
现在我们添加一个静态文本和一个滚动条,来控制窗口各元素的透明度。
我们设置滚动条的最大值为255,因为这是透明度的上限。
之后我们再创建一个文本和列表框。
*/

env->addStaticText(L"Transparent Control:", rect<s32>(150,20,350,40), true);
IGUIScrollBar* scrollbar = env->addScrollBar(true,
    rect<s32>(150, 45, 350, 60), 0, GUI_ID_TRANSPARENCY_SCROLL_BAR);
scrollbar->setMax(255);

//将滚动条位置设置为当前皮肤透明度的值
scrollbar->setPos(env->getSkin()->getColor(EGDC_WINDOW).getAlpha());

env->addStaticText(L"Logging ListBox:", rect<s32>(50,110,250,130), true);
IGUIListBox * listbox = env->addListBox(rect<s32>(50, 140, 250, 210));
env->addEditBox(L"Editable Text", rect<s32>(350, 80, 550, 100));

//存储相应的数据。
SAppContext context;
context.device = device;
context.counter = 0;
context.listbox = listbox;

// 创建事件接收器,并将context作为参数。
MyEventReceiver receiver(context);

//通知系统使用我们定义的事件接受器
device->setEventReceiver(&receiver);

/*
最后,我们在左上角显示一个漂漂的Irrlicht Logo。
And at last, we create a nice Irrlicht Engine logo in the top left corner.
*/
env->addImage(driver->getTexture("http://www.cnblogs.com/media/irrlichtlogo2.png"),
    position2d<int>(10,10));

/*
一切就绪
*/

while(device->run() && driver)
if (device->isWindowActive())
{
   driver->beginScene(true, true, SColor(0,200,200,200));

env->drawAll();

driver->endScene();
}

device->drop();

return 0;
}

转载于:https://www.cnblogs.com/ducky/archive/2010/10/26/1861404.html

【Irrlicht Engine笔记】test5-UserInterface相关推荐

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

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

  2. Irrlicht Engine 相关信息——一些常见问题和解答

    1:Irrlicht引擎是什么? Irr引擎是一个高性能,跨平台,开源的3D引擎.它能够帮助你进行实时3D程序的开发.它的主要目标是:方便使用,运行速度快,可扩展,线程安全. 这个引擎是一个非常灵活的 ...

  3. Irrlicht学习备忘录——5 UserInterface

    5 UserInterface 官方代码($sdk)\examples\05.UserInterface 这个例子是讲irr引擎的用户图形界面.里面只演示了窗口.按钮.滚动条.静态字体和列表框这几样常 ...

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

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

  5. Google Earth Engine笔记-植被覆盖度计算

    1 植被覆盖度遥感监测 根据 N D V I NDVI NDVI数据进行像元二分模型计算植被覆盖度 像元二分模型将像元的植被覆盖结构分为纯像元与混合像元两类,纯像元植被完全覆盖覆盖度为1,混合想要由植 ...

  6. 【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题,在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章,作为我们<Visual C++游戏开发>专栏的游戏引擎导论,也 ...

  7. 游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8250057 作者:毛星云(浅墨 ...

  8. 【Irrlicht鬼火引擎】 安装配置Irrlicht鬼火引擎

    一.下载引擎 官方网站:http://irrlicht.sourceforge.net/‎ 官方网站需要翻墙才能进入,如果不想翻墙,可以通过其他下载地址: CSDN下载:http://download ...

  9. Irrlicht例002--Quake3Map

    这个例子仅简单的介绍了下如何Load一个Quake3的场景,其中没有什么特殊的概念. 只需注意一下Irr的思想就可以,将场景和摄象机都做为场景节点来处理. 最后,提供了用户选择设备类型的功能,并显示了 ...

最新文章

  1. Python入门100题 | 第043题
  2. 基于sobel算法的边缘检测设计与实现
  3. 简单粗暴入门java之数组概述
  4. python制作会动的表情包_Python自动生成表情包,python在手,从此斗图无敌手
  5. 提供通达信level2逐笔还原逐笔成交ticks导出提取工具
  6. 陈丹琦“简单到令人沮丧”的屠榜之作:关系抽取新SOTA!
  7. VMware Workstation 10序列号
  8. Statement 和 PreparedStatement之间的关系和区别
  9. 利用matlab求解常数e,利用matlab软件求解常数e和欧拉常数γ.docx
  10. 微信小程序地址自动识别
  11. html手机陀螺儀页面,详解html5如何获取手机陀螺仪角度信息的示例代码
  12. m3u8下载时出现跨域的解决方法
  13. java 民族_java简历 五年
  14. CSS 2D转换和源点的影响原理(translate、scale、skew、rotate)
  15. 安全杂记二(网络安全威胁)
  16. QStatusBar
  17. 宇视网络视频录像机“设备级”、“通道级”告警是什么意思
  18. vivoNEX3s版本服务器无响应,屡次误判形势?vivo NEX3S逐渐无人问津,或许已遇到瓶颈!...
  19. 2021肥西实验高级中学高考成绩查询,高三年级召开2021年合肥市第二次教学质量检测成绩分析会...
  20. 学生课间10分钟鸦雀无声遭反对,教育部做出最新响应

热门文章

  1. 怎么样在迅捷CAD编辑器的图中输入文字
  2. HTML5热气球飞行游戏代码
  3. 六级高频词汇——Group03
  4. 常用计算机故障处理指令,计算机常见故障分析与维修.ppt
  5. C# TSF 输入法的获取
  6. Axure原型团队设计
  7. 电网两阶段鲁棒优化调度模型(含matlab程序)
  8. 怎么设置永磁同步电机的电流控制角
  9. mojave时间机器文件服务器,黑苹果懒人版CDR镜像macOS Mojave 10.14.1(18D42)
  10. 计算机控制系统在地铁应用,浅谈计算机技术在地铁通信系统中的应用