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 :

[Gtkmm] DrawingArea dans une autre DrawingArea


Sujet :

GTK+

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut [Gtkmm] DrawingArea dans une autre DrawingArea
    Bonjour.

    J'ai 2 classes, qui héritent chacune de DrawingArea.
    Dans mon programme principale, j'affiche le premier objet dans une HBox, rien de plus normal. J'ai donc redéfini la methode on_expose_even() de ma premiere classe pour qu'elle s'affiche (en l'occurence une image):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool Class1::on_expose_event(GdkEventExpose* event)
    { 
    Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file("fichier.svg");
    image->render_to_drawable(get_window(), get_style()->get_black_gc(),
    			    0, 0, 0, 0, image->get_width(), image->get_height(),
    			    Gdk::RGB_DITHER_NONE, 0, 0);
    }
    Ma deuxieme class doit pouvoir etre affichée de la même manière par le programme principal. jusque là, aucun souci.
    SAUF que certaine fois mon objet1 peut posséder des objet2, et donc j'aimerai que l'objet1 puisse afficher son image comme avant, + des objet2.
    Comment puis-je faire celà ? j'ai penser à faire un truc du style objet2.get_pixbuf() et l'afficher de la même maniere que mon image mais je ne sais pas comment faire.
    des petites idées ?

    Merci d'avance,
    Sylvain

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Je pense m'être trompé de Catégorie, si un modo passe apr là pourait-il mettre ce post dans la catégorie GTK+ ?
    merci

  3. #3
    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
    Bonjour,

    Ma première idée serait que class2 hérite de class1 puis tu fait un appel à la fonction de la classe fille. Voici un exemple simple :
    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
    #include <iostream>
     
    class A
    {
      public:
        void draw ()
        {
          std::cout << "A" << std::endl;
        }
    };
     
    class B : public A
    {
      public:
        void draw ()
        {
          A::draw ();
          std::cout << "B" << std::endl;
        }
    };
     
    int main ()
    {
      B b;
      b.draw ();
      return 0;
    }

    Sinon en utilisant l'amitié (friend)

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Hum le probleme c'est que classe2 n'est en aucun cas une sorte de classe1.
    exemple, une pomme et un arbre : on peu avoir un arbre tout seul, une pomme toute seule, mais aussi un arbre avec une pomme. dans cette exemple, faire hériter la pomme d'un arbre parait innapproprié.

    Donc l'héritage et l'amitié sont un bon moyen pour l'échange de paramètres mais ne va pas trop dans mon sens, moi j'aimerai que classe1 ne s'occupe pas de comment va etre affiché classe2, chacun son job

    ça marche très bien avec des Box par exemple,
    pack_start(A1);
    pack_start(B1);
    A2.pack_start(B2);
    pack_start(A2);
    mais j'aimerai faire pareil avec des DrawingArea

  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
    Ok, je vois

    Dans ce cas, tu créer une méthode Class1::Add(Class2) qui ajoute ta pomme à ton arbre (tu gère ça avec un vertor en interne, par exemple).

    Et dans la méthode Class1:raw() tu fait un foreach sur ton vector et tu appel la méthode Draw de chaque Class2 (donc la méthode doit être publique).

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Pour ce qui est du Add() et vector j'ai déjà fait (perso j'ai utilisé une list, plus adapté à mon cas)

    C'est le draw qui m'interesse ... moi j'ai pas de fonction draw. mes classe1 et classe2 héritent de DrawinfArea, donc dans mon programme principal je fait un pack_start(classe1) qui appel la methode on_expose_event(GdkEventExpose* event) de classe1 dans lequel je rajoute mon image, et je parcour ma liste. Mais dans ma boucle, comment je fait mon "pack_start(classe2)" ?

    j'ai vu dans la doc une astuce pour forcer le réaffichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // force our program to redraw the entire clock.
        Glib::RefPtr<Gdk::Window> win = get_window();
        if (win)
        {
            Gdk::Rectangle r(0, 0, get_allocation().get_width(),
                    get_allocation().get_height());
            win->invalidate_rect(r, false);
        }
    mais ça me dis toujour pas de comment j'ajoute classe2 à classe1

  7. #7
    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
    Alors après une rapide recherche, c'est la méthode GtkWidget::ExposeEvent qui redessine le widget. Par contre il faut sûrement lui attacher une fenêtre sur laquelle dessiner.

    Il faudrait voir comment fonctionnent les Gtk::Box & co

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Hum bon je patauge dans la semoule là. Y'aurai pas une feinte pour arriver à quelque chose du style DrawingArea::ToPixbuf() ?

  9. #9
    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
    Ta DrawingArea est associée à une GdkWindow qui est un GdkDrawable, tu dois pouvoir faire des choses à partir de ça. Par contre, vu la façon dont fonctionne X, si une partie de ta DrawingArea est cachée (par une autre fenêtre par exemple) et que tu modifies ce qui est dessiné dedans, le changement ne sera pas forcément répercuté dans la GdkWindow correspondante.

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    oki doki, merci pour la piste, je vais essayer de fouiller là dedant.

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

Discussions similaires

  1. gtkmm : DrawingArea dans une ScrolledWindow
    Par superZozo dans le forum GTK+
    Réponses: 2
    Dernier message: 20/07/2012, 09h11
  2. Réponses: 2
    Dernier message: 28/08/2003, 00h00
  3. Reprendre une procedure dans une autre ?
    Par Poisson Rouge dans le forum Langage
    Réponses: 3
    Dernier message: 17/07/2002, 22h51
  4. Réponses: 2
    Dernier message: 10/07/2002, 11h51
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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