Bonjour,

Je suis en train de développer du code sous gtk+ avec la library cairo. Je tombe sur un comportement que je comprends pas, et que je n'arrive pas à résoudre. Voici un exemple bidon qui explique ce que je veux faire:

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
/* travail avec cairo */
#include <stdio.h>
#include <cairo.h>
#include <gtk/gtk.h>
 
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *drawarea;
    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), 600, 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);
    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);
    /* première couleur */
    cairo_set_source_rgb(cr, .0, .0, .0);
    cairo_move_to(cr, 300.0, 300.0);
    cairo_line_to(cr,400.0,400.);
    /* deuxième couleur */
    cairo_set_source_rgb(cr, 1., .0, .0);
    cairo_line_to(cr,200.0,400.);
    cairo_stroke(cr);
    cairo_destroy(cr);
    return FALSE;
}
Bref, je veux changer de couleur (ou de type de trait, etc.) en cours de route. Ca ne marche pas. La seconde couleur (ou type de trait, etc.) est celle qui est utilisée tout le long du tracé. Pourtant, la doc de cairo_set_source_rgb() spécifie bien "[The] opaque color will then be used for any subsequent drawing operation until a new source pattern is set.". Il y a (encore) clairement quelque chose qui m'échappe, et toute aide sur ce point est la bienvenue.

D'avance merci.

Cordialement, Eric.