870920 Menu

JUCE复合控件之StretchableLayoutManager

StretchableLayoutManager的功能:鼠标拖拉组件与组件之间的边框(调整栏),可实时改变一个或多个组件(操作区)的大小。要实现此功能,需用到两个类:StretchableLayoutManager和StretchableLayoutResizerBar。简而言之,要实现布局分栏与拖拽调整,需:布局器与调整栏。

实现流程

  • StretchableLayoutManager布局器是一个独立的类,相当于一个容器,容器的元素为2到3个必须的子组件,其中第一个可为要调整大小的内容组件的子组件,第二个可为调整栏对象,第三个可选,如有,可设置一个空的子组件(尽管为空,但该子组件有其原点坐标,可利用该坐标联动调整内容组件中的其他子组件的定位)。布局器保存每个元素的一组数据,比如子组件可调整的宽度或高度的上限值、下限值、默认值,并根据设置自动调整这些元素的定位。
  • StretchableLayoutResizerBar调整栏继承自Component类,按普通的控件办理即可,其构造1参为布局器对象,构造2参为自身在布局器中的索引位置,构造3参确定是垂直的,还是水平的。
  • 布局器和调整栏的创建与初始化设置在内容组件类的构造函数中进行,具体的布局和联动功能在内容组件类的resized()函数中进行。
  • 尽管一对布局器和调整栏可完成1到多个子组件的联动调整。但如果内容组件的分栏布局过于复杂,最好还是声明并使用多对布局器和调整栏。
  • 如需定制调整器的外观和颜色,则派生StretchableLayoutResizerBar的子类,重写其paint()函数。

示例代码(步骤有三):

1、声明对象。内容组件类private两个对象:布局管理器对象和布局调整栏对象。本例前者为普通栈对象,后者为使用作用域指针的堆对象:

2、关联组件。内容组件类构造函数中添加如下语句:

3、组件布局。内容组件的resized()方法中对可调整的子组件进行布局。这里有个小小的绕弯要理清思路。布局管理器负责管理3个子组件,第一个子组件无需多说,要调整的就是它;第二个为调整栏(它本身也是一个子组件),第三个为空子组件。这个空子组件很关键,尽管为空,但它有左边缘(或顶边缘,视排列方式而定),而这个边缘的坐标值将决定内容组件中联动改变的其他子组件的定位点。这么一来,拖动调整栏之后,就实现两个或多个子组件的联动了。本例实现的是:拖动列表框右侧的调整栏,列表框改变大小,同时,调整栏右侧的文本编辑器也改变大小。

StretchableLayoutManager类和StretchableLayoutResizerBar类的成员函数(略)。