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 :

Debutant pour gtk_draw_rectangle


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Par défaut Debutant pour gtk_draw_rectangle
    Bonjour, cela fait maintenant plusieurs heures que je suis dessus sans succès alors je viens poster ici ...

    voici mon fichier qui devrait normalement afficher un simple rectangle dans une fenetre ...

    #include <stdlib.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
    #include <math.h>
    #include "font.h"
    #include "areas.h"
    #include "constantes.h"

    int main(int argc, char *argv[])
    {
    GdkFont *police = NULL;
    GtkWidget *window;

    gtk_init(&argc, &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), LARGEUR, HAUTEUR);
    gtk_window_set_title(GTK_WINDOW(window), "Synchromix -- By Cyberbros");
    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),0);

    police = Init_Font();

    gdk_draw_rectangle (window->window, window->style->black_gc, TRUE, 0, 0, 200, 200);

    gtk_widget_show_all(window);
    gtk_main();

    return EXIT_SUCCESS;
    }

    Lorsque je lance le programme il me sort cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (test:14731): Gdk-CRITICAL **: gdk_draw_rectangle: assertion `GDK_IS_DRAWABLE (drawable)' failed
    D'ou vient l'erreur ? ^o)

    Si vous ne savez pas, vous pourriez me donner un code (affichant JUSTE un simple rectangle) qui fonctionne en copier//collé que je puisse comprendre parce que la sérieux j'en peux plus . Sur le net les exemples sont soit trop compliqués soit inefficaces.

    D'avance merci.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Pour pouvoir dessiner dans un GdkDrawable, il faut avant tout que celui-ci soit initialisé.
    Le fait d'écrire window = gtk_window_new(GTK_WINDOW_TOPLEVEL); n'est pas suffisant. Il faut aussi faire un appel direct à la fonction gtk_widget_realize();.

    En règle générale on ne dessine pas dans un GtkWindow mais plutôt dans un GtkDrawingArea, widget dédié à ce genre de chose.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Par défaut
    Oui j'avais déjà lu ca, mais je n'avais pas vraiment saisi la chose.

    J'ai fait comme tu me l'as dit (en tout cas comme j'ai cru l'entendre), j'ai déclaré une variable widget de type gdkwiget* puis je l'ai initialisé et je l'ai ensuite filé en paramètre a draw_rectangle.

    Cela donne ceci, mais toujours sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     widget = gtk_drawing_area_new();
      gdk_draw_rectangle (widget->window, widget->style->black_gc, TRUE, 0, 0, 200, 200);
    Excuse moi s'il y a certains point que je n'ai pas saisi j'ai encore un peu de mal avec GTK ... :s

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je me suis mal exprimé, ou du moins un peu vite.

    Pour essayer d'être un peu plus explicite, il faut dessiner dans un GtkDrawingArea. Ca je l'ai déjà dit . Mais le dessin ne peut se faire que par un appel à un callback via le signal "expose-event". Aie, ca se complique !

    Ne t'inquiète pas, j'ai écris un code opérationnel en partant du tien. Je l'ai épuré pour la clarté. Je te conseille pour finir de regarder les fonctions cairo pour le dessin ( là je fais plaisir à liberforce ).
    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    gboolean Callback_draw(GtkWidget *drawing, GdkEventExpose *event, gpointer user_data)
    {
    	GdkGC *GC = gdk_gc_new(drawing->window);
    	gdk_draw_rectangle (drawing->window, GC, TRUE, 50, 50, 200, 200);
    	g_object_unref(GC);
     
    	return FALSE;
    }
     
     
    int main(int argc, char *argv[])
    {
    	GtkWidget *window;
    	GtkWidget *drawing=NULL;
     
    	gtk_init(&argc, &argv);
    	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
    	gtk_window_set_title(GTK_WINDOW(window), "Synchromix -- By Cyberbros");
    	g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),0);
     
    	/* Création d'un GtkDrawingArea et insertion dans la fenêtre principale */
    	drawing=gtk_drawing_area_new();
    	gtk_widget_set_size_request(drawing, 200,200);
    	gtk_container_add(GTK_CONTAINER(window), drawing);
     
    	/* Affectation d'un callback dans lequel on va dessiner associé au signal "expose-event" */
    	g_signal_connect(G_OBJECT(drawing), "expose-event", (GCallback)Callback_draw, NULL);
     
    	gtk_widget_show_all(window);
     
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }

  5. #5
    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
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je te conseille pour finir de regarder les fonctions cairo pour le dessin ( là je fais plaisir à liberforce ).
    Hé hé, comme quoi ça marche lobbying

Discussions similaires

  1. Problème debutant pour un formulaire tous simple
    Par legend dans le forum Langage
    Réponses: 5
    Dernier message: 24/04/2007, 22h17
  2. [Debutant] pour bien débuter..
    Par BENZ RABIE dans le forum Débuter
    Réponses: 1
    Dernier message: 06/04/2007, 00h44
  3. Aide debutant pour connexion aux DB
    Par eclesia dans le forum Contribuez
    Réponses: 5
    Dernier message: 26/01/2007, 19h30
  4. Réponses: 3
    Dernier message: 16/05/2006, 23h30
  5. [debutant] pour debbuger un petit prog avec menu
    Par niluge01 dans le forum Windows
    Réponses: 3
    Dernier message: 22/11/2003, 14h03

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