870920 Menu

JUCE类库组件的相关类

本小节内容:与Component关系比较密切,且并无继承关系的类。

ComponentListener 组件捕获(监听者)类
组件及其派生类可绑定此类的指针,使用流程与思路同Button与Button::Listener等控件的事件捕获与处理。用于捕获并处理组件消息的类为ComponentListener,该类的成员函数为:(略)。

多个组件派生类均继承了ComponentListener,比如:Viewport、MultiDocumentPanel等,这些类可处理所有用addComponentListener()绑定了ComponentListener指针的组件类所产生的消息。

ComponentPeer 组件同位体
抽象基类,用于将某个组件封装为操作系统的窗口对象。该类与操作平台直接相关,包含多个平台下创建和管理窗口的默认实现。可以理解为:该类代表JUCE组件对象的本机操作系统的窗口实例。ComponentPeer类预定义了StyleFlags枚举类型,代表各种类型的窗口属性,比如:窗口是否有标题栏、是否有标题栏中的某个按钮、是否可调整大小、是否具有阴影效果、是否临时弹出式的窗口、窗口标记是否出现在操作系统任务栏中,等等。一些类的构造函数或成员函数的参数,需要该枚举。

ComponentPeer的成员函数较多,功能类似Component类。

DropShadower 组件阴影
给组件添加一个阴影。创建本类对象,调用setOwner()函数即可,该函数的参数即为要添加阴影的组件。注意:如果是桌面窗口,则无需使用DropShadower类,要添加到桌面的组件对象调用addToDesktop()时,1参设置为ComponentPeer::windowHasDropShadow标记即可(MAC系统下不适用)

LookAndFeel 外观及感觉 (详情可参见前文

ComponentAnimator 动画组件
可使组件动态改变位置和大小,实现平滑移动、淡入淡出等动画效果。稍加变通,利用JUCE类库提供的仿射变换等技术,还可实现更绚丽出彩的视觉体验。界面元素的动画效果已经是当前GUI软件开发的潮流和“必需品”,特别在智能移动设备的触控操作方面。

本类的使用方法、技巧及示例:(略)

ComponentBuilder 组件构造器
自定义内容组件类时,需做很多繁琐的工作,比如一系列的设置、各类子组件(控件)的声明、创建、使用和管理,而使用ComponentBuilder类则可利用已经创建好的自定义组件,直接构造与之相同或类似的全新组件。其原理是:基于ValueTree技术,将已有的自定义组件的各个属性和数据(包括所用的图像数据)存储为ComponentBuilder对象,需要创建与原组件相同或类似的组件时,直接用先前保存的ComponentBuilder对象来创建或返回之。
要实现这个功能,有3个关键点:(略)

ComponentDragger 组件拖放器
ComponentDragger可实现手工移动组件,即鼠标拖拽时实时移动该组件。该类有两个核心函数:
 startDraggingComponent() 准备拖拽。1参:要拖拽的组件,2参:触发拖拽的鼠标事件
 dragComponent() 移动组件。1参:要拖拽的组件,2参:鼠标事件,3参:可选的强制器对象(该对象用于限制组件的位置和大小)。如果不打算使用强制器对象,则设为nullptr。

内容组件类声明本类对象后,在mouseDown()方法中,该对象调用startDraggingComponent(),而后在mouseDrag()方法中,该对象调用dragComponent()。完成上述编码后,可通过鼠标拖拽的方式来改变内容组件的位置。不过,内容组件的可视范围仅限于其父级组件,超出父级组件的部分无法显示出来。

注:内容组件类使用ComponentDragger不仅可使自身具有可拖拽属性,也可拖拽它的任意子组件。但是,无论是自身被拖拽,还是子组件被拖拽,都只是允许用户改变组件的显示位置而已,其余什么也做不了。要在拖拽后实现必要的操作处理,仅靠本类将非常繁琐,而用DragAndDropContainer拖放容器和DragAndDropTarget拖放目标这两个类就方便的多。也就是说,拖拽和拖放是两种性质不同的操作。关于拖放操作,请点此参阅

使用ComponentDragger使内容组件具有可拖拽属性的示例代码:(略)

MarkerList 标记列表
MarkerList无父类,亦无派生类。该类相当于一个“标记点”的数据容器和管理者,标记点实为该类的嵌套类MarkerList::Marker的对象,每个Marker对象均有position坐标点和name文本名称这两个public属性。

MarkerList类的另一个嵌套的抽象类MarkerList::Listener用于捕获并处理MarkerList在添加、移除、移动标记点时所产生的消息。与之对应,MarkerList类有成员函数addListener()和removeListener()。

MarkerList还有一个嵌套类为MarkerList::ValueTreeWrapper,用于保存MakerList的数据和状态,内部机制是将有关数据封装到valueTree中。该类可读取某个MarkerList的数据,或者将本对象所保存的数据应用到某个MarkerList。并可直接获取或设置具体的Marker。借助于ValueTree的威力,该类所有的修改性函数均有一个UndoManager对象,可方便的实现撤销与重做。

KeyboardFocusTraverser 控制焦点在组件之间移动的顺序
默认情况下,如果没有显式指定焦点顺序,那么内容组件中各个子组件键盘焦点的顺序为:从左到右、从上到下。如打算使用自定义的焦点转移顺序,可创建本类的派生类,而后内容组件类中调用createFocusTraverser()创建并返回之。