1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <gtk/gtk.h>
#include <cairo.h>
#include <math.h>
#define W_WIDTH 390
#define W_HEIGHT 390
gint angle = 0;
typedef struct _Point
{
gint x;
gint y;
} Point;
static gboolean OnExposeEvent (
GtkWidget * widget,
GdkEvent * event,
gpointer data)
{
cairo_t * cr = NULL;
gdouble rad = M_PI / 180;
gint angle_part = 360 / 5;
Point point[6];
gint i = 1;
gint signe = -1;
cr = gdk_cairo_create (widget->window);
cairo_scale (cr, 1, -1);
cairo_translate (cr, W_WIDTH/2, -W_WIDTH/2);
cairo_translate (cr,
150*cos (0.1*angle * rad),
150*sin (0.1*angle * rad));
cairo_scale (cr, sin(angle*rad), sin(angle*rad));
for (i = 1; i <= 6; i++) {
point[i - 1].x = 50*cos ((i*angle_part + angle) * rad);
point[i - 1].y = 50*sin ((i*angle_part + angle) * rad);
}
cairo_set_source_rgba (cr, 0.1, 0.6, 0.3, 1);
for (i = 0; i < 2; i++) {
cairo_move_to (cr, signe*point[0].x, point[0].y);
cairo_line_to (cr, signe*point[2].x, point[2].y);
cairo_line_to (cr, signe*point[4].x, point[4].y);
cairo_line_to (cr, signe*point[1].x, point[1].y);
cairo_line_to (cr, signe*point[3].x, point[3].y);
cairo_line_to (cr, signe*point[5].x, point[5].y);
signe *= -1;
}
cairo_fill (cr);
cairo_destroy (cr);
return FALSE;
}
static gboolean
time_handler (GtkWidget * widget)
{
angle --;
gtk_widget_queue_draw (widget);
return TRUE;
}
int main (int argc, char ** argv)
{
GtkWidget * window = NULL;
GtkWidget * draw = NULL;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (
GTK_WINDOW(window), W_WIDTH, W_HEIGHT);
gtk_window_set_title(
GTK_WINDOW(window), "GtkWindow generic");
g_signal_connect (G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
draw = gtk_drawing_area_new ();
gtk_container_add (
GTK_CONTAINER(window), draw);
g_signal_connect (G_OBJECT(draw), "expose-event", G_CALLBACK(OnExposeEvent), NULL);
g_timeout_add(5, (GSourceFunc) time_handler, (gpointer) draw);
gtk_widget_show_all (window);
gtk_main ();
return 0;
} |
Partager