当窗口大小需要根据内容来确定时,使用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=;
//...
if(nRet==)
{//没有坐标等待计算了
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前的版本。

第十六篇:SWindow的布局属性pos2type及offset的更多相关文章

  1. 第五篇:在SOUI中使用XML布局属性指引(pos, offset, pos2type)

    窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定 ...

  2. 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)

    解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...

  3. 使用Typescript重构axios(二十六)——添加HTTP授权auth属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  4. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  5. 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint

    目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...

  6. Egret入门学习日记 --- 第十六篇(书中 6.10~7.3节 内容)

    第十六篇(书中 6.10~7.3节 内容) 昨天搞定了6.9节,今天就从6.10节开始. 其实这个蛮简单的. 这是程序员模式. 这是设计师模式. 至此,6.10节 完毕. 开始 6.11节. 有点没营 ...

  7. Struts2(十六篇)

    (一)Struts2框架概述 (二)Struts2配置文件 (三)Struts2的Action(简单讲解版) (四)Struts2的Action(深入讲解版) (五)Struts2处理结果管理 (六) ...

  8. Python自动化 【第十六篇】:JavaScript作用域和Dom收尾

    本节内容: javascript作用域 DOM收尾 JavaScript作用域 JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走 ...

  9. Python全栈开发之路 【第十六篇】:jQuey的动画效果、属性操作、文档操作、input的value

    01-动画效果 show 显示 概念:显示隐藏的匹配元素 语法:show(speed,callback) 参数: speed:三种预定速度之一的字符串('slow','normal','fast')或 ...

随机推荐

  1. bzoj 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...

  2. python学习笔记-(十一)面向对象进阶&异常处理

    上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用). 静态方法 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使 ...

  3. nginx 和 IIS 实现负载均衡

    Nginx的作用和优点,这里不必多说,今天主要是nginx负载均衡实验,把做的步骤记录下来,作为一个学习笔记吧,也可以给大家做下参考. 1.Nginx安装 1.下载地址:http://nginx.or ...

  4. System.Properties和System.getenv区别

    网上很多使用的是getProperties.说获得系统变量,但是其实不正确.getProperties中所谓的"system properties"其实是指"java s ...

  5. 作为一名前端er,从武汉来到深圳三个月有感

    来到深圳已经三个月了,从最开始的担心自己的能力不够怕不能够在深圳这个互联网产品及其发达的城市立足下来,到现在已经慢慢地拾起了一丁点的信心了 (虽然还有很多知识是不够的.但是相当于之前我的,我是觉得我已 ...

  6. codevs2572 路面修整

    题目描述 Description Mr. Ling打算好好修一下学校门口的那条凹凸不平的路.按照Mr. Ling的设想,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同 ...

  7. 用C语言,如何判断主机是 大端还是小端(字节序)

    所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址.比如 0x12345678 在大端机上是 12345678,在小端机上是 78564312,而一个主机是大端还是小端要看C ...

  8. cookie中文乱码

    在学习当中碰到cookie中文乱码问题,问题原因:cookie对中文不太支持,将中文放入cookie中会报错误. 解决办法: 1.编码 将中文进行编码再放入cookie中: String userna ...

  9. OpenVPN使用用户名/密码验证方式

    OpenVPN推荐使用证书进行认证,安全性很高,但是配置起来很麻烦.还好它也能像pptp等vpn一样使用用户名/密码进行认证. 不管何种认证方式,服务端的ca.crt, server.crt, ser ...

  10. oracle中 SELECT INTO 和INSERT INTO ... SELECT区别

    在Oracle中,将一张表的数据复制到另外一个对象中.通常会有这两种方法:insert into select  和 select into from. 前者可以将select 出来的N行(0到任意数 ...