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+ Discussion :

GTK+ un prolbème avec draw_rectangle


Sujet :

GTK+

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut GTK+ un prolbème avec draw_rectangle
    Bonjour (c'est mon premier post sur ce site ),
    Je viens de découvrir la bibliothèque GTK+ il y a peu de temps et j'ai déjà des problèmes (ça arrive vite !). Quand je compile ce bout de code, il plante et je sais pas pourquoi (je cherche, je cherche mais je trouve rien )

    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <stdio.h>
     
    int main(int argc, char **argv)
    {
        GtkWidget * MainWindow = NULL;
        GtkWidget *area = NULL;
        GtkWidget *pixmap = NULL;
     
         gtk_init(&argc, &argv);
         MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
     
     
     
     
     
     
         area = gtk_drawing_area_new        ();
         gtk_container_add( GTK_CONTAINER(MainWindow), area )  ;
              gtk_drawing_area_size       (area,
                                           500,
                                           600);
     
     
         pixmap = gdk_pixmap_new               (area->window,
                                            area->allocation.width,
                                             area->allocation.height,
                                            1);
     
           gdk_draw_rectangle (pixmap,
                          area->style->black_gc,
                          TRUE, 50,
                          50,
                          100,
                          10);
     
           gtk_widget_queue_draw( area );                                        
     
     
          g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(gtk_main_quit), NULL);
     
     
        gtk_widget_show_all(MainWindow);
        gtk_main(); 
     
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
    Une fois que je compile, je devrais avoir (il me semble ) un rectangle noir dans ma fenêtre GTK alors que je n'ai rien qui s'affiche mis à part un message dans la console qui me dit :
    blabla Gdk-CRITICAL **: gdk_draw_rectangle: assertion 'GDK_IS_GC (gc)' failed

    J'ai égallement 3 messages d'erreurs de la part du compilateur qui m'indique la dernière ligne de :
    _gdk_draw_rectangle : [WARNING] passing arg 1 of 'gtk_draw_rectangle ' from incompatible pointer type
    _gtk_drawing_area_size :[WARNING] passing arg 1 of 'gtk_drawing_area_size' from incompatible pointer type
    _gdk_pixmap_new : [WARNING] passing arg 1 of 'gdk_draw_rectangle' from incompatible pointer type

    Je vous remercie donc de bien accepter de répondre à ces quelques question qui pourraient vous paraître triviales mais qui ne le sont pas pour moi...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Citation Envoyé par Bébar
    J'ai égallement 3 messages d'erreurs de la part du compilateur qui m'indique la dernière ligne de :
    _gdk_draw_rectangle : [WARNING] passing arg 1 of 'gtk_draw_rectangle ' from incompatible pointer type
    _gtk_drawing_area_size :[WARNING] passing arg 1 of 'gtk_drawing_area_size' from incompatible pointer type
    _gdk_pixmap_new : [WARNING] passing arg 1 of 'gdk_draw_rectangle' from incompatible pointer type
    Alors, prenons les warnings dans l'ordre.
    Si on regarde la doc de gdk_draw_rectangle, le 1er argument est un GdkDrawable, or tu lui passes un GtkWidget *pixmap.

    Ensuite, le compilateur se plaint de gtk_drawing_area_size, la doc indique qu'il faut lui passer un GtkDrawingArea, or tu passes un GtkWidget. Vu que tu es certain que ton GtkWidget est en fait un GtkDrawingArea, tu peux le caster tout simplement en utilisantt GTK_DRAWING_AREA (area) au lieu de area dans ton appel à gtk_drawing_area_size. Par contre, la doc de cette fonction te recommande d'utiliser gtk_widget_set_size_request de preference à gtk_drawing_area_size.

    Pour le dernier warning, de la même façon gdk_pixmap_new prend en argument un GdkDrawable, or tu lui passes une GdkWindow. Cependant, la doc indique que GdkWindow dérive de GdkDrawable, tu peux donc faire un cast de ton area->window en GdkDrawable en utilisant GDK_DRAWABLE (area->window) comme premier argument de ton appel à gdk_pixmap_new.

    En espérant que ça éclaire un peu les choses... Si tu prends le temps de lire et de comprends les messages de ton compilateur, et de vérifier les différents types que tu utilises par rapport à ceux indiqué dans la doc de gtk+, il n'y a rien de bien sorcier à deviner dans tout ce que j'ai dit ci-dessus

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    EDIT : je m'étais trompé... Et en fait, pour les 3 erreurs, ce que tu m'as dit fonctionne, mais maintenant, j'ai une nouvelle erreur sur le gtk_pixmap_new qui me dit :

    [Warning] assignment from incompatible pointer type
    Mon code à présent :
    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <stdio.h>
     
    int main(int argc, char **argv)
    {
        GtkWidget * MainWindow = NULL;
        GtkWidget *area = NULL;
        GtkWidget *pixmap = NULL;
     
     
     
         gtk_init(&argc, &argv);
         MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
     
     
     
     
     
     
         area = gtk_drawing_area_new        ();
         gtk_container_add( GTK_CONTAINER(MainWindow), area )  ;
     
         gtk_widget_set_size_request         (area,
                                                             500,
                                                            600);
           /*   gtk_drawing_area_size       (GTK_DRAWING_AREA(area),
                                           500,
                                           600);*/
     
     
         pixmap = gdk_pixmap_new               (GDK_DRAWABLE (area->window),
                                            area->allocation.width,
                                            area->allocation.height ,
                                            -1);
     
           gdk_draw_rectangle (GDK_DRAWABLE (area->window),
                          area->style->black_gc,
                          TRUE, 50,
                          50,
                          100,
                          10);
     
           gtk_widget_queue_draw( area );                                        
     
     
          g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(gtk_main_quit), NULL);
     
     
        gtk_widget_show_all(MainWindow);
        gtk_main();
     
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
    Et si j'ai le malheur de mettre le deph à -1 (quand j'ai indiqué area en premier argument) ce message se met dans la console :

    J'ai comme teuf13 me l'a recommander, regarder les problèmes de macros, je ne trouve rien.
    Je ne connais pas très bien cette bibliothèque pour voir l'erreur.
    Donc si quelqu'un trouvait l'erreur ça serait sympa

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    une âme chariable, non ?
    ha si vous qui lisez ce message, je suis sûre que vous avez la réponse

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Peut être qu'en suivant ce qui est écrit dans la documentation ça marchera mieux : http://developer.gnome.org/doc/API/2...html#id3631964

    Code c : 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
    #include <stdlib.h>
    #include <stdio.h>
     
    #include <gtk/gtk.h>
     
    static gboolean expose_event_callback (GtkWidget *widget, GdkEventExpose *event,
                                           gpointer data)
    {
      gdk_draw_rectangle (GDK_DRAWABLE (widget->window), widget->style->black_gc,
                          TRUE, 50, 50, 100, 10);
      return TRUE;
    }
     
    int main (int argc, char **argv)
    {
      GtkWidget *MainWindow = NULL;
      GtkWidget *area = NULL;
     
      gtk_init (&argc, &argv);
      MainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      area = gtk_drawing_area_new ();
      g_signal_connect (G_OBJECT (area), "expose-event",
                        G_CALLBACK (expose_event_callback), NULL);
      gtk_container_add (GTK_CONTAINER (MainWindow), area);
      gtk_widget_set_size_request (area, 500, 600);
      g_signal_connect (G_OBJECT (MainWindow), "delete-event", gtk_main_quit, NULL);
      gtk_widget_show_all (MainWindow);
      gtk_main();
      return EXIT_SUCCESS;
    }

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Si tu veux c'est la première librairie pour laquelle j'ai du utiliser la doc donc jene sais pas vraiment chercher dedans (pas l'habitude). Ensuite je n'ai pas tout compris à drawing area et en plus les indications que m'on données certaines personnes étaient incomplète (voir fausses cf: utilisation du pixmap).

    Sinon, je n'ai qu'un chose à te dire : MERCI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. GTK vraiment utilisable avec SDL ?
    Par Sacha999 dans le forum gtksdl
    Réponses: 1
    Dernier message: 15/08/2008, 14h55
  2. [GTK+] Capture vidéo avec OpenCV et intégration dans une GUI GTK+
    Par kurapix dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 21/04/2008, 10h12
  3. GTK et OPENGL avec gtkglarea
    Par Vincent|Dev dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/02/2005, 13h33
  4. [GTK]instal devPack avec dev c++
    Par FreshVic dans le forum Autres éditeurs
    Réponses: 8
    Dernier message: 15/04/2003, 16h48

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