我想通过继承DrawingArea Widget来实现自定义小部件,为此我需要使用cairo进行绘制。似乎在gtk3中有一个叫做' draw'的新信号。介绍。如何在窗口小部件内绘制?地图和实现信号是否也会被覆盖?
一个简单的示例代码将非常有用。感谢。
答案 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 +自定义小部件的例子。