如何在子类化的绘图区域小部件中绘制?



我想通过子类化绘图区域小部件来实现自定义小部件,为此我需要使用开罗绘制。似乎在 gtk3 中引入了一个名为"draw"的新信号。如何在小部件内绘制?地图和实现信号是否也应该被覆盖?

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

简单地说,你需要覆盖将提供开罗上下文的绘制信号:

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

然后,您可以使用 CairoContextcr绘制微件的实际内容。

从 C API:

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

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

  • "实现"信号,用于在特定显示器上实例化小部件时采取任何必要的操作。(在 中创建 GDK 资源 对此信号的响应。

  • "大小分配"信号,用于在小部件更改大小时采取任何必要的操作。

  • 用于处理重绘小部件内容的"draw"信号。

当小部件更改时,小部件应该对一些绘制进行排队,例如,在大小分配时,您应该使用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+ 自定义小部件的示例。

最新更新