SDL中文论坛

标题: linked_group [打印本页]

作者: ancientcc    时间: 2017-2-14 09:10
标题: linked_group
定义一个分组,把需要等尺寸的控件归入该组,属于该组的控件具有相同尺寸。等尺寸分为三种,1)只是等宽度;2)只是等高度;3)等宽等高。

编写WML时如何使用linked_group
linked_group在窗口级WML中使用。使用它分两步。

1、定义一个新分组
在窗口级WML的[tresolution]块定义一个叫icon_area的分组。
  1. [linked_group]
  2.         id = "icon_area"
  3.         fixed_width = "true"
  4. [/linked_group]
复制代码
这个分组叫icon_area,fixed_width=true使属于该分组控件具有相同宽度。fixed_height使用默认值,默认值是false,也就是属于该分组控件不要求高度一致。

2、把控件归入该组
  1. [column]
  2.         ......
  3.         [stacked_widget]
  4.                 id = ""
  5.                 definition = "default"
  6.                 linked_group = "icon_area"
  7.                 ......
  8.         [/stacked_widget]
  9. [/column]
复制代码
要归入的控件使用:linked_group = 分组名。

什么时候使用分组
垂直列表框内各项要有相同宽度。
多页列表控件内各页有相同宽度。

程序实现
twindow负责处理linked_group,具体归到两个函数:layout_init、layout_linked_widgets。
layout_init(true);
如果设置了等尺寸组的话,把自已加入等尺寸组。任何一个控件都有个linked_groud字段,该字段是一个字符串,设置了它属于哪个等尺寸组,如果空的话不属于任何等尺寸组。
[label]
        linked_group = "icon"
[/label]
以上定了一个文本控件,它属于“icon”这个等尺寸组。

twindow用std::map<std::string, tlinked_size>数据结构来存储等尺寸组,加入过程就是把控件加入这个数据结构。
  1. twindow
  2. {
  3.         ......
  4.         std::map<std::string, tlinked_size> linked_size_;
  5.         ......
  6. };
  7. void twindow::add_linked_widget(const std::string& id, twidget* widget)
  8. {
  9.         std::vector<twidget<twidget*>& widgets = linked_size_[id].widgets;
  10.         if (std::find(widgets.begin(), widgets.end(), widget) == widgets.end()) {
  11.                 widgets.push_back(widget);
  12.         }
  13. }
复制代码


layout_linked_widgets();

layout_size_会作为控件的标称尺寸;
如果出现放大的话,标称尺寸将不是渲染尺寸,因而要保持同样渲染尺寸的话须要设置相同放大系数(gorw_factor)。
等尺寸可能是三种,1)只是等宽度;2)只是等高度;3)等宽等高。layout_linked_widgets设置的layout_size_,等尺寸那方向是最大值,不等的方向则是控件计算出的标称尺寸。




欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3