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++

  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