LinuxSir.cn,穿越时空的Linuxsir!

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

doubleelec大哥,能给看下程序吗?写的完整程序,看一下怎么回事,郁闷死了!

[复制链接]
发表于 2005-6-3 11:48:42 | 显示全部楼层 |阅读模式
这个程序是一个画图程序,编译没错,执行出现错误.
#include<gtk/gtk.h>
#include<stdio.h>
#include<gdk/gdk.h>

static GtkWidget *area; /*绘图区用于显示*/
static GdkPixmap *map = NULL; /*绘图区用于保存*/
static GdkGC *gc_front = NULL; /*前景色*/
static GdkGC *gc_back = NULL; /*背景色*/
GdkDrawable*drawable;

void draw_init(void)
{
gdk_draw_line(drawable, gc_front,
0,300,500,300);
gdk_draw_line(map, gc_front,
0,300,500,300 );
printf("%s\n","ok!");
}


/*主函数*/
gint main(int argc, char *argv[])
{
GtkWidget *window, *vbox;
GdkColor color; color.red = 65535; color.green = 65535; color.blue = 65535;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window),800,600);
gtk_window_set_title(GTK_WINDOW(window), "the");


g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);


vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);


area = gtk_drawing_area_new();
drawable=area->window;
gtk_widget_set_size_request(area,800,600);
gtk_box_pack_start(GTK_BOX(vbox), area, TRUE, TRUE, 5); /*创建绘图区*/

gtk_widget_modify_bg(area, GTK_STATE_NORMAL, &color);



map = gdk_pixmap_new(drawable, area->allocation.width, area->allocation.height, 1);

gdk_draw_rectangle(map,
area->style->white_gc,
TRUE,
0, 0, area->allocation.width, area->allocation.height);


gc_front = gdk_gc_new(drawable);
color.red = 0;
color.green = 0;
color.blue = 0;/*默认前景为黑色*/
gdk_gc_set_rgb_fg_color(gc_front, &color);

gc_back = gdk_gc_new(drawable);
color.red = 65535;
color.green = 65535;
color.blue = 65535;/*默认背景为色*/
gdk_gc_set_rgb_bg_color(gc_back, &color);
draw_init();
gtk_widget_show_all(window);
gtk_main();
return 0;
}
编译没错,执行出现错误.
(main:4604): Gdk-CRITICAL **: file gdkdraw.c: line 411 (gdk_draw_rectangle): assertion `GDK_IS_GC (gc)' failed

(main:4604): Gdk-CRITICAL **: file gdkgc.c: line 78 (gdk_gc_new): assertion `drawable != NULL' failed

(main:4604): Gdk-CRITICAL **: file gdkgc.c: line 504 (gdk_gc_set_rgb_fg_color):
assertion `GDK_IS_GC (gc)' failed

(main:4604): Gdk-CRITICAL **: file gdkgc.c: line 78 (gdk_gc_new): assertion `drawable != NULL' failed

(main:4604): Gdk-CRITICAL **: file gdkgc.c: line 535 (gdk_gc_set_rgb_bg_color):
assertion `GDK_IS_GC (gc)' failed

(main:4604): Gdk-CRITICAL **: file gdkdraw.c: line 368 (gdk_draw_line): assertion `drawable != NULL' failed

(main:4604): Gdk-CRITICAL **: file gdkdraw.c: line 369 (gdk_draw_line): assertion `gc != NULL' failed
发表于 2005-6-3 12:39:28 | 显示全部楼层
1. 检查你程序中所有涉及控件指针的赋值语句和参数传递,要保证类型兼容,即一个控件的指针只能赋给相同类型或父类型控件的指针。

2. 在程序中添加语句,判断返回值为指针类型的函数是否返回了 NULL。

俺就不一行行的看了,DEBUG 的事还是自己慢慢做吧,呵呵。
回复 支持 反对

使用道具 举报

发表于 2005-6-3 13:14:29 | 显示全部楼层
所有构件在没有show出前是没有真正的创建完毕的,
将gtk_widget_show_all(window);和drawable=area->window;
放到gtk_widget_modify_bg(area, GTK_STATE_NORMAL, &color);后
如下
gtk_widget_modify_bg(area, GTK_STATE_NORMAL, &color);
gtk_widget_show_all(window);
drawable=area->window; //在drawarea构件show出来以后,area->window才真正创建
回复 支持 反对

使用道具 举报

发表于 2005-6-3 13:16:13 | 显示全部楼层
请楼主不要一帖多发,还有多搜索论坛
回复 支持 反对

使用道具 举报

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

本版积分规则

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