第十六篇:SWindow的布局属性pos2type及offset


当窗口大小需要根据内容来确定时,使用XML布局可能需要做一些特殊的处理。

例如:不管窗口多大,我需要将该窗口相对于父窗口居中在XML中应该怎么处理?

如果窗口大小是固定的(如, 100 *100),这样pos属性可以定义为"|-50,|-50,|-50,|-50"即可。

当窗口大小不确定时,SOUI中提供了pos2type及offset来协同处理。

其中pos2type是offset的子集。

下面先重点介绍offset属性

offset属性是SOUI在通过pos属性完成坐标定位后再将坐标进行偏移的属性。和pos中一般使用象素为单位不同,offset是以控件最后的大小为单位进行平移。

我们可以在XML中或者代码中使用offset = "-0.5,-0.5"这样的形式来描述窗口的坐标平移属性。

属性中包含两个值,分别对应X,Y方向的平移相对于窗口大小的倍数,一般为[-1,0]的小数(float),当然也可以超过这个范围。。

我们先看一下代码中如何实现:

    class SOUI_EXP SwndLayout
    {
    public:
        //...  
        float fOffsetX,fOffsetY;  /**< 窗口坐标偏移量, x += fOffsetX *     
        //...
    };
    int SwndLayout::CalcPosition(LPRECT lpRcContainer,CRect &rcWindow )
    {
        int nRet=0;
       //...
        if(nRet==0)
        {//没有坐标等待计算了
            rcWindow.NormalizeRect();
            //处理窗口的偏移(offset)属性
            CSize sz = rcWindow.Size();
            CPoint ptOffset;
            ptOffset.x = (LONG)(sz.cx * fOffsetX);
            ptOffset.y = (LONG)(sz.cy * fOffsetY);
            rcWindow.OffsetRect(ptOffset);
        }
        return nRet;
    }

SwndLayout::CalcPosition是SOUI用来通过pos及offset属性计算窗口坐标的关键函数,为了突出重点,具体的坐标计算省略了,只列出平移处理部分的代码。

可以看出,在平移处理前,首先获得窗口的Size,再将Size分别乘以fOffsetX,fOffsetY这两个平移系数获得在x,y两个方向上的平移量。

最后才是将矩形做平移处理。

下面我们再来看看pos2type属性:

pos2type可以定义9个参考点:center, lefttop, leftmid, leftbottom,midtop,midbottom,righttop,rightmid,rightbottom。

下表显示对应原pos2type属性的offset属性:

pos2type offset
center -0.5,-0.5
lefttop 0,0
leftmid 0,-0.5
leftbottom 0,-1
midtop -0.5,0
midbottom -0.5,-1
righttop -1,0
rightmid -1,-0.5
rightbottom -1,-1

从上表可以看出,原来的pos2type属性只能是0.5的倍数,新的offset属性没有该限制。

使用pos2type可能更为直观,但是offset属性则更灵活。如果两个属性同时使用,只有最后一个属性有效。

注意:offset属性是2014.11.20才新增加的属性,pos2type属性的命名是为了兼容2014.11.20前的版本。

优质内容筛选与推荐>>
1、Maven配置 和创建一个Maven项目
2、[转]SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
3、Android模拟器操作快捷键
4、字符串两端空格与字符串中的所有空格 .NET
5、[家里蹲大学数学杂志]第266期中南大学2013年高等代数考研试题参考解答


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn