顯示具有 Gob 標籤的文章。 顯示所有文章
顯示具有 Gob 標籤的文章。 顯示所有文章

2008年6月13日

MAP-INNER and MAP-OUTER are killing me

我一直搞不懂MAP-INNER與MAP-OUTER要如何使用,也沒有文件說明可以閱讀。我在動手寫程式做了一些實驗之後,終於放棄了。我於是定義了下面的函數(取得某個gob的絕對座標):
abs-offset?: func [ gob [gob!] ] [
negate second map-inner gob 0x0
]

以後我打算只使用MAP-EVENT和abs-offset?,不再碰觸令人痛苦不已的MAP-INNER與MAP-OUTER。

MAP-EVENT的用法


REBOL 3.0最近新增一個函數MAP-EVENT,相當好用,可以將滑鼠相關的event,從「最底層的視窗gob」對應到「最上層的gob」。新產生出來的event,其offset與gob屬性都會被修改。通常用法會是這樣:

event: map-event event

假設滑鼠是圖中的黑點,則對應前event/gob會得到紅色的gob,且event/offset會得到黑點和紅色gob左上角的相對位置。對應後,event/gob會得到藍色的gob,且event/offset會得到黑點和藍色gob左上角的相對位置。

2008年4月13日

GUI架構


REBOL的GUI是以GOB為核心,GOB的設計考慮到效率和彈性。GOB的下層目前是AGG的2D繪圖引擎,以後還有可能加上OpenGL/DirectX等3D引擎。

你可以只利用GOB和View設計出REBOL的GUI程式(我的舊版本Transma程式,就只有使用到GOB和View,沒用到VID),但是這麼做的複雜度比較高,大多數的人會使用VID。VID是一種高階的視覺化介面方言,將下面的細節隱匿起來。VID也具有Skin(轉換不同視覺外觀)的能力。

2008年4月12日

用Draw方言繪製發光文字


REBOL Draw底層使用AGG 2.4當繪圖引擎,繪圖能力很強。這裡是一個範例展示:

REBOL[]

my-font: make system/standard/font [
name: "Times New Roman" size: 64
]

draw-block: [ ]

for i 0 9 1 [
j: to-integer (255 / 10.0 * (i + 1))
append draw-block compose/deep [
pen (to-tuple reduce [ j j 255 ] )
line-width (10 - i)
line-join round
fill-pen none
text 10x0 vectorial [
font my-font bold "REBOL"
]
]
]

append draw-block compose [
fill-pen black
text 10x0 vectorial [
font my-font bold "REBOL"
]
Fill-pen Red
text 142x0 vectorial [
font my-font bold "O"
]
]

win: make gob! [
size: 360x130
color: black
]

append win g: make gob! compose [
size: ( win/size )
offset: 0x0
]

g/draw: draw-block

view win