GUI之基Component组件类详解

Component类是JUCE类库中最大的一个类,GUI编程的核心与基石。其派生类也最多,各类常规控件和界面构件(文档窗口、对话框、消息窗、工具栏、菜单、按钮、标签、组合框、列表框、文本框、推子、滚动条、选项卡等等)均是该类的派生类。

Component类具有矩形外观,可绘制和填充,可接收并响应鼠标进入、离开、点击、拖拽和键盘按键等事件(基于消息的产生与捕获),可拥有一到多个子组件,亦可被其它组件所容纳,常继承或组合其它类实现更复杂的功能(比如事件响应、捕获和处理)。

组件是什么?能做些什么?
 一块可以显示或隐藏的屏幕区域,可以有背景,有颜色,也可透明。可普通显示,也可模态显示。
 组件有大小和定位,可设置及访问。
 组件可以显示在桌面上,也可以显示在其它组件中,即:组件既是组件,又可以是组件容器。
 某个组件可置于其它平级组件之前或之后。
 组件可获取并设置其父组件的诸多属性,更可以获取并设置其子组件的诸多属性。
 组件不仅是组件容器,还是数据容器,用于存储该组件的所有属性(属性名和属性值)。
 除子组件(控件)外,组件还可以显示文本、图形、图像等可视元素,可在任意时刻触发重绘。
 可以接收和处理鼠标和键盘事件,可设置是否接受和处理鼠标与键盘事件。
 组件有名字和ID,可通过其名字或ID及其属性访问、重新创建或加载该组件。
 每个组件都有自己的一套坐标系(原点为本组件的左上点)。
 组件内的坐标可方便的转换为其他组件的坐标或屏幕坐标。
 组件可实现平移、缩放、旋转等仿射变换,配合其它类,可实现阴影、动画等视觉效果。
 组件所显示的内容可转换为Image图像。
 组件可设置自己的LookAndFeel外观。
 组件有启用和禁用两种状态。
 组件有一大批回调函数,当自身或其父/子组件的属性、状态或可视性发生变化时,自动回调。
 JUCE类库中所有可视化的控件均是组件(Component的派生类)。
 等等……

组件类有两个重要的成员函数,一个是用于定位和布局的resized(),一个是用于完成各类绘制的paint()函数,实例化组件对象时,这两者的执行顺序为:先调用resized(),后调用paint()。

使用组件的整体思路:
 自定义组件类(继承自Component和其他类,比如控件监听者类),重写paint()、resized()等虚函数,实现基类的纯虚函数。可在自定义组件中声明、创建和管理更多子组件(控件)。
 设置自身属性,设置子组件属性,子组件添加捕获器(注册监听者)。析构函数中,子组件移除捕获器(监听者),销毁子组件。
 通常在上一级组件的构造函数中创建、添加并设置本组件(此时,本组件为子组件),resized()方法中布局定位,析构函数中销毁。
 在父组件的功能性函数中实现组件本身、组件与组件之间、组件与数据模型之间的互控、改变与关联。
 组件也可不隶属于任何父级组件,而是直接置于操作系统的桌面,成为桌面型组件。
 自定义的组件类往往具有一些需要读写的属性数据或模型数据(大多数操作文档类型的程序均采用MVC架构,或简化的MVC架构。而由Component担当的视图往往需要保存一批模型数据),一个简单的做法是:组件类中声明如下两个函数:

void restoreFromXML (const XmlElement& xml);
XmlElement* createXML() const;

当然,如果情况复杂,也可声明另外的数据模型对象。或者将UI与数据模型这两部分隔离开来,位于不同的类或类群中,通过上级组件协调和通信。

Component组件类继承自MouseListener鼠标事件捕获类。因此,天然可捕获所有绑定了MouseListener的对象所产生的消息。

以下为Component及其派生类常用的代码示例:(略)