LinuxSir.cn,穿越时空的Linuxsir!

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

GnomeCanvas 实例

[复制链接]
发表于 2009-8-11 11:30:58 | 显示全部楼层 |阅读模式
该实例来源于《GTK+ / Gnome Application Development》一书,由于该书成书较早,一些代码已经不大适合于与现在的GTK+ API,所以我做了一些更改,以适用于现在的GTK+。代码在windows mingw gcc 3.4.5编译通过。gnomecanvas的运行以及开发环境可以在http://ftp.gnome.org/pub/GNOME/binaries/win32/获得。编译采用gcc main.c moduleimp.c -o canvas `pkg-config --cflags --libs libgnomecanvas-2.0`
文件main.c
  1. #include <gtk/gtk.h>
  2. #include <libgnomecanvas/libgnomecanvas.h>
  3. extern void create_canvas_items( GtkWidget *canvas);
  4. int main( int argc, char *argv[])
  5. {
  6.         gtk_init( &argc, &argv);
  7.        
  8.         GtkWidget *window, *sw, *canvas;
  9.         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  10.         gtk_window_set_title(GTK_WINDOW(window), "Canvas Example");
  11.         g_signal_connect(window,
  12.                 "delete_event",
  13.                 G_CALLBACK(gtk_main_quit),
  14.                 NULL);
  15.         sw = gtk_scrolled_window_new(NULL, NULL);
  16.         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
  17.                                 GTK_POLICY_AUTOMATIC,
  18.                                 GTK_POLICY_AUTOMATIC);
  19.         canvas = gnome_canvas_new_aa();
  20.         gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), 0, 0, 600, 450);
  21.         create_canvas_items(canvas);
  22.         gtk_container_add(GTK_CONTAINER(sw), canvas);
  23.         gtk_container_add(GTK_CONTAINER(window), sw);
  24.         gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
  25.        
  26.        
  27.         gtk_widget_show_all( window);
  28.         gtk_main();
  29.         return 0;
  30. }
复制代码
文件moduleimp.c
  1. #include <gtk/gtk.h>
  2. #include <libgnomecanvas/libgnomecanvas.h>
  3. static gboolean
  4. cb_item_event( GnomeCanvasItem *item, GdkEvent *event, gpointer data)
  5. {
  6.         static double x, y;
  7.         static int dragging;
  8.         double new_x, new_y;
  9.         GdkCursor *fleur;
  10.         double item_x, item_y;
  11.         item_x = event->button.x;
  12.         item_y = event->button.y;
  13.         gnome_canvas_item_w2i(item->parent, &item_x, &item_y);
  14.         switch (event->type)
  15.         {
  16.         case GDK_BUTTON_PRESS:
  17.                 switch(event->button.button)
  18.                 {
  19.                 case 1:
  20.                         if (event->button.state & GDK_SHIFT_MASK)
  21.                         {
  22.                                 gtk_object_destroy(GTK_OBJECT(item));
  23.                         }
  24.                         else
  25.                         {
  26.                                 x = item_x;
  27.                                 y = item_y;
  28.                                
  29.                                 fleur = gdk_cursor_new(GDK_FLEUR);
  30.                                 gnome_canvas_item_grab(item,
  31.                                         GDK_POINTER_MOTION_MASK |
  32.                                         GDK_BUTTON_RELEASE_MASK,
  33.                                         fleur,
  34.                                         event->button.time);
  35.                                 gdk_cursor_destroy( fleur);
  36.                                 dragging = TRUE;
  37.                         }
  38.                         break;
  39.                 default:
  40.                         break;
  41.                 }
  42.                 break;
  43.         case GDK_MOTION_NOTIFY:
  44.                 if (dragging && (event->motion.state & GDK_BUTTON1_MASK))
  45.                 {
  46.                         new_x = item_x;
  47.                         new_y = item_y;
  48.                        
  49.                         gnome_canvas_item_move(item, new_x - x, new_y - y);
  50.                         x = new_x;
  51.                         y = new_y;
  52.                 }
  53.                 break;
  54.                
  55.         case GDK_BUTTON_RELEASE:
  56.                 gnome_canvas_item_ungrab(item, event->button.time);
  57.                 dragging = FALSE;
  58.                 break;
  59.                
  60.         default:
  61.                 break;
  62.         }
  63.         return FALSE;
  64. }
  65. void
  66. create_canvas_items( GtkWidget *canvas)
  67. {
  68.         GnomeCanvasPoints* points;
  69.         GnomeCanvasGroup* group;
  70.         GnomeCanvasItem* item;
  71.         double affine[6];
  72.         group = gnome_canvas_root(GNOME_CANVAS(canvas));
  73.         /* A polygon */
  74.         points = gnome_canvas_points_new(14);
  75.         points->coords[0] = 270.0;
  76.         points->coords[1] = 330.0;
  77.         points->coords[2] = 270.0;
  78.         points->coords[3] = 430.0;
  79.         points->coords[4] = 390.0;
  80.         points->coords[5] = 430.0;
  81.         points->coords[6] = 390.0;
  82.         points->coords[7] = 330.0;
  83.         points->coords[8] = 310.0;
  84.         points->coords[9] = 330.0;
  85.         points->coords[10] = 310.0;
  86.         points->coords[11] = 390.0;
  87.         points->coords[12] = 350.0;
  88.         points->coords[13] = 390.0;
  89.         points->coords[14] = 350.0;
  90.         points->coords[15] = 370.0;
  91.         points->coords[16] = 330.0;
  92.         points->coords[17] = 370.0;
  93.         points->coords[18] = 330.0;
  94.         points->coords[19] = 350.0;
  95.         points->coords[20] = 370.0;
  96.         points->coords[21] = 350.0;
  97.         points->coords[22] = 370.0;
  98.         points->coords[23] = 410.0;
  99.         points->coords[24] = 290.0;
  100.         points->coords[25] = 410.0;
  101.         points->coords[26] = 290.0;
  102.         points->coords[27] = 330.0;
  103.         item = gnome_canvas_item_new(group,
  104.                         gnome_canvas_polygon_get_type (),
  105.                         "points", points,
  106.                         "fill_color", "tan",
  107.                         "outline_color", "black",
  108.                         "width_units", 3.0,
  109.                         NULL);
  110.         g_signal_connect( item, "event", G_CALLBACK(cb_item_event), NULL);
  111.         gnome_canvas_points_unref(points);
  112.         /* A translucent rectangle */
  113.         item = gnome_canvas_item_new (group,
  114.                         gnome_canvas_rect_get_type(),
  115.                         "x1", 90.0,
  116.                         "y1", 40.0,
  117.                         "x2", 180.0,
  118.                         "y2", 100.0,
  119.                         "fill_color_rgba", 0x3cb37180,
  120.                         "outline_color", "black",
  121.                         "width_units", 4.0,
  122.                         NULL);
  123.         g_signal_connect( item, "event", G_CALLBACK(cb_item_event), NULL);
  124.         /* A translucent ellipse */
  125.         item = gnome_canvas_item_new (group,
  126.                         gnome_canvas_ellipse_get_type(),
  127.                         "x1", 210.0,
  128.                         "y1", 80.0,
  129.                         "x2", 280.0,
  130.                         "y2", 140.0,
  131.                         "fill_color_rgba", 0x5f9ea080,
  132.                         "outline_color", "black",
  133.                         "width_pixels", 0,
  134.                         NULL);
  135.         g_signal_connect( item, "event", G_CALLBACK(cb_item_event), NULL);
  136.        
  137.         /* Create ellipses arranged in a line; they're manipulated as a
  138.         single item. */
  139.         group = GNOME_CANVAS_GROUP (gnome_canvas_item_new (group,
  140.                         gnome_canvas_group_get_type(),
  141.                         "x", 0.0,
  142.                         "y", 0.0,
  143.                         NULL));
  144.         g_signal_connect( group, "event", G_CALLBACK(cb_item_event), NULL);
  145.         {
  146.                 double xpos = 20.0;
  147.                 while (xpos < 300.0)
  148.                 {
  149.                         gnome_canvas_item_new(group,
  150.                                 gnome_canvas_ellipse_get_type(),
  151.                                 "x1", xpos,
  152.                                 "y1", 100.0,
  153.                                 "x2", xpos + 10.0,
  154.                                 "y2", 110.0,
  155.                                 "fill_color_rgba", 0x0000FFFF,
  156.                                 "outline_color_rgba", 0xFF,
  157.                                 NULL);
  158.                         xpos += 15.0;
  159.                 }
  160.         }
  161. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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