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 :

Je ne comprend pas "on_expose_event"


Sujet :

GTK+ avec C & C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Par défaut Je ne comprend pas "on_expose_event"
    Bonjour !

    Voilà, j'ai beaucoup de mal a comprendre l'utilité de ce signal, ok il se lance quand on redimentionne ou deplace une fenêtre.

    Mais pourquoi se lance il constamment ?

    Est-ce normal ?

    Dans mon programme, je dessine avec cairo un motif en appuyant sur une touche du clavier grâce au signal "key_pressed", mais tout de suite après on_expose_event me le supprime . . .

    Bref, j'ai raté quelque chose ?

  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 : 54
    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 n'ai peut être pas bien cherché mais je ne trouve nul part le signal "on_expose_event". Plus généralement si tu travailles sous
    1. Gtk2+ c'est le signal "expose-event" qui est émis,
    2. Gtk3+ c'est le signal "draw" qui l'est.

    Ces signaux sont émis lorsque l'espace graphique considéré doit être mis à jour. Donc le principe est d'insérer dans le callback associé à ces signaux le dessin à afficher.

  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
    Par défaut
    En fait, le principe c'est de mémoriser dans ta callback au signal key_pressed que tu as quelque chose en particulier à dessiner.

    Ensuite tu appelles gtk_widget_queue_draw ou gtk_widget_queue_draw_area pour redessiner un widget ou une zone d'un widget. Cela provoque l'émission du signal expose-event. Dans la callback associée à ce signal, tu regardes ce que tu as à dessiner, et c'est là que tu dessines avec cairo.

    La raison pour laquelle le dessin se fait toujours uniquement en réponse à l'expose-event, c'est que ce dernier est appelé dans plusieurs cas, notamment en as de redimensionnement de le fenêtre, et qu'il faut bien savoir en quoi cela altère ce qui était déjà dessiné. Par défaut, tout est redessiné, mais il y a du double buffering pour éviter de dégrader les performances.

    N'oublie pas d'utiliser les fonctions "clip" comme cairo_clip, cela permet de réduire la zone que tu souhaites réellement redessiner, et d'améliorer les performances.

    @gerald3d:
    C'est sa callback au signal "expose-event" qui s'appelle on_expose_event...

  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 : 54
    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
    Citation Envoyé par liberforce Voir le message
    @gerald3d:
    C'est sa callback au signal "expose-event" qui s'appelle on_expose_event...
    Ha OK ! Je n'avais pas tout suivi

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 8
    Par défaut
    Merci beaucoup

    Donc, dès qu'on veut dessiner un truc avec cairo, il faut passer par expose-event.

    D'accord, mais, ça devient vite le foutoir alors non ?

    Dans mon projet, j'ai des objets (par centaines) qui possèdent chacun des coordonnées.

    J'ai donc créé une classe correspondant a ce objets, et dans cette classe, j'ai une méthode permettant d'afficher l'objet (comme ça je les affiches un a un).

    Du coup je peux faire comment pour afficher tout ça avec expose-event ? (sachant que je ne peut pas utiliser la méthode pour afficher l'objet a partir d'expose-event, ayant une autre classe entre les deux)

    Sinon, on ne peut pas desactiver le signal expose-event ?, de toute manière mon programme est maximisé, et au pire si l'utilisateur décide de le réduire, il aura qu'a le relancer, au moins ça fonctionnera

  6. #6
    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 Soporythmique Voir le message
    Merci beaucoup
    Donc, dès qu'on veut dessiner un truc avec cairo, il faut passer par expose-event.
    Si tu dessines pour une fenêtre graphique GTK, oui.

    Citation Envoyé par Soporythmique Voir le message
    Merci beaucoup
    D'accord, mais, ça devient vite le foutoir alors non ?

    Dans mon projet, j'ai des objets (par centaines) qui possèdent chacun des coordonnées.
    Question, est-ce que l'utilisateur doit interagir avec les éléments dessinés ?

    Citation Envoyé par Soporythmique Voir le message
    J'ai donc créé une classe correspondant a ce objets, et dans cette classe, j'ai une méthode permettant d'afficher l'objet (comme ça je les affiches un a un).

    Du coup je peux faire comment pour afficher tout ça avec expose-event ? (sachant que je ne peut pas utiliser la méthode pour afficher l'objet a partir d'expose-event, ayant une autre classe entre les deux)
    Je ne comprends rien à ton histoire de classe "entre les deux". Tu as un exemple ? Je ne vois pas pourquoi tu ne pourrais pas réutiliser ta méthode existante pour afficher ton objet...

    Citation Envoyé par Soporythmique Voir le message
    Sinon, on ne peut pas desactiver le signal expose-event ?, de toute manière mon programme est maximisé, et au pire si l'utilisateur décide de le réduire, il aura qu'a le relancer, au moins ça fonctionnera
    expose-event est appelé dès qu'il y a quelque chose à dessiner. Cela arrive aussi si une autre fenêtre apparait devant la tienne (encore que, avec les compositeurs modernes, c'est moins vrai me semble-t-il). Le meilleur test est de mettre une trace dans la callback et voir quelles actions déclenchent son appel.

    Mais de toute façon, cet événement est incontournable, et faire autre chose désharçonnerait toute personne cherchant à reprendre ton code. Quitte à faire les choses, autant les faire bien, non ?

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