开罗在绘图区

时间:2016-01-12 12:17:06

标签: c gtk drawing cairo

我正在努力了解开罗的框架;但我不知道如何在绘图区域放置多个形状。我见过的所有代码/教程要么太高级,要么与此问题无关。

这是我绘制圆圈的代码(我使用的是C和gtk + 3.0):

void draw(GtkWidget *this, cairo_t *cr, gpointer data) {

  cairo_set_line_width(cr, 5);
  cairo_set_source_rgb(cr, 0, 0, 0);

  cairo_translate(cr, prog.width/2, prog.height/2);
  cairo_arc(cr, 0, 0, 50, 0, 2 * M_PI);
  cairo_stroke_preserve(cr);

  cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);

  cairo_fill(cr);

}

我完全理解一件事:cairo_t *cr。从我一直在寻找的cr是一个上下文,但没有完全理解它的含义(也许我的问题在于这个理解?)。

所以,如果我在这个附近需要更多圈子,我怎么能创建它们呢?

我尝试使用cairo_move_to(cr, x, y)并绘制另一种形状,但显然它不起作用。

谢谢!

1 个答案:

答案 0 :(得分:2)

是的,cairo_t是cairo上下文的类型。

要在cairo上绘图,可以设置绘图参数,定义绘制颜色或图像的,以及指定绘制形状的路径,然后致电cairo_stroke()cairo_fill()进行实际绘图。调用之后,路径将被重置(除非您使用函数的_preserve版本),但其他所有内容都保持不变。

因此,要再次绘制,您只需要在第一个之后添加更多设置和绘图函数调用。

cairo_move_to()实际上并没有移动任何东西。 cairo_move_to()所做的是改变"当前点的位置"的路径。稍后添加的路径组件(例如cairo_line_to())将从当前点开始,然后将当前点设置为其结束点。

在您的情况下,您可以通过在绘制处理程序的最后一行之后添加cairo_move_to()来绘制多个圆,然后重复用于绘制第一个圆的步骤。

cairo_arc()不同,因为您将弧的中心指定为第二个和第三个参数。要在其他地方绘制弧,您需要更改这两个参数。 (当前点确实在cairo_arc()中发挥作用;您需要查看文档以获取信息。)

The cairo documentation是开始学习开罗的最佳地点;它有很多教程和样本。