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。以后我会求证的!



相关文章
|
8月前
|
Rust 算法 JavaScript
编程入行指南:从代码小白到技术大牛的“码农”奇幻漂流
编程入行指南:从代码小白到技术大牛的“码农”奇幻漂流
|
9月前
|
JavaScript 前端开发 Java
程序员在七夕如何用各大编程语言写浪漫情书呢?
程序员在七夕如何用各大编程语言写浪漫情书呢?
254 6
|
安全 程序员 Python
这篇写给想选计算机专业的学弟学妹们
另外,这次我专门在自己母校拍了个视频,也算做个小宣传。但因为没经验、没设备,所以拍得比较业余,有人表示根本看不下去图片。纠结了一番我决定还是发出来。我经常跟同学说,你开始写代码不知道怎么写太正常不过了,谁不都是从小白过来的。
|
前端开发 JavaScript
#yyds干货盘点# 前端歌谣的刷题之路-第二十二题-基本数据类型检测
#yyds干货盘点# 前端歌谣的刷题之路-第二十二题-基本数据类型检测
101 0
#yyds干货盘点# 前端歌谣的刷题之路-第二十二题-基本数据类型检测
|
前端开发
#yyds干货盘点# 前端歌谣的刷题之路-第三十二题-完全等同
#yyds干货盘点# 前端歌谣的刷题之路-第三十二题-完全等同
94 0
#yyds干货盘点# 前端歌谣的刷题之路-第三十二题-完全等同
|
弹性计算 小程序 程序员
学习心得
阿里云ECS的 Windows Server 2012 R2 使用体验MIS21103 胡锦龙(Noah)自我情况
|
C语言 C++
我的C++学习心得
第一段:自我介绍 第二、三、四段:使用云服务器学习C++的过程 第五、六段:学习时的感受和对未来的规划
|
开发框架 安全 程序员
我编程,我快乐,献给所有的程序员
  最近读了《我编程,我快乐》,里面有一些观点给我了不少启发,特别是一些职业规划的方面的内容。   我编程,我快乐,献给所有的程序员   如果生活的大部分时间都被工作占据着,那么热爱工作就是热爱生活。 比起那些枯燥的简单任务,充满挑战、有驱动力、有回报的工作更能让你有动力在清晨从温暖的被窝里爬起来。工作做得好意味着你在充分发挥着才能。相反,如果工作做得不好,就证明你大部分时间都只能在懊悔,懊悔自己碌碌无为。
186 0
|
设计模式 IDE Java
奉劝那些想把编程学好的学弟学妹们!呕心沥血,袒露心声,掏心掏肺
奉劝那些想把编程学好的学弟学妹们!呕心沥血,袒露心声,掏心掏肺
152 0
小张的学习心得
我是河南牧业经济学院软件技术专业一名大二的在校生。大二的选修课我选的是软件设计,软件开发,软件技术。由于开学的时候要学习“互联产品运维测试”这门课程,老师让我们先学习云服务的使用,但苦于没有平台。这个云服务器真是雪中送碳,随着云服务器的使用越来越普遍,云服务器无需硬件设施及机房,兼具优质扩容能力。真的太太太太太给力了。