C gtk初学者应用程序赢得';不能使用断言失败
我在Gtk中做了这个简单的应用,只是为了测试一下。。。我来自swing,所以重新定义draw事件函数对我来说很正常。。。无论如何,这似乎不起作用:C gtk初学者应用程序赢得';不能使用断言失败,c,gtk,C,Gtk,我在Gtk中做了这个简单的应用,只是为了测试一下。。。我来自swing,所以重新定义draw事件函数对我来说很正常。。。无论如何,这似乎不起作用: #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk-pixbuf/gdk-pixbuf.h> #include <stdlib.h> #include<string.h> #include<stdio.h> #include <iost
#include <gtk-2.0/gtk/gtk.h>
#include <gtk-2.0/gdk-pixbuf/gdk-pixbuf.h>
#include <stdlib.h>
#include<string.h>
#include<stdio.h>
#include <iostream>
GdkPixbuf *imm;
void destroy(GtkWidget *widget, gpointer data) {
gtk_main_quit();
}
gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event,
gpointer data) {
gdk_draw_pixbuf((GdkDrawable*) widget, widget->style->white_gc, imm, 0, 0,
0, 0, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
return FALSE;
}
int main(int argc, char** argv) {
char* filename = new char[1000];
GError *error = NULL;
GtkWidget *window;
gtk_set_locale();
gtk_init(&argc, &argv);
if (argv[1] == NULL) {
std::cout << "Err.";
return -1;
}
strcpy(filename, argv[1]);
imm = gdk_pixbuf_new_from_file(filename, &error);
if (!imm) {
std::cout << "err closing";
return 0;
}
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request((GtkWidget*) window, 500, 350);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
g_signal_connect(window, "expose-event",
G_CALLBACK(on_expose_event), NULL);
gtk_container_set_border_width(GTK_CONTAINER (window), 10);
gtk_widget_show(window);
gtk_main();
return 0;
}
是因为pixbuf不好吗???还是因为我不能像这样画到窗口?这是因为您将
GtkWidget
转换为GdkDrawable
,而GtkWidget
不是从GdkDrawable
继承的。使用
gdk_draw_pixbuf(GDK_DRAWABLE(gtk_widget_get_window(widget)), blah blah...);
无论如何,在正常的GTK使用中,您不必在expose处理程序中进行任何绘制。要显示图像,只需使用GtkImage
小部件:
GtkImage *image = gtk_image_new_from_file(filename);
gtk_container_add(GTK_CONTAINER(window), image);
小部件不可GdkDrawable,您需要从小部件的窗口获取可绘制的内容。谢谢。但我的目的是尝试在窗户背景上画画。。。不管怎样,即使我再也得不到资产,它也不起作用:
gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event,
gpointer data) {
int w, h;
w = gdk_pixbuf_get_width(imm);
h = gdk_pixbuf_get_height(imm);
gdk_draw_pixbuf((GdkDrawable*) widget->window, widget->style->fg_gc[ GTK_STATE_NORMAL ], imm, 0, 0,
0, 0, w, h, GDK_RGB_DITHER_NORMAL, 0, 0);
return FALSE;
}
尝试
gtk\u widget\u set\u app\u paintable()
?
gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event,
gpointer data) {
int w, h;
w = gdk_pixbuf_get_width(imm);
h = gdk_pixbuf_get_height(imm);
gdk_draw_pixbuf((GdkDrawable*) widget->window, widget->style->fg_gc[ GTK_STATE_NORMAL ], imm, 0, 0,
0, 0, w, h, GDK_RGB_DITHER_NORMAL, 0, 0);
return FALSE;
}