當窗口大小需要根據內容來確定時,使用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前的版本。
