ApplicationCommandManager 3-3

与ApplicationCommandManager命令管理器和ApplicationCommandTarget命令目标关系异常紧密且非常重要的是ApplicationCommandInfo命令信息结构体,其代表每一条命令的详细信息,命令目标类的getCommandInfo()函数的执行结果,即将有关数据保存到该结构体中。其枚举、成员函数和数据成员均为public类型的。

继续阅读ApplicationCommandManager 3-3

ApplicationCommandManager 3-2

由上例可知,如此一来,所有程序命令目标类的命令全部集中在顶级窗口中调度,即:ApplicationCommandManager程序命令管理器对象将所有的命令目标类与所有命令的快捷键、命令所执行的功能等等集中到了一起,不管当前哪个命令目标类拥有焦点,只要按下快捷键,就由顶级窗口统一调度和分配。

很大程度上讲,程序命令管理器就像一个桥梁和纽带,更像一个所有命令的容器,谁执行我不管,我只保管所有命令,接收到有关消息后(比如用户按下了快捷键),我就及时捕获该按键,并将其转发给已经注册给我的命令目标对象。这一点非常符合OOP的职责单一、低耦合、依赖倒转等设计原则,更大大简化了编程中对象之间的组合与聚合。理解并运用JUCE类库的这一机制,非常重要!

继续阅读ApplicationCommandManager 3-2

ApplicationCommandManager 3-1

本小节内容涉及以下类:

  • ApplicationCommandManager 命令管理器,数据容器,保存快捷键集合对象
  • KeyPressMappingSet 快捷键集合,保存所有命令及其详细信息
  • ApplicationCommandInfo 命令信息,代表一条具体的命令
  • ApplicationCommandManagerListener 捕获命令管理器所产生的消息(通常无需直接使用)
  • ApplicationCommandTarget 命令目标,定义所有命令,并执行具体的功能
  • InvocationInfo 命令目标所调用的命令信息

继续阅读ApplicationCommandManager 3-1

JUCE复合控件之DragAndDropContainer

ComponentDragger可实现以鼠标拖拽的方式改变某个组件或其子组件的定位(手工移动)。该类比较简单,如要实现更复杂的拖放操作,比如:程序内部的自定义组件的拖放、操作系统的文件拖放到本程序,外部程序中的文本拖放到本程序等等,这些情况下,需用到:DragAndDropContainer拖放容器、DragAndDropTarget拖放目标、FileDragAndDropTarget文件拖放目标和TextDragAndDropTarget文本拖放目标这几个类。

实现上述拖放操作的关键有四点

继续阅读JUCE复合控件之DragAndDropContainer

JUCE复合控件之LassoComponent

实现套索功能,需3个类模板和1个抽象类:

  • LassoComponent 套索组件,继承自Component。通常声明为内容组件的栈对象。
  • LassoSource 独立的抽象基类。拖拽套索时选择的项目由该类获取并转存。内容组件需继承该类。
  • SelectedItemSet 项目容器,继承自ChangeBroadcaster。声明为内容组件的栈对象。
  • ChangeListener 可变捕获器,抽象基类,用于捕获项目容器所产生的消息。内容组件需继承该类。

继续阅读JUCE复合控件之LassoComponent

JUCE复合控件之StretchableLayoutManager

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

实现流程
继续阅读JUCE复合控件之StretchableLayoutManager

JUCE复合控件之ThreadWithProgressWindow

ThreadWithProgressWindow为使用后台线程并模态显示的进度条窗口(带有进度条的消息窗),可带有【取消】按钮。该类是一个抽象基类,并没有继承自Component类,而是继承自Thread和Timer这两个类,虽实现了Timer类的纯虚函数timeCallback(),但没有实现Thread类的纯虚函数run()。因此,使用本类完成进度条窗口功能时,必须派生子类。

ThreadWithProgressWindow类的构造函数(后3个参数有默认值):

继续阅读JUCE复合控件之ThreadWithProgressWindow

JUCE复合控件之Toolbar

Toolbar工具栏不仅可以放置并显示常规的工具栏按钮(带图标和文字说明),还可以放置任意类型的控件,比如:组合框、列表框、文本标签、推子、弹出式菜单等等,甚至可以放置各类自定义的组件。也就是说:工具栏可为一个定制的组件,包含可绘制按钮或图像按钮,以及其他控件。

带图像按钮的常规工具栏所需的类有4个:

继续阅读JUCE复合控件之Toolbar

JUCE复合控件之MenubarModel

实现主菜单功能离不开MenubarModel菜单栏模型抽象基类,同时需要两个辅助类:

  • PopupMenu弹出式菜单对象,代表菜单栏中的顶级菜单,用户点击了哪个顶级菜单的名称,该对象就添加哪个顶级菜单所需的菜单项,并自动模态显示在该顶级菜单名称的下面。该对象需由MenuBarModel的派生类在getMenuForIndex()中创建、添加菜单项或命令项,而后返回之。
  • ApplicationCommandManager程序命令管理器对象。PopupMenu添加菜单项时,可以直接添加该菜单项的文本和ID,也可添加程序命令,将程序命令作为菜单项。每个程序命令均有简略描述(作为菜单项或按钮所显示的文本),同时均有一个唯一性的ID,ApplicationCommandTarget将根据此ID在其perform()函数中执行对应的代码。

继续阅读JUCE复合控件之MenubarModel

JUCE复合控件之TableListBox详解

TableListBox以表格的形式显示各类数据,而数据来源与显示(绘制)则由抽象基类TableListBoxModel来完成。因此,内容组件类如使用表格控件,需继承TableListBoxModel类并实现其纯虚函数,而后在类中声明TableListBox表格对象。通常还需要一个TableHeaderComponent表头类(每一列的标头,用于显示列标题,添加或移除列,本列数据排序等)。注意:表格中的某一列可使用自定义的组件,比如组合框。。

使用表格6步走
继续阅读JUCE复合控件之TableListBox详解