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 :

utiliser cairo en cinématique


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut utiliser cairo en cinématique
    Bonjour à tous,

    J'utilise actuellement la library cairo pour générer des graphiques vectoriels. Ca marche plutôt bien (super bien faite cette library !). Je voudrais que -en réponse à des actions de l'utilisateur (par exemple, taper une touche, etc.) - le graphique puisse être modifié (ajout d'info, retrait d'info, re-tracage, etc.). Le problème est que je peux facilement rajouter ce que je veux dans un GtkDrawingArea mais pas effacer. Il n'y a pas de rafraichissement par défaut. Comment puis-je faire ça ? Prenons l'exemple d'une balle qui rebondi et que ceci soit géré par une fonction appelée à intervalle régulier par g_timeout_add(). Le code suivant donne un exemple de ceci:

    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
    /* travail avec cairo en cinématique */
    #include <stdio.h>
    #include <cairo.h>
    #include <gtk/gtk.h>
     
    double centre_x=185.,centre_y=295.;
    double sens_x=10.,sens_y=10.;
    GtkWidget *drawarea; /* drawing area */
     
    gboolean update(gpointer pData)
    {
        cairo_t *cr=NULL;
        cr=gdk_cairo_create(drawarea->window);
        cr=gdk_cairo_create(drawarea->window);
        if ((centre_x+sens_x)>375.) sens_x=-sens_x;
        if ((centre_x+sens_x)<20.) sens_x=-sens_x;
        if ((centre_y+sens_y)>575.) sens_y=-sens_y;
        if ((centre_y+sens_y)<20.) sens_y=-sens_y;
        centre_x+=sens_x;
        centre_y+=sens_y;
        cairo_move_to(cr,centre_x+10.,centre_y);
        cairo_arc(cr, centre_x,centre_y, 10., 0.,6.28);
        cairo_stroke(cr);
        cairo_destroy(cr);
        return TRUE;
    }
    int main(int argc, char *argv[])
    {
        GtkWidget *window;
        gboolean on_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer userdata);
        gtk_init(&argc, &argv);
        window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(window), 400, 600);
        gtk_window_set_title(GTK_WINDOW(window), "GTK window");
        drawarea=gtk_drawing_area_new();
        gtk_container_add (GTK_CONTAINER(window), drawarea);
        g_signal_connect(G_OBJECT(drawarea), "expose_event", G_CALLBACK(on_expose_event), NULL);
        g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_timeout_add((guint)10, update,NULL); /* fonction appeler à intervale régulier */
        gtk_widget_show_all(window);
        gtk_main();
        return 0;
    }
    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, .0, .0, .0);
        cairo_rectangle(cr, 10.,10.,380.,580.);
        cairo_move_to(cr,centre_x+10.,centre_y);
        cairo_arc(cr, centre_x,centre_y, 10., 0.,6.28);
        cairo_stroke(cr);
        cairo_destroy(cr);
        return FALSE;
    }
    Il n'y a pas de rafraichissement, comme il pourrait en y avoir si je mettais par exemple à jour un label. Sauf si je redimensionne à la main la fenêtre et dans ce cas, l'évènement expose_event est capté et ma fonction on_expose_event() fait son boulot.

    En clair, comment forcer le rafraichissement de ma/mes fenêtre/s dans ce cas ?

    D'avant merci pour toute aide sur ce point.

    Cordialement,

    Eric.

  2. #2
    Membre confirmé
    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
    Par défaut
    Ok, je me réponds à moi-même. A force de chercher, j'ai trouvé la solution. Il suffit d'invalider la région qui sera alors automatiquement rafraichie par la callback associée au signal expose-event. Il y a plusieurs fonctions qui font ça. La fonction gtk_widget_queue_draw_area() est celle que j'utilise et ca marche bien.

    Le problème est donc résolu.

    Au cas où ca serve à d'autres..

    Eric.

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

Discussions similaires

  1. Problème d'utilisation de CAIRO
    Par Ctotomatic dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 28/10/2011, 00h08
  2. Comment utiliser Cairo
    Par Senaku-seishin dans le forum GTK+
    Réponses: 3
    Dernier message: 26/01/2008, 22h13
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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