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 98 99 100 101 102 103 104 105 106 107 108 109
| //include
#include <gtk/gtk.h>
//headers
static gboolean DA_realize( GtkWidget *widget);
static gboolean DA_configure( GtkWidget *widget, GdkEventConfigure *event);
static gboolean DA_expose( GtkWidget *widget, GdkEventExpose *event);
static gboolean DA_button_press (GtkWidget *widget, GdkEventButton *event);
//quelques variables...
GdkPixmap* pixmap;
GdkGC* gc = NULL;
int unBoolean; //0 c'est vert, 1 c'est rouge !
//le main, rien de spécial...
int main(int argc, char ** argv)
{
//variables
GtkWidget* fenetre;
GtkWidget* drawingArea;
printf("on démarre (main)...\n");
gtk_init(&argc,&argv);
//la fenetre principale
fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(fenetre),"exemple...");
gtk_window_set_default_size(GTK_WINDOW(fenetre), 200, 200);
gtk_window_set_position (GTK_WINDOW (fenetre), GTK_WIN_POS_NONE);
g_signal_connect(G_OBJECT(fenetre), "delete_event",G_CALLBACK(gtk_main_quit),NULL);
//la drawing area maintenant
drawingArea = gtk_drawing_area_new();
//connection aux callbacks
g_signal_connect (G_OBJECT (drawingArea), "realize", G_CALLBACK(DA_realize), NULL);
g_signal_connect (G_OBJECT (drawingArea), "expose_event", G_CALLBACK(DA_expose), NULL);
g_signal_connect (G_OBJECT (drawingArea), "configure_event", G_CALLBACK(DA_configure), NULL);
g_signal_connect (G_OBJECT (drawingArea), "button_press_event", G_CALLBACK(DA_button_press), NULL);
gtk_widget_set_events (drawingArea, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK);
//on met la drawing area dans la fenetre
gtk_container_add(GTK_CONTAINER(fenetre),GTK_WIDGET(drawingArea));
// on affiche tout
gtk_widget_show_all(GTK_WIDGET(fenetre));
//on démarre la boucle gtk
gtk_main();
return 0;
}
//signal realize
static gboolean DA_realize( GtkWidget *widget)
{
printf("realize ici...\n");
unBoolean = 0;//(vert au debut)
return TRUE;
}
//signal configure
static gboolean DA_configure( GtkWidget *widget, GdkEventConfigure *event)
{
printf("configure ici...\n");
if (pixmap) g_object_unref(pixmap);
pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1);
gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
return TRUE;
}
//signal expose
static gboolean DA_expose( GtkWidget *widget, GdkEventExpose *event)
{
printf("expose ici...\n");
//ici on fait les dessin (souvent c'est une fonction a part)
if (pixmap != NULL) gdk_pixmap_unref(pixmap);
pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1);
if (gc ==NULL) gc = gdk_gc_new(widget->window);
GdkColor couleur;//on choisit la couleur
switch (unBoolean)
{
case 0:
printf("vert !\n");
couleur.pixel=0x00FF00;
break;
case 1:
printf("rouge !\n");
couleur.pixel=0xFF0000;
break;
}
gdk_gc_set_foreground(gc, &couleur);
gdk_draw_rectangle(GDK_DRAWABLE(pixmap), gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
//on affiche le beau dessin
gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap,
event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height);
return TRUE;
}
//signal quand tu appuies sur un bouton de la souris
static gboolean DA_button_press (GtkWidget *widget, GdkEventButton *event)
{
unBoolean ^= 1; //on switch: si 1 -> 0 sinon 0->1
printf("unBoolean : %d \n",unBoolean);
gtk_widget_queue_draw(GTK_WIDGET(widget));//on redessine maintenant !!!
return TRUE;
} |
Partager