呵呵,其实说这个是个自定义控件也不为过。
先介绍一下 Cairo:Cairo 是一套提供设备独立的矢量图形 API
的二维图形库,支持很多不同的后端,如果可能的话,还可以使用硬件加速绘图。Cairo
是用 C 语言编写的,但是提供了很多其他语言的绑定,Factor, Haskell, Lua,
Perl, Python, Ruby, Scheme, Smalltalk 等等。Cairo 基于 LGPL 和 MPL
双许可,这意味着你可以用它开发闭源软件。Cairo 是自由软件。
关于 Cairo 的更多详情,可以参照
维基百科 。
Cairo 的使用方法很简单,跟中学时学习的 LOGO 语言差不多,这里用 GTK+
编写一个时钟出来。
首先,建立一个窗口。GTK+ 提供了一个专门用来画图的控件
DrawingArea,我们继承它,建立一个类
CairoDrwa,并且把一个对象加到窗口上去。虽然 GTK+
本身提供了不少绘图功能,不过这里只说 Cairo。
然后,连接事件。把这个类的 expose-event 连接到一个回调函数 on_expose
上去,expose-event 是一个“曝光”事件,在控件被显示的时候会触发此事件。
下面来写 on_expose 函数。首先我们要取得我们的 Cairo
Context(可以理解为“画板”),这个画板是从 DrawingArea 中的 GdkWindow
中取得的。
我们需要设定 DrawingArea 的刷新区域。这样以后每次触发 expose-event
的时候,都会重绘这个区域。
我们把绘图的部分写在 draw
这个函数中,然后让控件每秒钟重绘一次。这样每秒时间改变的时候,图形就会刷新,指针就会动了。
下面来写 draw 这个函数。
首先来画表盘,也就是一个圆。我们用 arc
函数来画一个弧线,这个弧线的角度从 0 到 2 *
pi,也就是一个圆了。注意,这时候我们还没有上色,所以画板依然是空的。使用
set_source_rgb 来设定画笔颜色,fill_preserve 和 stroke
分别用于填充和描边。
接下来画刻度。很简单的算法,值得注意的是 save 和 restore
两个函数,这是一种类似堆栈的保存 Context
状态的方法,这样对线的长度修改之后,很容易就可以恢复过来。
最后,对指针进行绘制。和表盘差不多的算法。 :
这样,一个简单的时钟程序就做好了。
源代码在这里 。
参考: Writing a Widget Using Cairo and PyGTK
2.8
PS:晕,写完了才发现这篇文章还有
下半部分
……