bonjour tous le monde ...
Voila je suis en train de réaliser une application avec GTK.
Cette application permet de créer des schemas electrique c'est a dire qu'on dispose d'un ensemble de circuits électriques dans la barre d'outils, et à partir de cette barre on clic sur un bouton (circuit) et puis avec un clic de souris on insère le circuit (c'est un pixmap) dans la drawing area....
J'ai réalisé tous ça!! Mais mon problème c'est de pouvoir manipuler le pixmap dans la drawing area c'est a dire le déplacer avec clic enfoncé de souris.
Alors existe t-il une fonction qui permet de rendre le pixmap dans la drawing area sensible aux évènements GDK ?

Voila mon code les callbacks de mon application
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
GdkPixmap *pixmap = NULL;
void
destroy (GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}
gboolean configure_event( GtkWidget         *widget,
GdkEventConfigure *event )
{
    if (pixmap)
    g_object_unref (pixmap);
 
    pixmap = gdk_pixmap_new (widget->window,
    widget->allocation.width,
    widget->allocation.height,
    -1);
    gdk_draw_rectangle (pixmap,
    widget->style->white_gc,
    TRUE,
    0, 0,
    widget->allocation.width,
    widget->allocation.height);
 
    return TRUE;
}
gboolean expose_event( GtkWidget      *widget,
GdkEventExpose *event )
{
    gdk_draw_drawable (widget->window,
    widget->style->fg_gc[gtk_widget_get_state (widget)],
    pixmap,
    event->area.x, event->area.y,
    event->area.x, event->area.y,
    event->area.width, event->area.height);
 
    return FALSE;
}
GdkPixmap *pix = NULL ;
GdkBitmap *mask;
GtkStyle *style;
gboolean button_press_event( GtkWidget      *widget,
GdkEventButton *event )
{
 
    if (event->button == 1 && pixmap != NULL)
    draw_image (widget, event->x, event->y);
 
    return TRUE;
}
 
gboolean motion_notify_event( GtkWidget *widget,
GdkEventMotion *event )
{
    int a, b;
    GdkModifierType state;
 
 
    gdk_window_get_pointer (event->window, &a, &b, &state);
 
 
 
 
    return TRUE;
}
 
void draw_image( GtkWidget *widget,
gdouble    a,
gdouble    b)
{
    gdouble f,g;
    f=a-10;
    g=b-10;
 
    style = gtk_widget_get_default_style();
 
 
    pix = gdk_pixmap_create_from_xpm( pixmap,&mask,&style->bg[GTK_STATE_NORMAL],"./circuit.xpm" );
 
    gdk_draw_drawable (pixmap,
    widget->style->fg_gc[gtk_widget_get_state (widget)],
    pix,
    0,0 ,
    f, g,
    -1, -1);
    gtk_widget_queue_draw_area (widget,
    f, g,20, 20);
    gtk_widget_set_sensitive (GTK_WIDGET (pix), TRUE);
}