JUCE常规控件之Slider详解

JUCE-Sliders

Slider类同样有一个嵌套的抽象基类Slider::Listener,通常,声明和使用Slider的内容组件类继承该抽象基类,并在构造函数中创建Slider之后,让Slider对象绑定自己,从而可以捕获并处理Slider的值发生变化时所产生的消息,以执行相应的功能性操作。

JUCE的原生Slider有7种类型(见上图所示。图片来源:JUCE类库附带的Demo开源示例项目)。该类预定义了类型的枚举值:
 Slider::LinearHorizontal 水平式普通推子
 Slider::TwoValueHorizontal 水平式双头推子
 Slider::TwoValueVertical 垂直式双头推子
 Slider::Rotary 旋钮式旋钮(圆周拖拽调整数值)
 Slider::RotaryHorizontalVerticalDrag 旋钮式推子(上下左右拖拽调整数值)
 Slider::IncDecButtons 带加减号按钮和显示数值的文本框

所有类型的推子,均可用setDoubleClickReturnValue ()方法使自己拥有一个非常人性化的功能:双击复位。这一点,对程序员来说,微不足道,无非一行代码而已。但是,对软件的用户来说,操作体验却是云泥之别。想象一下,一款仿真的DSP或音频效果器,界面上一大堆旋钮、推子,用户在工作时难免动来动去,顾此失彼。想重置某个控件的数值,只能一个一个,一点一点调回去,经常头昏脑胀而找不着北。有了双击复位这个功能,只需双击,该推子或旋钮的数值就自动重置,实在是方便太多了。

推子可附带显示数值的文本框,预定义的枚举值:
 Slider::NoTextBox 不显示文本框
 Slider::TextBoxLeft 位于推子左侧, 垂直居中
 Slider::TextBoxRight 位于推子右侧, 垂直居中
 Slider::TextBoxAbove 位于推子上方, 水平居中
 Slider::TextBoxBelow 位于推子下方, 水平居中

各个组成部分的颜色ID(枚举值)
 Slider::backgroundColourId 推子的背景色.
 Slider::thumbColourId 推头颜色
 Slider::trackColourId 轨道颜色
 Slider::rotarySliderFillColourId 旋钮式推子的填充颜色
 Slider::rotarySliderOutlineColourId 旋钮式推子的外框颜色
 Slider::textBoxTextColourId 文本框的文本颜色
 Slider::textBoxBackgroundColourId 文本框的背景色
 Slider::textBoxHighlightColourId 文本高亮的颜色
 Slider::textBoxOutlineColourId 文本框的框线颜色

Slider类的重要成员函数:(略)

示例代码:

// 内容组件类的构造函数中批量创建推子。
// sliders是OwnedArray对象。
for (int i = 0; i < 3; ++i) 
{
    sliders.add (new Slider());
    addAndMakeVisible (sliders[i]);

    sliders[i]->addListener (this);
    sliders[i]->setRange (0.0, 100.0, 1.0);
    sliders[i]->setValue (50.0, false);
    sliders[i]->setDoubleClickReturnValue (true, 50.0);
}
// 传统水平式推子
sliders[0]->setSliderStyle (Slider::LinearHorizontal);
sliders[0]->setTextBoxStyle (Slider::TextBoxRight, true, 40, 20);
sliders[0]->setSize (300, 20);

// 传统垂直式推子
sliders[1]->setSliderStyle (Slider::LinearVertical);
sliders[1]->setTextBoxStyle (Slider::TextBoxAbove, true, 40, 20);
sliders[1]->setSize (100, 350);

// 带增减按钮和文本框的“推子”
sliders[2]->setSliderStyle (Slider::IncDecButtons);
sliders[2]->setTextBoxStyle (Slider::TextBoxLeft, false, 60, 20);
sliders[2]->setIncDecButtonsMode (Slider:incDecButtonsDraggable_Vertical);
sliders[2]->setSize (100, 20);