Rebol 编程/语言特性/视图
视图是一个强大的二维合成图形引擎,专为显示用户界面而设计。它接受一个面对象,其中包含各种图形元素的层次结构描述,并调用操作系统将它们渲染到用户显示器。各种视觉对象或面可能具有处理程序,专门处理某些视觉事件,例如鼠标悬停、点击、窗口调整大小等,这些事件通过调用“do-events”链接到 Rebol 的事件处理系统中。
这意味着当在窗口中检测到鼠标点击,并且鼠标点击位于按钮对象上时,视图能够执行该按钮定义的处理代码,该代码处理鼠标点击。
Rebol 使用一个标准面,作为所有图形对象的蓝图。视图需要使用它作为基本对象,因为它包含渲染和允许与操作系统交互所需的最小属性集。它在system/standard/face中定义,也由全局变量face引用。
让我们通过从系统face中模板化来定义一个面,如下所示
a-face: make face [ offset: 100x100 size: 200x100 color: red effect: [gradient] ]
默认面偏移为 0x0,颜色值为 200.200.200,大小为 100x100。我们在这里对其进行了修改,添加了一些红色,渐变色在整个面中变化,并重新定位和调整了大小。
我们如何知道系统面对象具有哪些属性?很简单,通过输入
>> help face
FACE is an object of value: type word! face offset pair! 0x0 size pair! 100x100 span none! none pane none! none text none! none color tuple! 200.200.200 image none! none effect none! none data none! none edge object! [color image effect size] font object! [name style size color offset space align valign s... para object! [origin margin indent tabs wrap? scroll] feel object! [redraw detect over engage] saved-area none! none rate none! none show? logic! true options none! none parent-face none! none old-offset none! none old-size none! none line-list none! none changes none! none face-flags integer! 0 action none! none
要直接使用视图熟练掌握,需要深入了解各种图形组件。对于大多数希望构建用户界面的用户来说,不需要这种详细程度,幸运的是 Rebol 拥有一个视觉界面方言 (VID),它极大地简化了该过程。
要使用VID构建一个带有文本标签和文本输入字段的界面,就如同以下代码一样简单
view layout [ label "Enter Name:" field [ print face/text ]]
它看起来像这样
layout 解析块,并由此构建一个包含一组复杂的图形元素的面,这些元素处理文本编辑和鼠标悬停。视图引擎随后将此渲染到屏幕上。
尽管VID被吹捧为仅仅是构建用户界面时可以创建的方言的一个示例,但由于它内置且比直接在视图中编程更简单,因此它已成为构建用户界面的默认方式。
这种方法存在一些问题。由于VID编程极大地简化了用户界面的构建,它也隐藏了背后的复杂性,因此如果您想做一些没有记录的功能,就需要检查 VID 的源代码以了解如何完成。此外,VID 在其图形界面对象范围方面仍然不完整,第三方小部件通常不能很好地协同工作。由layout引擎生成的代码中也存在大量冗余,因为并非每个对象的每个方面都需要在每个实例中,但仍然会生成。它还缺少自动调整大小机制,元素必须手动重新定位。