IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Un petit exemple gnome-canvas


Sujet :

GTK+ avec C & C++

  1. #1
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut Un petit exemple gnome-canvas
    Bonjour,
    J'essaie, en ce moment, d'apprendre à utiliser gnome-canvas/gdk-pixbuf, mais je n'arrive absolument pas à afficher le moindre pixel dans un canvas, voici mon code, pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <glib.h>
    #include <libgnomecanvas/libgnomecanvas.h>
     
    typedef struct _CanvasRegion
    {
    	gdouble x1;
    	gdouble x2;
    	gdouble y1;
    	gdouble y2;
    } CanvasRegion;
     
    int main(int argc, char ** argv)
    {
    	GtkWidget *pWindow = NULL;
    	GtkWidget *pCanvas = NULL;
    	CanvasRegion  region;
     
    	region.x1 = 0;
    	region.y1 = 0;
    	region.x2 = 320;
    	region.y2 = 200;
     
     
    	gtk_init(&argc, &argv);
     
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    	g_signal_connect(G_OBJECT(pWindow),
                                               "destroy",
                                               G_CALLBACK(gtk_main_quit), NULL);
     
    	pCanvas = gnome_canvas_new();
    	gnome_canvas_set_scroll_region(
    			GNOME_CANVAS(pCanvas),
    			region.x1,
    			region.y1,
    			region.x2,
    			region.y2
    			);
     
    	gtk_widget_show_all(pWindow);
    	gtk_main();
     
     
    	return EXIT_SUCCESS;
    }
    Pour l'instant, j'arrive à créer un canvas, mais je regarde dans la doc, et je ne vois aucune fonction pour afficher un point dans ce canvas

    il y a cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gnome_canvas_item_new ()
    mais je ne comprends pas à quoi elle sert

    Bref, donc, si quelqu'un a un exemple de code detaillé, pas trop compliqué qui affiche, une droite, ou un rectangle dans un canvas, pour comprendre comment ça fonctionne, parce que là, je tourne vraiment en rond

    Merci

  2. #2
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    UP! personne?
    J'ai essayé aussi les drawing area, mais pas moyen d'afficher le moindre pixel

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    N'utilise pas GnomeCanvas, libgnome est dépréciée... Sinon tu as un exemple sur les GtkDrawingArea dans gtk-demo, mais il utilise GDK. Le mieux reste d'utiliser cairo. Tu dois récupérer le contexte cairo avec gdk_cairo_create, tu peux ensuite dessiner à l'intérieur en utilisant l'API cairo.

  4. #4
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Salut, merci d'avoir répondu

    Oui, finalement, j'utilise cairo, j'ai fini par trouver des petits bouts de codes par ci par là, c'est deja mieux

    Sinon, pour GdkPixbuf, j'ai essayé de comprendre la doc, mais c'était beaucoup trop compliqué, pareil pour les drawing area

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Un petit tour sur la faq peut être

  6. #6
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Moui, ben ça reste quand même très obscur

    En fait ce que je fais, je trouve des petits bouts de code sur cairo, par ci par là, je regarde la doc, et j'essai de bidouiller plus ou moins

    Par exemple, en partant de ce code trouvé dans la FAQ, eh ben je suis arrivé à ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include <gtk/gtk.h>
    #include <math.h>
    #include <cairo.h>
     
    #define WIDTH 640
    #define HEIGHT 480
     
     
    static gboolean
    expose (GtkWidget * widget, GdkEventExpose * event, gpointer userdata)
    {
      int x_zero = WIDTH/2;
      int y_zero = HEIGHT/2;
     
      cairo_surface_t * surface = NULL;
     
      cairo_t *cr = NULL;
      gint x[3] =
      {
    	  -WIDTH / 2,
    	  -WIDTH / 2,
    	  -WIDTH / 2
      };
      gint y[3] = {0};
     
     
      cr = gdk_cairo_create (widget->window);
     
      cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
      cairo_paint (cr);
      cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
     
      surface = cairo_get_target(cr);
     
      cairo_surface_set_device_offset(surface, WIDTH/2, HEIGHT/2);
     
      while (x[0] != WIDTH)
        {
          x[0] = x[2];
          x[1] = x[0] + 1;
          x[2] = x[1] + 2;
     
          /* On calcul y = f(x) tous les trois points */
          y[0] = pow(0.03*x[0] , 3);
          y[1] = pow(0.03*x[1] , 3);
          y[2] = pow(0.03*x[2] , 3);
     
          /* On affiche le morceau de courbe qui
           * passe par ces trois points
           */
          cairo_curve_to (cr,
    		      x[0],   -y[0],
    		      x[1],   -y[1], 
    		      x[2],   -y[2]
    		      );
        }
      cairo_stroke (cr);
     
      cairo_destroy (cr);
      return FALSE;
    }
     
     
    int
    main (int argc, char **argv)
    {
      GtkWidget *window = NULL;
     
      gtk_init (&argc, &argv);
     
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size (GTK_WINDOW (window), WIDTH, HEIGHT);
      gtk_window_set_title (GTK_WINDOW (window), "Affichage de courbe");
      g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL);
     
     
      gtk_widget_set_app_paintable (window, TRUE);
     
      g_signal_connect (G_OBJECT (window), "expose-event", G_CALLBACK (expose),
    		    NULL);
     
      gtk_widget_show_all (window);
      gtk_main ();
     
      return 0;
    }
    Bon, alors maintenant, je cherche à afficher les axes verticaux et horizontaux, mais je ne trouve pas une fonction pour afficher une droite.

    .

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Tu crées d'abord un chemin, par exemple avec cairo_arc pour faire un cercle, ou cairo_move_to + cairo_line_to pour faire une ligne. Ensuite tu appelles cairo_stroke pour tracer un chemin. Si tu veux remplir le chemin, c'est cairo_fill.

    Pour tout ce qui est transformations (changement de repères avec cairo_translate et cairo_scale) consulte le chapitre sur les transformations.

    http://library.gnome.org/devel/cairo...ormations.html

    Cela te permettra de ne pas avoir une fenêtre de taille fixe comme actuellement (tu peux récupérer la taille du widget et mettre à l'échelle), et pouvoir dessiner avec les coordonnées des points dans ton repère, plutôt que dans le repère "pixels".

Discussions similaires

  1. Réponses: 46
    Dernier message: 04/08/2006, 00h18
  2. Réponses: 1
    Dernier message: 09/06/2006, 09h42
  3. [HSQLDB] Votre avis sur un petit exemple complet...
    Par calogerogigante dans le forum Persistance des données
    Réponses: 8
    Dernier message: 16/05/2006, 08h21
  4. PHP ou Perl: Cherche petit exemple tout con.
    Par fifto dans le forum Web
    Réponses: 15
    Dernier message: 28/03/2006, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo