用Cairo在GTK+上绘图

400 篇文章 3 订阅
147 篇文章 0 订阅

Cairo是跨平台的2D图形库,支持多种后端,支持输出PostScript、PDF和SVG等。 比较有名的例子是,从GTK+2.8开始,GTK+使用Cairo进行图形绘制,另外一个就是Mozilla Firefox,据说在1.5、2.0时代只使用了Cairo绘制SVG图形,到了3.0时代,Firefox使用Cairo来绘制一切! 所以我要实现更加自定义的图形效果,我就要用到Cairo来画画了。 Cairo有Python的语言绑定,这下就方便使用了。只要import cairo就可以了。 我的目标是,用Cairo绘制一个圆角矩形的背景,然后在中间显示一行字,作为选项的大标题。 看了点例子然后就开始乱写一气,总算是给我写出来了。 以前从未用程序语言来画过画,这次用Cairo来画画感觉有点像用那个什么LOGO语言画画(估计现在很少人听说过LOGO语言了)。 为了自动根据系统的字体大小和配色生成相应的标题,我不能硬画,而要设计一个算法来自动画出合乎当前主题的标题,这就伤脑筋了。自从高中毕业后,就再也没有对付过X,Y之类的坐标了,试了很多公式终于实现了一个比较好看的样式。 如图: 默认的Tango主题的效果 大号字体的效果 Human主题的效果 Darklooks主题的效果 绘制的原理主要是,创建一个gtk.DrawingArea,然后通过关联的GdkWindow来创建Cairo上下文(用 window.cairo_create()方法),而具体的绘图的代码主要是move_to,line_to之类的,Cairo还能绘制渐变效果,因为不要这么复杂,我只是简单的填充一下。最后在计算出来的坐标show_text即可。 另外一个主要的就是通过widget.get_style()来取得当前主题的配色,所以可以动态的适应当前主题。因为每个用户的主题效果是不是同,我不能把配色信息给写死了,这样就难看了。 具体的代码就不贴了,等下个Ubuntu Tweak发布时就可以看到了。 ----- 通过实现这个我又进一步了解了GTK+的机制,也能通过Cairo来实现标准Widget不能实现的界面了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是在Linux环境下使用Cairo库在一个窗口上画一条线的示例代码: ```c #include <cairo.h> #include <gtk/gtk.h> static void draw(cairo_t *cr, gpointer data) { cairo_set_line_width(cr, 2.0); cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_move_to(cr, 50.0, 50.0); cairo_line_to(cr, 200.0, 200.0); cairo_stroke(cr); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *drawing_area; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); drawing_area = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(window), drawing_area); g_signal_connect(drawing_area, "draw", G_CALLBACK(draw), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 这段代码创建了一个名为window的GTK窗口,并在窗口中创建了一个名为drawing_area的绘图区域。在draw函数中,我们使用Cairo库的函数来设置线宽、颜色,然后移动画笔到起始点(50,50),画一条到终点(200,200)的线,并用cairo_stroke函数将线条显示在绘图区域上。最后,我们使用GTK的信号和回调机制,将draw函数连接到drawing_area的draw信号上,这样当绘图区域需要被绘制时,draw函数就会被调用。 注意:在编译此代码时,需要链接CairoGTK库。可以使用以下命令进行编译: ```shell gcc -o line line.c `pkg-config --cflags --libs gtk+-3.0 cairo` ``` 其中,`pkg-config --cflags --libs gtk+-3.0 cairo`用于获取GTKCairo库的编译选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值