gpt4 book ai didi

gtk - 如何在子类 DrawingArea 小部件中绘制?

转载 作者:行者123 更新时间:2023-12-04 20:51:58 32 4
gpt4 key购买 nike

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

一个简单的示例代码会很有帮助。谢谢。

最佳答案

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

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

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

来自 C API:

The GtkDrawingArea widget is used for creating custom user interface elements. It’s essentially a blank widget; you can draw on it. After creating a drawing area, the application may want to connect to:

Mouse and button press signals to respond to input from the user. (Use gtk_widget_add_events() to enable events you wish to receive.)

  • The “realize” signal to take any necessary actions when the widget is instantiated on a particular display. (Create GDK resources in response to this signal.)

  • The “size-allocate” signal to take any necessary actions when the widget changes size.

  • The “draw” signal to handle redrawing the contents of the widget.

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

关于gtk - 如何在子类 DrawingArea 小部件中绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132099/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com