JUCE组件之Drawable详解

Component组件类只是一个可视的空白矩形区域(前提是paint()中绘制了背景,否则,组件默认是透明的),如果要显示图形图像等等,需在paint()函数中利用Graphics或Path等类的对象进行相关的描述、填充或绘制。而Drawable可绘制类则天然具有绘制的能力,其继承自Component类,相当于一个天然可绘制的组件,或者说,可进行自我绘制的组件。Drawable本身是一个抽象类,有多个派生的功能类,其继承层次如下图所示:

Drawable

图 4 5 Drawable类的继承层次

Drawable类系的核心成员函数为draw…()开头的绘制函数,该函数可将Drawable对象所持有的图形、图像、文本、Path等内容直接绘制出来,比如:

/* 可绘制的复合体类的智能指针开始用画刷绘制自身。1参数为Graphics画刷对象,2参为透明度,3参为仿射变换对象,以实现所绘制元素的缩放、平移和旋转
svgDrawable->draw (g, (float) opacitySlider->getValue(), transform);

注:JUCE 2.0之后,Drawable对象的渲染绘制方式做了改变,即:不再使用draw…()函数,而是Drawable对象作为一个子组件添加到父级组件时,自动完成绘制。

Drawable类的静态函数(这几个静态函数均返回本类的堆对象):
 createFromImageData () 尝试将给出的内存数据(图像)转换为本类对象
 createFromImageDataStream () 尝试将包含图像数据的输入流转换为本类对象
 createFromImageFile () 尝试将图像文件转换为本类对象
 createFromSVG () 尝试解析SVG格式的图像数据,并将其转换为本类对象
 createFromValueTree () 基于先前保存的ValueTree数据创建本类对象

Drawable类的成员函数(含派生类需实现的纯虚函数):
 createCopy () 创建本类对象的深度复制的副本
 draw () 渲染绘制
 drawAt () 渲染绘制到指定位置
 drawWithin () 绘制到给定的矩形中,并自动进行缩放
 setOriginWithOriginalSize () 取消所使用的仿射变换,重置原点坐标
 setTransformToFit () 设置所用的仿射变换
 getParent () 返回包含本对象的DrawableComposite,如果有的话
 createValueTree () 将当前对象创建为ValueTree,返回值可用于再次创建本对象
 getDrawableBounds () 返回绘制时所覆盖的区域

Drawable的各个派生类,顾名可思义,专用于具体内容的绘制:

  • DrawableImage 专用于绘制Image图像的可绘制组件,可直接设置图像的透明度
  • DrawableShape 专用于绘制矩形、填充Path或Path描边的可绘制组件。该类又有两个派生类:DrawablePath和DrawableRectangle
  • DrawableText 可绘制一行文本,可设置文本的内容、字体、颜色、大小和对齐方式
  • DrawableComposite 其他可绘制组件的容器,当此组件内的子组件发生改变、添加或移除,或者此组件的父级组件发生变化时,可自动调用该类的某些成员函数。

前三个派生类,直接当成内容组件中的“控件”使用即可,比如DrawableImage,声明对象,创添显设删。给该对象setImage()设置图像,无需draw()即可显示图像。

如需将一幅图像显示在某个组件中,该组件并无其它子组件和额外的功能,还可使用ImageComponent类。