gpt4 book ai didi

GtkDrawingArea - 如何使其可绘制?

转载 作者:行者123 更新时间:2023-12-04 22:34:56 29 4
gpt4 key购买 nike

我在这里有点发疯了。

我正在尝试使用 cairo 在我的 GTK 表单上绘制一些简单的图形。

#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>

GtkWidget* window;
GtkWidget* darea;


int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);

darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);

cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);


gtk_widget_show_all(window);

gtk_main();

return 0;
}

这编译,但给了我

Gdk-CRITICAL **: IA__gdk_cairo_create: assertion `GDK_IS_DRAWABLE (drawable)' failed



其次是段错误。

我一直在看 tutorial here

所以我改变了我的代码如下,使 cairo 调用发生在暴露事件中。
    #include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>

GtkWidget* window;
GtkWidget* darea;

static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);

}

int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);

darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);

g_signal_connect(darea, "expose-event",
G_CALLBACK(on_expose_event), NULL);


gtk_widget_show_all(window);

gtk_main();

return 0;
}

为什么要解决这个问题?
我的理解是:暴露是:

g_signal_connect(darea, "expose-event", G_GCALLBACK(on_expose_event), NULL); 

告诉程序,'当一个暴露事件发生在darea 上时,然后调用on_expose_event'。 null 是您可以传入指向要使用的函数的附加信息结构的指针的位置。


    static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{

意味着 on_expose_event 被传递一个指向发生事件的小部件的指针,在这种情况下,因为它是一个公开事件,一个指向包含有关公开事件的信息的结构的指针,以及一个指向您可能喜欢的任何其他信息的结构的指针加上。

最佳答案

使用 Cairo 在小部件上绘图仅适用于公开事件。那是因为开罗不像矢量绘图程序,其中线条和形状是可以记住并可以操作的对象; Cairo 只是将形状绘制到绘图区域并忘记它们。

因此,当您最小化和恢复窗口,或将另一个窗口移到其上方时,形状就会消失。生成一个公开事件,让您知道形状已经消失并且需要重新绘制小部件。因此,您可以在公开事件处理程序中使用 Cairo 进行重绘。

关于GtkDrawingArea - 如何使其可绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395111/

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