JUCE复合控件之ListBox详解

复合控件:前台UI界面需抽象数据模型或其它辅助类才可以正常工作的复杂控件。绝大多数复合控件,均为“模型-视图”模式。即:视图类负责前台显示数据或提供人机交互的操作界面,抽象的模型类负责数据来源与数据的业务处理。实际编程时,在内容组件类中声明、管理和使用视图类的对象,同时,内容组件类继承自抽象的模型类,实现其纯虚函数,用自身(this)将二者关联到一起(视图设置模型),共同实现所需的功能。

ListBox是Component的直接派生类。要使用ListBox列表框,内容组件需继承ListBoxModel(列表框模型)类,实现该基类的2个纯虚函数,重写该基类的1个核心函数。ListBox对象的构造参数需要一个ListBoxModel类的指针。某个内容组件类使用列表框的常规步骤有5:
继续阅读JUCE复合控件之ListBox详解

JUCE类库之PopupMenu 3-2

弹出式菜单的异步回调

由上可知,使用弹出式菜单,show()函数非常关键,但它无法实现异步回调。弹出式菜单属于典型的模态组件,针对所有模态组件,JUCE类库有个异步回调的消息处理机制,体现在PopupMenu类中,就是可替代show()的showMenuAsync()函数。该函数有两个参数:1参为PopupMenu::Options结构体对象,用于设置菜单的各种属性:弹出的菜单附着于哪个组件、位于屏幕的哪个位置、最小宽度、最大列数、菜单项的高度、确保显示哪个菜单项。2参是一个回调函数的指针,其原型函数用于接收用户点选的菜单项ID并进行判断处理。先看一下具体的示例语句:

继续阅读JUCE类库之PopupMenu 3-2

JUCE类库之PopupMenu 3-1

PopupMenu(弹出式菜单)是一个独立的类,没有继承自Component。其实质是弹出一个模态窗口(组件容器),该容器中的每个元素均为组件,即显示了一条文本信息的菜单项,该菜单项具有唯一的ID信息,则信息由添加此菜单项时所指定。鼠标点击某个菜单项,其实是点击了某个组件。点击后,窗口退出模态,消失不见,同时返回所点击的菜单项组件的ID,后续代码或其他函数根据此ID判断哪个菜单项被点选了,从而给出对应的代码,实现具体的功能。
继续阅读JUCE类库之PopupMenu 3-1

JUCE常规控件之ProgressBar

JUCE原生两种形式的进度条,一种是简单的、无需显式动用后台线程的ProgressBar,适用于数据处理不占资源、出现在内容组件界面内、轻量级的进度显示,作为常规控件使用即可。另一种是数据处理使用后台线程,前台弹出模态窗口专门来显示进度条和文本消息的重量级进度窗ThreadWithProgressWindow(使用时需派生子类并实现run()函数)。

轻量级的ProgressBar继承了ComponentTimer,其使用流程是:创建本类对象时需指定所关联的double值,该值为处理进度的百分比(有效范围:0.0到1.0),只要本类对象调用了setVisible (true)使自己可见,则自动获取所关联的数据的最新值并重绘自身(内部原理是:启动计时器,开始不停的回调timerCallback()函数,在该函数中不停的获取所关联的数据并触发重绘)。而本类对象不可见时(setVisible (false);),则进度条停止前进(内部机制是停止回调计时器)。使用轻量级的ProgressBar具体步骤有4:
继续阅读JUCE常规控件之ProgressBar

JUCE常规控件之MultiDocumentPanel

MultiDocumentPanel与Viewport有异曲同工之妙,二者均继承自Component;均用来容纳并显示内容组件(组件容器),并且添加内容组件均通过特定的函数来完成,而不是Component::addAndMakeVisible();二者所容纳并显示的内容组件通常均作为GUI应用程序的主操作区,也就是文档区、内部数据的UI显示或交互区。

继续阅读JUCE常规控件之MultiDocumentPanel

JUCE类库常规控件之ConcertinaPanel

ConcertinaPanel折叠面板单继承自Component类,类似于TabbedComponent选项卡组件,可添加多个子组件,每个子组件均有一个标题栏,标题栏文本为该子组件的名称。本类所持有的子组件垂直排列,默认折叠(仅显示最后一个子组件的内容)。鼠标上下拖拽某个子组件的标题栏,可改变其大小,鼠标双击则扩展显示之。见下图所示:

ConcertinaPanel

图 4 10 ConcertinaPanel折叠面板

继续阅读JUCE类库常规控件之ConcertinaPanel