CEGUI学习心得汇总

简介: 大学时就用过CEGUI,但是基本上就是用,没有其他任何思考。现在做的东西多了,思考也多了。同事推荐看一本国人写的《CEGUI深入解析》,一开始看了一些,但没看进去,做了项目一个多月,有些实际的问题,再去看就有收获了。

大学时就用过CEGUI,但是基本上就是用,没有其他任何思考。现在做的东西多了,思考也多了。同事推荐看一本国人写的《CEGUI深入解析》,一开始看了一些,但没看进去,做了项目一个多月,有些实际的问题,再去看就有收获了。此文章就收集一些使用CEGUI的心得,以便回顾或者帮助他人。更多系统权威资料还请见CEGUI官网

  1. Subscriber类对象之间不能直接赋值

    我们有的时候想保存一些Subsriber类对象,以供程序运行过程中调用设置回调函数。但需要注意的是,SubScriber类中使用了new操作符,并且没有合理的赋值操作符,所以不要轻易将一个Subscriber类对象复制给另外一个Subscriber类对象。除非你知道这个问题的存在,并且避免Subsriber类内new出来的对象被多次delete,那么你可以让Subsriber对象之间赋值。

  2. 子窗口可以显示在父窗口之外

    有时需要一些特殊的效果,如标签页在窗口外侧,那么我们就需要子窗口显示在父窗口可视范围之外。这个实现起来很简单,直接使用setClippedByParent( false )即可。

  3. 子窗口的位置之谜

    对于LookNFeel里面的一个控件内添加子控件,我一直都很迷惑,子控件的位置到底是怎么算的?看下面的例子:
    <Child type="TaharezLook/Titlebar" nameSuffix="__auto_titlebar__">
            <Area>
                <Dim type="LeftEdge" ><AbsoluteDim value="10" /></Dim>
                <Dim type="TopEdge" ><AbsoluteDim value="10" /></Dim>
                <Dim type="Width" ><UnifiedDim scale="1" type="Width" /></Dim>
                <Dim type="Height" ><UnifiedDim scale="1" type="Height" /></Dim>
            </Area>
            <Property name="AlwaysOnTop" value="False" />
    </Child>

    假如父窗口是一个FrameWindow,那么这个子窗口的位置和大小到底是多少呢?当然你跑一下程序就知道了,但是为什么是这样呢?首先还是说一下正确结论:
    1. 子窗口的位置是以父窗口的InnerRect左上角为原点的。
    2. 子窗口的大小是根据子窗口的NonClient属性来做不同判断的。NonClient表明这个窗口是否属于客户区(客户区即InnerRect),true表示不属于(因为属性名是NonClient)。false表明属于客户区。此属性默认值为false。即一般子窗口不指定该属性,在其位父窗口客户区的。

      判断规则:如果子窗口NonClient是true,那么CEGUI会根据父窗口的OuterRect(整个窗口大小)来计算,如果NonClient是false,那么CEGUI会查看父窗口是否有InnerRect如果有根据InnerRect算,如果没有只能根据OuterRect算。InnerRect的获取又会牵扯到是否窗口有RenderingWindow(渲染窗口),如果有根据渲染窗口的函数来判断。没有渲染窗口则还是使用OuterRect。

    具体代码可以查阅一下CEGUI::Window::setArea,里面计算baseSize的时候可以看出到底是根据谁来计算比例分量的。

    //----------------------------------------------------------------------------//
    void Window::setArea(const UVector2& pos, const UVector2& size)
    {
        // Limit the value we set to something that's within the constraints
        // specified via the min and max size settings.
    
        // get size of 'base' - i.e. the size of the parent region.
        const Size base_sz((d_parent && !d_nonClientContent) ?
                                d_parent->getUnclippedInnerRect().getSize() :
                                getParentPixelSize());
    
        UVector2 newsz(size);
        constrainUVector2ToMinSize(base_sz, newsz);
        constrainUVector2ToMaxSize(base_sz, newsz);
    
        setArea_impl(pos, newsz);
    }
    

    窗口位置目前是听同事说的根据窗口的InnerRect(窗口其实都会有InnerRect,主要是看是否和OuterRect一样),像FrameWindow这样的就会有一个和OuterRect不一样的InnerRect。以后我会求证的!



相关文章
程序媛才能读懂的高级情话
程序媛才能读懂的高级情话
180 0
|
安全 Java 编译器
学妹不懂Java泛型,非让我写一篇给她看看(有图为证)
笔者有个学妹就遇到了相同的境遇,学弟被泛型搞得头晕目眩,搞不懂泛型是个啥玩意。天天用的泛型也不知道啥玩意(她可能都不知道她有没有用泛型)。立图为证!当然,笔者深度还欠缺,如果错误还请指正!
150 0
学妹不懂Java泛型,非让我写一篇给她看看(有图为证)
|
Web App开发 前端开发 fastjson
作为一枚非前端攻城狮,我...
近期造了个轮子,GitHub 地址: https://github.com/doocs/md,是一款在线微信 Markdown 编辑器,基于开源项目 wechat-format[1] 进行二次开发,纯前端实现,并新增不少特性。
126 0
作为一枚非前端攻城狮,我...
|
安全 关系型数据库 MySQL
一些杂谈
一些个人的经验和技巧
|
Java 容器
为了写中秋这篇文章,我学了 20 种编程语言!
为了给大家送中秋祝福,老哥也是绞尽脑汁了啊,最后想出了用排行榜前 20 名的编程语言输出中秋快乐这种方式!
|
开发者 程序员 架构师
开发者七夕节行为大赏
听说90%的开发者,都能在这组系列漫画里找到自己
1558 0
|
JavaScript 前端开发
一入前端深似海,从此红尘是路人系列第二弹之如何简单粗暴的编写出一个属于自己的插件
作为一个刚入行不久的web前端工程师,虽然经验不多,但是基于本人的性格,有自己掌握的并且认为比较好玩比较高大上的东西当然是要献给大家的。此博客发表后也希望可以帮到一些还在为插件编写徘徊的兄弟们。
1498 0