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.