第十六篇: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前的版本。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM