CEGUI快速简明教程二

作者:杨漱玉青

声明:本文受Creative Commons 署名-非商业性使用-禁止演绎 2.5 中国大陆 License协议保护.

五、开始工作

在之前的内容中,我们已经初始化完毕了整个CEGUI环境,接下来我们得让他工作了。

CEGUI是使用XML格式作为GUI界面的数据,当然,这些数据的扩展名可不是一成不变的.xml,根据不同的用途,扩展名也变得不同,比如我们现在使用的layout扩展名。

或许你可以使用记事本或者其他什么的文本编辑工具打开这些东西来看看里面是标准的XML文件。

当然,你也可以直接在代码中定义这个窗口有多少个按钮,文本又如何,坐标又如何。但是这样子实在太麻烦了,每一次改动都需要重新编译,而且更重要的是,这样做失去了那个珍贵的编辑器:CELayoutEdtior。

有一个编辑器来编辑GUI是一件幸福的事情。

首先我们来说说如何得到CELayoutEdtior,当然也是在CEGUI的官方主页上面,Download页面,为了方便,你可以直接下载已经编译好的exe档。安装运行即可。

运行CELayoutEdtior,接着你就在里面编辑了,简单直观,自己熟悉去吧。途中可能会遇到各种各样的错误,先不必管吧。创建完毕之后记得保存成layout档,同时放到之前设置的datafiles/layouts/ 目录下面。

然后我们来看看让我们之前创建的这个Layout显示。你需要写如下代码:

CEGUI::Window* sheet;

CEGUI::WindowManager &winMgr = WindowManager::getSingleton();

sheet = winMgr.loadWindowLayout("文档名称.layout");

System::getSingleton().setGUISheet(sheet);

就是这样简单即可!接着编译运行,啊?为什么窗口还是黑乎乎的一片?

因为还没有渲染,你得在GLUT渲染函式中加入这个:

CEGUI::System::getSingleton().renderGUI();

接着再次编译运行,你就可以发现你之前创建的layout窗体已经显示出来了。

六、  事件

事实上,在上一节内容显示的layout,似乎除了显示之外,其他什么事情也干不了,下面我们来说如何了响应事件,已最简单的Button控件为例。

首先,创建Layout,用CELayoutEditor,里面包含了一个Button,你可以在右侧那个关不掉的对话框里面设置这个Layout的各种属性值。

我们假设创建了一个名称为”FirstButton”的Button控件,下面我们来看我们如何让当单击这个Button的时候发生点什么。

载入,显示Layout,这些你之前都已经会了。

接着上面的初始化代码:

winMgr.getWindow("FirstButton")->subscribeEvent(

CEGUI::Window::EventMouseButtonDown,

CEGUI::Event::Subscriber(&GUI::Dosomething, this));

用上述的语句,将FirstButton单击之后发生的东西绑定在Dosomething这个函式中。

这样,每次单击的FirstButton的时候,都会调用一次Dosomething这个函式。

但是值得注意的是,Dosomething这个函式不是随随便便可以定义的,一定要定义成如下形式:

bool  Dosomething (const CEGUI::EventArgs& args);

“const CEGUI::EventArgs& args”这是必须要存在的,并且也只能存在这个。

接着编译运行,发现,耶?我的鼠标器即使移动到了按钮的时候,单击了,但是似乎仍然什么都没有发生的样子。

七、  鼠标控制

事实上,之前我们创建的按钮,他一点也没有认为我们已经单击他了,即使你拼命的拿着鼠标器在他上面猛击,但是他仍然浑然不知。

因为我们得加入鼠标的信息循环中,告诉CEGUI我们的鼠标在移动了。

在GLUT指派glutPassiveMotionFunc的鼠标消息循环处理函式中,你得加入这样的语句:

CEGUI::System::getSingleton().injectMousePosition(x, y);

X和y参数分别是鼠标消息循环处理函式的参数,坐标值。

再次编译运行,你会发现那个特制的鼠标器开始移动了,并且放到之前的FirstButton上面,也有动态的效果了,但是猛击却仍然没有任何反应。因为你还没有传递给CEGUI你单击了他们。

同样,在GLUT的glutMouseFunc指派的鼠标器触发消息循环函式中,同样得加入如下语句:


void processMouse(int button, int state, int x, int y)
{
	switch(button)
	{
	case  GLUT_LEFT_BUTTON:
		if (state == GLUT_UP)
		{
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton);
		}
		else
		{
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);

		}
		break;

	case GLUT_RIGHT_BUTTON:
		if (state == GLUT_UP)
		{
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton);
		}
		else
		{
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);
		}
		break;

	case GLUT_MIDDLE_BUTTON:
		if (state == GLUT_UP)
		{
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton);
		}
		else
		{
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton);
		}
		break;
	}
}

再次编译运行,你会发现当你在”FirstButton”上面单击的时候,已经可以响应你之前绑定的Dosomething事件了。

  1. No comments yet.

  1. No trackbacks yet.

return top