我试图在绘图区域上绘制图像而没有运气。我看到了几个python示例,但我无法将它们实现为c,我正在使用它(例如draw an image to gtk.DrawingArea?)
我已经创建了一个Pixbuf变量来存储我想要在绘图区域绘制的图像,但是没有像gtk_drawing_area_draw_pixbuf这样的函数或与此相关的东西。感谢任何建议。
答案 0 :(得分:8)
您需要使用expose-event
回调(假设您正在使用Gtk + 2.0)将pixbuf绘制到绘图区域。没有gtk_drawing_area_draw_pixbuf
而是gdk_draw_pixbuf
。从版本2.22开始,这已被弃用,有利于gdk_cairo_set_source_pixbuf
。您可以在这些行中的expose事件回调中调用这些函数(请仅将它们用作参考):
如果你的Gtk版本是< 2.22
static gboolean
da_expose (GtkWidget *da, GdkEvent *event, gpointer data)
{
(void)event; (void)data;
GdkPixbuf *pix;
GError *err = NULL;
/* Create pixbuf */
pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
if(err)
{
printf("Error : %s\n", err->message);
g_error_free(err);
return FALSE;
}
GdkDrawable *draw = gtk_widget_get_window(da);
/* Draw pixbuf */
gdk_draw_pixbuf(draw, NULL, pix, 0, 0, 0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
return FALSE;
}
2.22版以后,您必须在这些方面使用cairo
内容:
static gboolean
da_expose (GtkWidget *da, GdkEvent *event, gpointer data)
{
(void)event; (void)data;
GdkPixbuf *pix;
GError *err = NULL;
/* Create pixbuf */
pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
if(err)
{
printf("Error : %s\n", err->message);
g_error_free(err);
return FALSE;
}
cairo_t *cr;
cr = gdk_cairo_create (da->window);
gdk_cairo_set_source_pixbuf(cr, pix, 0, 0);
cairo_paint(cr);
cairo_fill (cr);
cairo_destroy (cr);
return FALSE;
}
当然,您可以使用g_signal_connect
(例如g_signal_connect (da, "expose-event", G_CALLBACK (da_expose), NULL);
)连接到回调。如果您使用的是Gtk + 3.0,那么您将使用draw
代替expose-event
。您始终可以参考gtk-demo
/ gtk3-demo
应用程序,这些应用程序可以查看示例以及代码。这应该在您的发行版的软件包存储库中可用,或者您始终可以从源代码获取它
希望这有帮助!
PS:This link可能会为您提供一些指示
答案 1 :(得分:6)
现在GTK版本是GTK + 3.0。 如果您使用的是GTK + 3.0,请按以下步骤使用。
// gcc expose.c -o expose `pkg-config gtk+-3.0 --cflags --libs`
#include <gtk/gtk.h>
#include <stdlib.h>
static gboolean
on_window_draw (GtkWidget *da, GdkEvent *event, gpointer data)
{
(void)event; (void)data;
GdkPixbuf *pix;
GError *err = NULL;
/* Create pixbuf */
pix = gdk_pixbuf_new_from_file("/usr/share/icons/cab_view.png", &err);
if(err)
{
printf("Error : %s\n", err->message);
g_error_free(err);
return FALSE;
}
cairo_t *cr;
cr = gdk_cairo_create (gtk_widget_get_window(da));
// cr = gdk_cairo_create (da->window);
gdk_cairo_set_source_pixbuf(cr, pix, 0, 0);
cairo_paint(cr);
// cairo_fill (cr);
cairo_destroy (cr);
// return FALSE;
}
int main ( int argc, char **argv) {
GtkWidget *window;
GtkWidget *canvas;
gtk_init (&argc , &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request (window,
50, 50);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_main_quit) , NULL);
canvas = gtk_drawing_area_new ();
gtk_container_add (GTK_CONTAINER (window), canvas);
g_signal_connect (canvas, "draw", (GCallback) on_window_draw, NULL);
gtk_widget_set_app_paintable(canvas, TRUE);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}