Droites aléatoires

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 104 fois - Téléchargée 30 fois

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

Ajouter un commentaire Commentaire
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

Salut, merci pour ton code, il m'a bien aidé.
Est-ce que tu saurais comment mettre le drawingarea dans des ascenseurs (je dois afficher jusqu'à une largeur de 8000 pixels) ? J'ai essayé comme je faisais pour le texte mais ça ne fonctionne pas : soit l'ascenseur ne fonctionne pas, soit la fenetre est redimensionnée.

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.