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 :

cairo et widget inclus dans d'autres widgets


Sujet :

GTK+

  1. #1
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Points : 84
    Points
    84
    Par défaut cairo et widget inclus dans d'autres widgets
    Bonjour,

    Je suis en train de me heurter à un problème tout simple (que j'ai déjà résolu dans le passé) dans l'usage de la librairy cairo.

    Voici un exemple bidon qui marche bien, dans lequel je défini une GtkDrawingArea qui est le seul élément de la fenêtre principale, et j'y trace un trait dedans.

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <strings.h>
    #include <cairo.h>
    #include <gtk/gtk.h>
    #include <glib.h>
    #include <glib/gstdio.h>
     
    GtkWidget *pWindow; /*fenetre principale */
    GtkWidget *drawarea; /* drawing area */
     
    int main (int argc, char *argv[])
    {
        void OnDestroy(GtkWidget *pWidget, gpointer pData); /* fonction call back destroy */
        gboolean on_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer userdata);
        gtk_init(&argc, &argv);
        /* création de la fenetre */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /* définition des paramètres de la fenetre */
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 200, 200);
        drawarea=gtk_drawing_area_new();
        gtk_container_add (GTK_CONTAINER(pWindow), drawarea);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(drawarea), "expose_event", G_CALLBACK(on_expose_event), NULL);
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
    gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer userdata)
    {
        cairo_t *cr=NULL;
        cr=gdk_cairo_create(widget->window);
        cairo_set_source_rgb(cr, .1, .0, .0);
        cairo_set_line_width(cr, 2.0);
        cairo_move_to(cr, 10., 10.);
        cairo_line_to(cr,100.,100.);
        cairo_stroke(cr);
        cairo_destroy(cr);
        return FALSE;
    }
    Tout marche correctement. So far so good.

    A présent, un autre exemple bidon où la GtkDrawingArea est cette fois-ci un élément d'une GtkHBox :

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <strings.h>
    #include <cairo.h>
    #include <gtk/gtk.h>
    #include <glib.h>
    #include <glib/gstdio.h>
     
    GtkWidget *pWindow; /*fenetre principale */
    GtkWidget *drawarea; /* drawing area */
    GtkWidget *pHBox; /* une box horizontal */
    GtkWidget *quit; /* bouton quit */
     
    int main (int argc, char *argv[])
    {
        void OnDestroy(GtkWidget *pWidget, gpointer pData); /* fonction call back destroy */
        gboolean on_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer userdata);
        gtk_init(&argc, &argv);
        /* création de la fenetre */
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        /* définition des paramètres de la fenetre */
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 200, 200);
        drawarea=gtk_drawing_area_new();
        pHBox=gtk_hbox_new(FALSE, 0);
        quit=gtk_button_new_with_label(" Quit ");
        gtk_box_pack_start(GTK_BOX(pHBox), quit, FALSE, TRUE, 1);
        gtk_box_pack_start(GTK_BOX(pHBox), drawarea, FALSE, TRUE, 1);
        gtk_container_add (GTK_CONTAINER(pWindow), pHBox);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(drawarea), "expose_event", G_CALLBACK(on_expose_event), NULL);
        g_signal_connect(G_OBJECT(quit), "clicked", G_CALLBACK(gtk_main_quit), NULL);
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
    gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer userdata)
    {
        cairo_t *cr=NULL;
        cr=gdk_cairo_create(widget->window);
        cairo_set_source_rgb(cr, .1, .0, .0);
        cairo_set_line_width(cr, 2.0);
        cairo_move_to(cr, 10., 10.);
        cairo_line_to(cr,100.,100.);
        cairo_stroke(cr);
        cairo_destroy(cr);
        return FALSE;
    }
    Et bien, impossible de dessiner dedans, et je n'arrive pas à trouver pourquoi, alors que j'ai fait ce genre de trucs des centaines de fois par le passé. Ca ressemble à une erreur d'étourderie, mais je ne vois pas. Si une âme charitable pouvait m'aider..

    D'avance merci, Eric.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Effectivement ton problème est tout simple. Ton GtkDrawingArea a une taille de (0, 0). Donne-lui une taille de départ tu verras apparaître ton trait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_set_size_request (drawarea, 300, 300);
    Histoire de peaufiner un peu dans le callback récupérer le GdkWindow directement pourrait poser des problèmes de compatibilité selon les version de la bibliothèque. Utilise plutôt la fonction adéquate, c'est plus propre .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cr=gdk_cairo_create(gtk_widget_get_window (widget));

  3. #3
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Points : 84
    Points
    84
    Par défaut
    Merci!

    Très simple effectivement, comme je l'imaginais..

    Problème résolu !

    Un grand merci.

    Eric.

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

Discussions similaires

  1. Comment détruire un widget créé dans une autre fonction?
    Par elwario91 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 08/04/2008, 12h02
  2. Polygone inclus dans un autre
    Par Mic75 dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 17/11/2007, 20h41
  3. Bind variable incluse dans une autre bind variable
    Par kinder_pingui dans le forum SQL
    Réponses: 3
    Dernier message: 28/11/2006, 10h35
  4. Comment trouver des structures incluses dans d'autres
    Par Vulcanos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/10/2006, 23h59
  5. Probleme de composant inclus dans un autre.
    Par viro dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/04/2004, 15h44

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