JUCE类库GUI-按钮详解

按钮是GUI程序中最常见的控件。JUCE有以下几种类型的按钮(功能类):

  • TextButton 文本按钮
  • ToggleButton 复选框(开关式按钮)
  • DrawableButton 可绘制的按钮
  • HyperlinkButton 带有下划线的超级链接
  • ImageButton 图像按钮
  • ArrowButton 可显示一个箭头的按钮
  • ShapeButton 可具有各种形状的按钮
  • TabbarButton 选项卡按钮
  • ToolbarItemComponent 工具栏项目(该类在工具栏一节中介绍)
    • ToolbarButton 工具栏按钮,该类是ToolbarItemComponent的派生类

这些按钮类,全部继承自Button类。如需更加个性与复杂的按钮(比如前文所示的点击按钮后弹出CallOutBox),可参照这些类定制自己的Button类。或者,从这些已有的按钮类中派生Button的“孙类”。

Button

先了解一下Button::Listener,该抽象基类可被内容组件继承,专用于捕获和处理Button类所产生的消息。内容组件类创建按钮对象后,该对象需addListener (this)绑定捕获器(或者理解为添加、注册监听者。可添加一到多个监听者,而并不仅仅限于容纳自己的内容组件),这样即可捕获并处理按钮所产生的消息。Button::Listener有两个成员函数,均为void类型,其中buttonClicked()为纯虚函数:

  • buttonClicked () 鼠标点击或快捷键触发按钮后, 自动调用此函数
  • buttonStateChanged () 按钮状态发生变化时, 自动调用此函数

Button按钮类的基本特性:
 Button按钮类有多个派生类,分别代表不同类型和样式的按钮
 按钮可由鼠标点击或快捷键来触发,即按钮被点击了
 每个按钮均有三种状态,这三种状态定义为Button::ButtonState枚举类型,分别是:

  • buttonNormal 正常状态
  • buttonOver 鼠标正指向本按钮
  • buttonDown 鼠标点击本按钮,尚未释放时

Button类多重继承自以下5个类:Component、SettableTooltipClient、ApplicationCommandManagerListener、Value::Listener、KeyListener,拥有这些类的全部属性和行为。也就是说,Component等类的所有public成员函数,Button对象皆可调用。比如:setColour()设置颜色,setSize()设置大小,setBounds()布局定位,setVisible()是否可见,setEnable()启用还是禁用,setTooltip()设置实时提示等等。比如:

// 设置文本按钮在正常情况下和鼠标指向时的颜色。
// brighter()的作用:增加该颜色的亮度。
textButton->setColour (TextButton::buttonColourId, Colours::white);
textButton->setColour (TextButton::buttonOnColourId, Colours::blueviolet);

内容组件使用按钮(包括其它控件和自定义的子组件)有7个步骤:

  1. 继承捕获(监听者)。内容组件类需继承ButtonListner类,使之能够侦听(捕获)按钮产生的消息。
  2. 声明对象。内容组件声明一到多个按钮对象,或干脆声明一个OwnedArray<Button*>数组。
  3. 创添显设。内容组件的构造函数中创建、添加、显示并设置按钮对象。
  4. 绑定捕获(注册监听)。按钮对象调用addlistener(this),绑定捕获器来处理自身的点击和状态改变事件。
  5. 布局定位。内容组件的resized()方法中对按钮进行布局和定位。
  6. 清理善后。如果是指针型按钮对象,需在内容组件的析构函数中销毁并释放堆内存。
  7. 捕获消息。内容组件类继承自捕获类的buttonClicked()函数中判断并处理按钮点击事件:
void buttonClicked (Button* button) 
{
    // 如果点击了按钮enableButton
    if (button == &enableButton)
        // 执行某些代码...

    // 如果点击了按钮menuButton...
    else if (button == &menuButton)
        // 执行某些代码...
}

Button派生类,除文本按钮外,其余按钮在默认情况下均没有边框,也没有按钮背景色,干巴巴的直接置于内容组件中。有些类型的按钮可设置具有普通按钮的外观,比如创建DrawableButton可绘制按钮时,第二个构造参数(枚举常量)即可设置其外观和样式。所有类型的按钮均继承了父类Button类和父类的父类Component类的所有public方法,其属性设置相当灵活,功能很强大,可以自定义非常个性化的外观。

Button类的重要成员函数:(网站发布,略)

有人可能会问了,为何没有Radio button?事实上,JUCE类库所有的Button类对象均可实现此功能。通常可使用ToggleButton开关式按钮。Radio button是指:一组按钮无论何时,有且仅有一个处于开启状态,其他均处于关闭状态。实现此功能的关键有二:

  1. 按钮对象调用 setRadioGroupId() 函数进行编组,编组ID为相同数值的按钮视为一组Radio
  2. 确定初始状态下哪个按钮处于选中状态