2017-07-16 75 views
3

我想通过继承DrawingArea Widget实现自定义小部件,为此我需要使用cairo进行绘制。似乎在gtk3中引入了一个名为“draw”的新信号。如何在小部件内绘制?地图和实现信号是否应该被忽略?如何绘制子类DrawingArea小部件?

一个简单的示例代码将非常有帮助。谢谢。

回答

4

简单地说,你需要重写,这将提供一个开罗背景下平局信号:

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

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

从C API:

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

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

  • 的“实现”信号时,小部件是特定的显示器上实例采取任何必要的行动。 (创建GDK资源 响应此信号。)

  • “大小分配”信号在小部件更改大小时采取任何必要的操作。

  • “draw”信号来处理重画小部件的内容。

小部件应排队一些借鉴当小部件的变化,例如,在大小分配,你应该使用gtk_widget_queue_draw迫使小部件itsef再次战平。

示例 - 使用绘制区域而不是分分级,但这个概念仍然是: (从Gnome C API拍摄)在GtkWidget

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); 

你也应该阅读有关身高换宽度几何管理

我已经使用了C语言,因为在你的问题中没有提及编程语言,同时它是所有其他编写语言的原始API。

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