LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 995|回复: 5

奇怪的错误(gc = gdk_gc_new(mainwin->window))

[复制链接]
发表于 2005-4-4 14:25:17 | 显示全部楼层 |阅读模式
程序如下:
GtkWidget *mainwin;
......
......
gc = gdk_gc_new(mainwin->window);
......
......

编译正常
运行报错:
** CRITICAL **: file gdkgc.c: line 25 (gdk_gc_new_with_values): assertion `window != NULL' failed.

奇怪!!!

不知怎么解决,在线等待,谢谢
发表于 2005-4-4 15:07:59 | 显示全部楼层
代码请贴全。
这个错谁知道。
"assertion `window != NULL' failed."
好象是说你的gdk_gc_new(mainwin->window)用了一个是NULL的Drawable,即mainwin->window为NULL。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-4 15:11:18 | 显示全部楼层
是呀,我就很奇怪为什么会是空呢
下面的是代码:
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
        GtkWidget *mainwin;
        GtkWidget *button;
        GdkPixmap *pixmap;
        GdkWindow *gdkwindow = NULL;
        //GdkBitmap *mask;
        GdkGC *gc;
        gchar *pic_name = "/work/public/pic/shuye.xpm";

        gtk_init(&argc, &argv);

        //gtk_rc_parse("dd_rc");

        mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(mainwin), "图片按钮");
        gtk_window_set_default_size(GTK_WINDOW(mainwin), 400, 300);
        gtk_window_set_position(GTK_WINDOW(mainwin), GTK_WIN_POS_CENTER);

        button = gtk_button_new_with_label("hello");
        gtk_container_add(GTK_CONTAINER(mainwin), button);
        gtk_widget_show(button);

        pixmap = gdk_pixmap_create_from_xpm(mainwin->window, NULL, NULL, pic_name);

        gdkwindow = mainwin->window;

        if(mainwin == NULL)
                g_print("mainwin is null");

        if(gdkwindow == NULL)
                g_print("NULL");

        gc = gdk_gc_new(mainwin->window);

        gdk_draw_pixmap(mainwin->window, gc, pixmap, 0, 0, 0, 0, 300, 200);

        gtk_widget_show(mainwin);

        gtk_main();

        return 0;
}
回复 支持 反对

使用道具 举报

发表于 2005-4-4 20:07:26 | 显示全部楼层
gtk faq提到过,在窗口还没显示前,空窗口不可用。
解决办法是 将gtk_widget_show(mainwin);放到 gtk_window_set_position(GTK_WINDOW(mainwin),
GTK_WIN_POS_CENTER);前,即创建完窗口就显示它。
或者使用 gdk_pixmap_colormap_create_from_xpm来创建pixmap
或者将gtk_widget_realize(mainwin);放到 gtk_window_set_position(GTK_WINDOW(mainwin),
GTK_WIN_POS_CENTER);前。
回复 支持 反对

使用道具 举报

发表于 2005-4-4 20:48:43 | 显示全部楼层

这样

再说了,你界面上一个大Button。你的图也看不到呀。而且,如果你不在DraingArea里画图,你是看不到图的。因为mainwin的默认expose处理会覆盖你的图。


  1. #include <gtk/gtk.h>

  2. static void destroy( GtkWidget *widget,
  3.                      gpointer   data )
  4. {
  5.     gtk_main_quit ();
  6. }

  7. static gboolean
  8. on_expose (GtkWidget            *da,
  9.                      GdkEventExpose *event,
  10.                      gpointer             data)
  11. {
  12.     GdkGC *gc;
  13.     GdkPixmap *pixmap = NULL;
  14.     gchar *pic_name = "/work/public/pic/shuye.xpm";
  15.     pixmap = gdk_pixmap_create_from_xpm(da->window, NULL, NULL, pic_name);

  16.     gdk_draw_pixmap(da->window, da->style->black_gc, pixmap, 0, 0, 1, 1, 300, 200);

  17.     gdk_draw_rectangle(da->window,
  18.                       da->style->black_gc,
  19.                       FALSE,
  20.                       0, 0,
  21.                       100, 99 );

  22.     gdk_pixmap_unref(pixmap);
  23. }

  24. int main(int argc, char *argv[])
  25. {
  26.     GtkWidget *mainwin;
  27.     GtkWidget *vbox, *da;
  28.     GtkWidget *button;
  29.     GdkPixmap *pixmap;
  30.     GdkWindow *gdkwindow = NULL;
  31.     //GdkBitmap *mask;
  32.     GdkGC *gc;
  33.     gchar *pic_name = "/work/public/pic/shuye.xpm";

  34.     gtk_init(&argc, &argv);

  35.     //gtk_rc_parse("dd_rc");

  36.     mainwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);

  37.     g_signal_connect(G_OBJECT(mainwin), "destroy",
  38.                      G_CALLBACK(destroy), NULL);

  39.     gtk_window_set_title(GTK_WINDOW(mainwin), "图片按钮");
  40.     gtk_window_set_default_size(GTK_WINDOW(mainwin), 400, 300);
  41.     gtk_window_set_position(GTK_WINDOW(mainwin), GTK_WIN_POS_CENTER);

  42.     vbox = gtk_vbox_new (FALSE, 8);
  43.     gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
  44.     gtk_container_add( GTK_CONTAINER(mainwin), vbox );

  45.     da = gtk_drawing_area_new();
  46.     gtk_widget_set_size_request(da, 100, 100);
  47.     gtk_box_pack_start(GTK_BOX(vbox), da, FALSE, FALSE, 0 );

  48.     button = gtk_button_new_with_label("hello - click me to exit");
  49.     gtk_box_pack_start( GTK_BOX(vbox), button, TRUE, TRUE, 0 );
  50.     g_signal_connect_swapped( G_OBJECT(button), "clicked",
  51.                               G_CALLBACK(gtk_widget_destroy),
  52.                               G_OBJECT(mainwin) );

  53.     g_signal_connect( da, "expose_event",
  54.                         G_CALLBACK(on_expose), NULL );

  55.     gtk_widget_show_all( mainwin );

  56.     //pixmap = gdk_pixmap_create_from_xpm(mainwin->window, NULL, NULL, pic_name);

  57.     gdkwindow = mainwin->window;

  58.     if(mainwin == NULL)
  59.         g_print("mainwin is null");

  60.     if(gdkwindow == NULL)
  61.         g_print("NULL");

  62.     //gc = gdk_gc_new(mainwin->window);
  63.     //gdk_draw_pixmap(mainwin->window, gc, pixmap, 0, 0, 0, 0, 300, 200);

  64.     //gtk_widget_show(mainwin);

  65.     gtk_main();

  66.     return 0;
  67. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-4 21:24:19 | 显示全部楼层
谢谢各位,小弟明天上班再调试,有问题还请多多帮忙,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表