读书人

MyGui札记(3)控件对齐方式和所在层

发布时间: 2013-10-18 20:53:13 作者: rapoo

MyGui笔记(3)控件对齐方式和所在层

前篇:《MyGui笔记(2)控件类型和皮肤》
本篇:创建控件的方法要传入控件对齐方式,创建根控件还需传入将被创建到哪一层的名称。
环境:MyGui3.2.0(OpenGL平台)

控件对齐方式

控件的对齐方式,定义在Align里面,所定义的方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum Enum
{
HCenter = MYGUI_FLAG_NONE, /**< 水平居中 */
VCenter = MYGUI_FLAG_NONE, /**< 垂直居中 */
Center = HCenter | VCenter, /**< 中心居中 */

Left = MYGUI_FLAG(1), /**< 居左 (并且垂直居中) */
Right = MYGUI_FLAG(2), /**< 居右 (并且垂直居中) */
HStretch = Left | Right, /**< 按与父窗口的比例进行水平拉伸 (并且垂直居中) */

Top = MYGUI_FLAG(3), /**< 居上 (并且水平居中) */
Bottom = MYGUI_FLAG(4), /**< 居下 (并且水平居中) */
VStretch = Top | Bottom, /**< 按与父窗口的比例进行垂直拉伸 (并且水平居中) */

Stretch = HStretch | VStretch, /**< 按与父窗口的比例进行拉伸 */
Default = Left | Top /**< 默认值 (居左和居上) */
};

并不仅这些方式,还可以自己进行组合,如:

1
2
Left | VStretch /**< 居左和按与父窗口的比例进行垂直拉伸 */
HStretch | Bottom /**< 按与父窗口的比例进行水平拉伸和居下 */

每当父窗口进行位置或者大小改变,都会对其子控件进行重新计算位置和大小,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//_oldsize 父控件旧的大小
//_newSize 父控件新的大小
void Widget::_setAlign(const IntSize& _oldsize, const IntSize& _newSize)
{
const IntSize& size = _newSize;//getParentSize();

bool need_move = false;
bool need_size = false;
IntCoord coord = mCoord;

// 对齐方式
if (mAlign.isHStretch())
{
// 拉伸
coord.width = mCoord.width + (size.width - _oldsize.width);
need_size = true;
}
else if (mAlign.isRight())
{
// 向右移动
coord.left = mCoord.left + (size.width - _oldsize.width);
need_move = true;
}
else if (mAlign.isHCenter())
{
// 没有拉伸的水平对齐
coord.left = (size.width - mCoord.width) / 2;
need_move = true;
}

if (mAlign.isVStretch())
{
// 拉伸
coord.height = mCoord.height + (size.height - _oldsize.height);
need_size = true;
}
else if (mAlign.isBottom())
{
// 向下移动
coord.top = mCoord.top + (size.height - _oldsize.height);
need_move = true;
}
else if (mAlign.isVCenter())
{
// 没有拉伸的垂直居中
coord.top = (size.height - mCoord.height) / 2;
need_move = true;
}

if (need_move)
{
if (need_size)
setCoord(coord);
else
setPosition(coord.point());
}
else if (need_size)
{
setSize(coord.size());
}
else
{
_updateView(); // 无需移动和改变大小
}
}

控件所在层

每个根控件创建的时候,需要指定其所在层,所有的层定义在MyGUI_Layers.xml文件,这个文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layer" version="1.2">
<Layer type="SharedLayer" name="Wallpaper">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="SharedLayer" name="Back">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="OverlappedLayer" name="Overlapped">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="SharedLayer" name="Middle">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="OverlappedLayer" name="Modal">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="SharedLayer" name="Main">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="OverlappedLayer" name="Popup">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="SharedLayer" name="FadeMiddle">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="OverlappedLayer" name="Info">
<Property key="Pick" value="true"/>
</Layer>
<Layer type="SharedLayer" name="ToolTip">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="SharedLayer" name="DragAndDrop">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="SharedLayer" name="FadeBusy">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="SharedLayer" name="Pointer">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="SharedLayer" name="Fade">
<Property key="Pick" value="false"/>
</Layer>
<Layer type="SharedLayer" name="Statistic">
<Property key="Pick" value="false"/>
</Layer>
</MyGUI>

可以看到层类型分为两种:SharedLayerOverlappedLayer

读书人网 >移动开发

热点推荐