首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用 Guile 来为 GTK+ 应用添加扩展语言 Scheme(4)

用 Guile 来为 GTK+ 应用添加扩展语言 Scheme(4)

编译测试我们可以根据上面的Makefile文件再写一个用到GTK+库的Makefile来编译我们的应用,这个Makefile的内容如下:
1
2
3
4
5
6
7
8
9
10
    CC = gcc
GTK2_CFLAGS = `pkg-config --cflags gtk+-2.0`
GTK2_LIBS = `pkg-config --libs gtk+-2.0`
GUILE_CFLAGS = `guile-config compile`
GUILE_LIBS = `guile-config link`
all:
    $(CC) $(GTK2_CFLAGS) $(GUILE_CFLAGS) -c brush.c
    $(CC) $(GTK2_LIBS) $(GUILE_LIBS) -o brush brush.o
clean:
    rm *.o brush test.png *~ -fr




当我们编译成功后,就可以编写一个简单的绘图文件来测试一下了,如我们在绘图文件test.scm中只写一行:(_line 100 100 300 300),保存后,在我们的应用中运行一下,应该在绘图板上出现一条斜线,OK,成功了。
下面代码测试了一下弧线、弧线的添充和旋转:
1
2
3
4
5
6
7
8
9
10
;;;设定前景为蓝色
(_color 0 0 65535)
;;; 宽高均为 100 的 270 度的弧,旋转0度
(_arc 80 100 100 100 0 (* 64 270) #f)
;;; 同上,添充效果
(_arc 200 100 100 100 0 (* 64 270) #t)
;;; 宽高均为 100 的270度的弧,旋转90度
(_arc 320 100 100 100 (* 64 90) (* 64 270) #f)
;;; 同上,添充效果
(_arc 440 100 100 100 (* 64 90) (* 64 270) #t)




测试效果如下图所示:
还可以用(_polygon (list (cons 100 150) (cons 100 200) (cons 200 200)) 3 #f)来画一个三角形,自己试一试吧!
封装与扩展我们定义的六个原始过程用起来比较繁琐,但只要对它们进行简单的封装,就可以实现新的过程,来提高它们的易用性。
1、对颜色的封装我们的应用中提供了简单的RGB前景颜色设定过程_color,此过程需要三个参数,分别代表RGB的三个颜色值,下面代码对这个过程进行了简单的封装:
1
2
3
4
5
6
7
8
9
10
11
12
       ;;;set the front color
(define set-color
  (lambda (color)
    (case color
      ((white) (_color 65535 65535 65535))
      ((black) (_color 0 0 0))
      ((red) (_color 65535 0 0))
      ((green) (_color 0 65535 0))
      ((blue) (_color 0 0 65535))
      ;;;如果你知道更多的RGB颜色值请在此处按上面规则扩展
      (else
       (display "Error : color not defined!\n")))))




如此,我们只要用set-color过程中加一个颜色名做参数就可以了,如(set-color 'black)。
2、设定背景颜色我们的应用中只提供了设定前景颜色的过程,由于背景和前景是相对的,完全可以用设定前景颜色功能来实现设定背景颜色过程,就是设定前景颜色后,用添充矩形过程来实现,如果此矩形的宽高为画板的默认的宽高,就实现了整个画板的背景颜色设定。如下面代码所示(注意,这样处理后前景和背景颜色都一样了,再绘图时一定要先改一下前景颜色):
1
2
3
4
5
        (define set-back-color
(lambda (red green blue)
    (begin
        (_color red green blue)
        (_rectangle 0 0 600 400 #t))))




3、丰富画点功能下面代码是对画点过程的一系列封装,实现了point,draw-point,draw-dot-hline,draw-color-dot-hline四种功能,相信读者会封装出更优秀的功能来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
;;;画点 100 100
(_point 100 100)
;;;画点 150, 150
(define point _point)
(point 150 150)
;;;画点 125, 125
(define draw-point _point)
(draw-point 125 125)
;;;画点状横线,从x,y开始,宽度为width,每隔5点画一点
(define draw-dot-hline
  (lambda (x y width)
    (let ((a x) (b (+ x width)))
      (while (< a b)
         (_point a y)
         (set! a (+ a 5))))))
;;;测试
(draw-dot-hline 30 30 150)
;;;画带颜色的虚线,颜色为color,从x,y开始,宽度为width
(define draw-color-dot-hline
  (lambda (color x y width)
    (begin
      (set-color color)
      (draw-dot-hline x y width)
      (set-color 'black))))
;;;测试
(draw-color-dot-hline 'blue 50 50 200)




4、画圆形和添充圆形过程画圆形过程可以用画弧线过程来实现,毕竟圆形是一条封闭的弧线。只要设定弧线的宽高相等,不旋转(旋转也没有效果),并且度数为360度(应该是64x360,因为这里的单位是64分之一度),就是一个圆了。代码如下:
1
2
3
4
5
6
7
8
        ;;;draw a circle
(define draw-circle
    (lambda (x y d)
        (_arc x y d d 0 (* 64 360) #f)))
;;;fill a circle
(define fill-circle
    (lambda (x y d)
        (_arc x y d d 0 (* 64 360) #t)))




5、实现项目列表项目列表,即先画一个圆形或矩形,然后再输出一串字符串,同时还可以设定项目标号的颜色,这一功能可由下面的代码实现:
1
2
3
4
5
6
7
8
9
(define item
  (lambda (x y color str)
    (begin
      (set-color color)
      (fill-rect x y 10 10)
      (set-color 'black)
      (draw-string (+ x 12) y str))))
;;;test
(item 250 300 'black "A.com")




以上几项只是基础功能的封装,还有画正方形,正三角形,菱形等等常用图形功能尚未实现。我们可以将这些函数统一做一个文件,在起动此应用时就调用这一文件,这样我们就可以在新的绘图文件中调用这些功能了。(详细内容见源码包中的src/brush.scm文件,如果你想实现上面的功能,请将它写入这个文件中去)
事实上我们的结构原理示意图就是用绘图代码做出来的。你发现用Guile为GTK+应用做扩展语言的功能强大了吧:-),由于笔者条件所限,没能将此软件在开源网站上发布(这正是笔者所想要的),如果那位朋友愿意帮这个忙的话,将不胜感激,当然,还望对图形或CAD感兴趣的朋友多加指点。
返回列表