我想通过继承DrawingArea Widget实现自定义小部件,为此我需要使用cairo进行绘制。似乎在gtk3中引入了一个名为“draw”的新信号。如何在小部件内绘制?地图和实现信号是否应该被忽略?如何绘制子类DrawingArea小部件?
一个简单的示例代码将非常有帮助。谢谢。
我想通过继承DrawingArea Widget实现自定义小部件,为此我需要使用cairo进行绘制。似乎在gtk3中引入了一个名为“draw”的新信号。如何在小部件内绘制?地图和实现信号是否应该被忽略?如何绘制子类DrawingArea小部件?
一个简单的示例代码将非常有帮助。谢谢。
简单地说,你需要重写,这将提供一个开罗背景下平局信号:
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 +自定义窗口小部件的例子。