gpt4 book ai didi

多个小部件的 C/GTK+3 绘制事件

转载 作者:行者123 更新时间:2023-12-02 05:39:09 26 4
gpt4 key购买 nike

我目前正在尝试使用 C 来学习 GTK+3/cairo。我编写了一个小型应用程序,它使用 cairo 在 gtk 绘图区域上绘制了一个仪表面和指针。

到目前为止效果很好,我已经尝试创建多个绘图区域(多个仪表)都具有相同的绘制事件回调函数,这也适用于静态值。

现在我的问题是,我希望能够绘制多个仪表,每个仪表都有自己的值。但是我怎么知道我的回调函数中哪个仪表(绘图区域)发出了绘图信号?我想这还包括我如何为仪表“创建和存储”数据,以便可以从绘制回调中获取它们的属性。

我可能应该创建一个结构来保存仪表的数据,并创建多个这样的结构。这是我通过查看使用 GTK 的各种项目收集到的信息,但它太复杂了,我无法完全理解它是如何工作的。

这就是我创建绘图区域的方式:

gaugearea1 = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(hbox), gaugearea1, FALSE, FALSE, 5);
gtk_widget_set_size_request(gaugearea1, 300, 300);
gtk_widget_realize(gaugearea1);
g_signal_connect(gaugearea1, "draw", G_CALLBACK(draw_event), NULL);

而且回调函数是这样写的,很标准。

static gboolean draw_event(GtkWidget *widget, cairo_t *cr)
{
GdkWindow *win;
win = gtk_widget_get_window(widget);

// Draw all arcs/lines using cr
}

任何有关如何处理此类问题的提示都将不胜感激。

最佳答案

发出信号的 GtkDrawingArea 只是您在回调中收到的 widget。如果需要,只需将其转换为适当的类型即可。

但请仔细查看来自 draw 信号的文档:

“绘制”信号

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

您的 draw_event 函数缺少最后一个参数,gpointer user_data

这就是调用 g_signal_connect() 的最后一个 NULL 参数的使用。因此,您可以在此处放置一个指向包含您需要的所有数据的结构的指针。

或者您可以使用 g_object_set_data() 函数将指针附加到小部件,但我不建议对这样一个简单的应用程序这样做。

如果你有固定数量的仪表,一切都很好:只需创建相同数量的结构,但如果你的仪表数量是动态的,你必须在头部创建结构,所以出现了一个新问题:当你免费的数据?答案在 g_signal_connect_data() 中:此函数接收一个额外的回调,该回调在不再需要该结构时调用。

类似下面的内容:

struct GaugeData
{
/* your data here */
};
static void gauge_data_free(gpointer ptr, GClosure *clo)
{
struct GaugeData *data = ptr;
/* free extra resources, if needed */
g_free(data);
}
static gboolean draw_event(GtkWidget *widget, cairo_t *cr, gpointer ptr)
{
struct GaugeData *data = ptr;

// Draw all arcs/lines using cr and data
}

void CreateOneGauge()
{
gaugearea1 = gtk_drawing_area_new();
struct GaugeData *data = g_new(GaugeData, 1);
/* init the data */

/* ... */
g_signal_connect_data(gaugearea1, "draw", G_CALLBACK(draw_event),
data, gauge_data_free, 0);
}

关于多个小部件的 C/GTK+3 绘制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11268637/

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