如何绘制子类DrawingArea小部件?

时间:2017-07-16 18:36:03

标签: gtk gtk3 cairo

我想通过继承DrawingArea Widget来实现自定义小部件,为此我需要使用cairo进行绘制。似乎在gtk3中有一个叫做' draw'的新信号。介绍。如何在窗口小部件内绘制?地图和实现信号是否也会被覆盖?

一个简单的示例代码将非常有用。感谢。

1 个答案:

答案 0 :(得分:4)

简而言之,您需要覆盖提供开罗背景的绘制信号:

gboolean
user_function (GtkWidget    *widget,
               CairoContext *cr,
               gpointer      user_data)

然后你可以使用CairoContext cr来绘制小部件的实际内容。

来自C API:

  

GtkDrawingArea小部件用于创建自定义用户界面   元素。它本质上是一个空白的小部件;你可以借鉴它。后   创建绘图区域,应用程序可能想要连接到:

     

鼠标和按钮按下信号以响应用户的输入。 (使用   gtk_widget_add_events()以启用您希望接收的事件。)

     
      
  • 当在特定显示器上实例化窗口小部件时,“实现”信号采取任何必要的操作。 (在中创建GDK资源)   回应这个信号。)

  •   
  • 当小部件改变大小时,“size-allocate”信号可以采取任何必要的操作。

  •   
  • “绘制”信号,用于处理重绘窗口小部件的内容。

  •   

窗口小部件应该在窗口小部件更改时对某些绘制进行排队,例如,在大小分配时,您应该使用gtk_widget_queue_draw强制窗口小部件再次绘制它。

示例 - 使用绘图区域不作为子类,但概念仍然存在: (取自Gnome C API

gboolean
draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data)
{
  guint width, height;
  GdkRGBA color;
  GtkStyleContext *context;

  context = gtk_widget_get_style_context (widget);

  width = gtk_widget_get_allocated_width (widget);
  height = gtk_widget_get_allocated_height (widget);

  gtk_render_background (context, cr, 0, 0, width, height);

  cairo_arc (cr,
             width / 2.0, height / 2.0,
             MIN (width, height) / 2.0,
             0, 2 * G_PI);

  gtk_style_context_get_color (context,
                               gtk_style_context_get_state (context),
                               &color);
  gdk_cairo_set_source_rgba (cr, &color);

  cairo_fill (cr);

 return FALSE;
}
[...]
  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_set_size_request (drawing_area, 100, 100);
  g_signal_connect (G_OBJECT (drawing_area), "draw",
                    G_CALLBACK (draw_callback), NULL);

您还应该阅读GtkWidget

中有关宽度高度几何管理的内容

我使用过C,因为在您的问题上没有引用编程语言,同时它也是原始API,其中所有其他语言都是用来编写的。

有一些关于在互联网上创建Gtk +自定义小部件的例子。