LinuxSir.cn,穿越时空的Linuxsir!

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

谁能给我一个用gtk画图的例子

[复制链接]
发表于 2005-3-19 18:26:09 | 显示全部楼层 |阅读模式
完整可运行的
有gtk_draw_rectangle之类的函数的
谢了
发表于 2005-3-20 10:08:18 | 显示全部楼层

我随便写了一个。


  1. #include <gtk/gtk.h>

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

  6. static gboolean
  7. my_expose( GtkWidget      *da,
  8.                    GdkEventExpose *event,
  9.                    gpointer               data )
  10. {
  11.     GdkGC *gc1, *gc2, *gc;
  12.     GdkColor color;

  13.     gc1 = gdk_gc_new( da->window );
  14.     color.red = 30000;
  15.     color.green = 0;
  16.     color.blue = 30000;
  17.     gdk_gc_set_rgb_fg_color(gc1, &color );

  18.     gc2 = gdk_gc_new( da->window );
  19.     color.red = 65535;
  20.     color.green = 0;
  21.     color.blue = 65535;
  22.     gdk_gc_set_rgb_fg_color( gc2, &color );

  23.     gc = gc1;
  24.     gdk_draw_rectangle( da->window,
  25.                                     gc,
  26.                                     TRUE,//fill or not
  27.                                     5, 5, 100, 100 );

  28.     gc = gc2;
  29.     gdk_draw_arc( da->window,
  30.                               gc,
  31.                               FALSE, //don't fill
  32.                               105, 5, 100, 100, 0, 60 * 64 );

  33.     PangoLayout *layout =
  34.         gtk_widget_create_pango_layout( da, "I'm a demon\nfrom hell.\nhahaha." );
  35.     PangoFontDescription *fontdesc =
  36.         pango_font_description_from_string( "Luxi Mono 12" );
  37.     pango_layout_set_font_description( layout, fontdesc );
  38.     gdk_draw_layout( da->window,
  39.                      gc1,
  40.                      5, 105, layout );
  41.     pango_font_description_free( fontdesc );
  42.     g_object_unref( layout );

  43.     g_object_unref( G_OBJECT(gc1) );
  44.     g_object_unref( G_OBJECT(gc2) );
  45.    
  46.     return TRUE;
  47. }

  48. int main( int  argc, char *argv[] )
  49. {
  50.     GtkWidget *window;
  51.     GtkWidget *da; //drawing area

  52.     gtk_init (&argc, &argv);
  53.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  54.     g_signal_connect( G_OBJECT (window), "destroy",
  55.                               G_CALLBACK (destroy), NULL );
  56.    
  57.     da = gtk_drawing_area_new ();
  58.     /* set a minimum size */
  59.     gtk_widget_set_size_request( da, 300, 300 );

  60.     gtk_container_add( GTK_CONTAINER(window), da );

  61.     g_signal_connect( da, "expose_event",
  62.                                   G_CALLBACK(my_expose), NULL );

  63.     gtk_widget_show_all( window ); //simply show all widgets
  64.     gtk_main();
  65.    
  66.     return 0;
  67. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-21 10:12:31 | 显示全部楼层
直接在MAIN函数里加
gdk_draw_rectangle( drawing->window,
                                    drawing_area->style->black_gc,
                                    TRUE,//fill or not
                                    5, 5, 100, 100 );
为什么没有画出方块
回复 支持 反对

使用道具 举报

发表于 2005-3-21 12:27:12 | 显示全部楼层
直接画一般是没有用的。因为就算你画了,你主窗口会用自己的expose_event来重画窗口。这样你的图形就没了。而且一般来说你在main来画图只画一次。但expose_event是只要窗口要被重画时就发生一次的。所以你根本没机会看到你的图。

你可以在一个事件,譬如说mouseclick中画图。你应该可以暂时看到图形,但只要窗口被刷新,图没有了。
总之,永久图形必须在expose_event里画。
回复 支持 反对

使用道具 举报

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

本版积分规则

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