Droites aléatoires

Contenu du snippet

Voilà un exemple de traçage de droites sur Drawing Area...
Ce n'est pas parfait comme exemple, mais vu que l'internet est assez avare de tutoriels sur les drawing area, j'espère que cela servira.

Le code a été testé sur Fedora Core 3 (encodage utf8) avec la ligne de compilation fournie dans le texte de la source !!

Bon amusement.

Source / Exemple :


#include <gtk/gtk.h>
#include <stdlib.h>

// gcc droitesaleatoires3.c -o droitesaleatoires.exe `pkg-config --cflags --libs gtk+-2.0`

#define LARG 601
#define HAUT 401

static GdkPixmap *pixmap = NULL;

typedef struct {
               GtkWidget *fenetre;
               GtkWidget *vbox;
               GtkWidget *drawingarea;
               GtkWidget *hbox;
               GtkWidget *label;
               GtkObject *spinbutton_adj;
               GtkWidget *spinbutton;
               GtkWidget *bouton_tirer; 
               gint      *nombre_droites;
               }                             APPLICATION;

gint afficher_nombre   (APPLICATION *app);
void tracer_les_droites(GtkWidget *widget, gpointer data);
void rafraichir        (GtkWidget *widget, gpointer data);

int main(int argc, char **argv)
{
  gtk_init(&argc, &argv);

  APPLICATION applic;
  APPLICATION *p_applic = &applic;

  srand(0);

  p_applic->fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_container_set_border_width (GTK_CONTAINER (p_applic->fenetre), 10);
  gtk_window_set_title (GTK_WINDOW (p_applic->fenetre), "Droites Aléatoires");
  gtk_window_set_resizable (GTK_WINDOW (p_applic->fenetre), FALSE);
  g_signal_connect(G_OBJECT(p_applic->fenetre),"destroy",G_CALLBACK(gtk_main_quit), NULL);

  p_applic->vbox = gtk_vbox_new (FALSE, 4);
  gtk_container_add (GTK_CONTAINER (p_applic->fenetre), p_applic->vbox);

  p_applic->drawingarea = gtk_drawing_area_new();
  gtk_widget_set_size_request(p_applic->drawingarea, LARG, HAUT);
  gtk_box_pack_start (GTK_BOX (p_applic->vbox), p_applic->drawingarea, TRUE, TRUE, 0);
  g_signal_connect(G_OBJECT(p_applic->drawingarea),"event",G_CALLBACK(rafraichir), NULL);

  p_applic->hbox = gtk_hbox_new (FALSE, 30);
  gtk_box_pack_start (GTK_BOX (p_applic->vbox), p_applic->hbox, FALSE, TRUE, 0);
  gtk_container_set_border_width (GTK_CONTAINER (p_applic->hbox), 10);

  p_applic->label = gtk_label_new ("Nombre de droites");
  gtk_box_pack_start (GTK_BOX (p_applic->hbox), p_applic->label, FALSE, FALSE, 0);

  p_applic->spinbutton_adj = gtk_adjustment_new (1, 1, 500, 1, 10, 10);
  p_applic->spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (p_applic->spinbutton_adj), 1, 0);
  gtk_box_pack_start (GTK_BOX (p_applic->hbox), p_applic->spinbutton, TRUE, TRUE, 0);

  p_applic->bouton_tirer = gtk_button_new_with_label ("Dessiner les droites !");
  gtk_box_pack_start (GTK_BOX (p_applic->hbox), p_applic->bouton_tirer, FALSE, FALSE, 0);
  g_signal_connect(G_OBJECT(p_applic->bouton_tirer),"clicked",G_CALLBACK(tracer_les_droites), (gpointer) p_applic);

  gtk_widget_show_all(p_applic->fenetre);
  gtk_main();
  return EXIT_SUCCESS;
}
//***************************************************************************
gint afficher_nombre(APPLICATION *app)
{
gint lenombre;

lenombre = (gint) gtk_spin_button_get_value(GTK_SPIN_BUTTON(app->spinbutton));

// g_print("Nombre de droites : %d \n",lenombre);

return lenombre;
}
//***************************************************************************
void tracer_les_droites(GtkWidget *widget, gpointer data)
{
gint nbre_droit_a_tracer;
gint i;
gint X1, Y1;
gint X2, Y2;

APPLICATION *appl ;
appl = (APPLICATION *) data;

nbre_droit_a_tracer = afficher_nombre(appl);

if (pixmap==NULL) {
                  pixmap=gdk_pixmap_new(appl->drawingarea->window, LARG, HAUT, -1);
                  }

gdk_draw_rectangle(pixmap, appl->drawingarea->style->white_gc, TRUE, 0,0, LARG, HAUT);

for (i=0; i<nbre_droit_a_tracer; i++)
  {
  X1= 1 + (int) ((double) LARG * rand() / (double) (RAND_MAX+1.0));
  X2= 1 + (int) ((double) LARG * rand() / (double) (RAND_MAX+1.0));
  Y1= 1 + (int) ((double) HAUT * rand() / (double) (RAND_MAX+1.0));
  Y2= 1 + (int) ((double) HAUT * rand() / (double) (RAND_MAX+1.0));

  gdk_draw_line(pixmap, appl->drawingarea->style->black_gc, X1, Y1, X2, Y2);
  }

gdk_draw_pixmap(appl->drawingarea->window,appl->drawingarea->style->black_gc, pixmap, 0,0,0,0, LARG, HAUT);
}
//***************************************************************************
void rafraichir(GtkWidget *dr_ar, gpointer data)
{
if (pixmap==NULL) {
                  pixmap=gdk_pixmap_new(dr_ar->window, LARG, HAUT, -1);
                  gdk_draw_rectangle(pixmap, dr_ar->style->white_gc, TRUE, 0,0, LARG, HAUT);
                  }
gdk_draw_pixmap(dr_ar->window,dr_ar->style->black_gc, pixmap, 0,0,0,0, LARG, HAUT);
}

Conclusion :


Calogero GIGANTE

http://www.gigante.be/

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.