Bonjour,
Mon programme a un GtkButton qui contient une GtkImage. Lorsque la souris passe sur l'image, j'aimerais que l'image change. Si quelqu'un a une idée de comment faire ?
Bonjour,
Mon programme a un GtkButton qui contient une GtkImage. Lorsque la souris passe sur l'image, j'aimerais que l'image change. Si quelqu'un a une idée de comment faire ?
J'ai trouvé avec gtk_container_remove() et g_object_ref() pour réutiliser le widget. g_object_ref() doit être appelée avant gtk_container_remove() sinon le widget est détruit, à moins qu'il ne soit référencé autre part.
Bonjour.
Serait-il possible de voir le code de construction de ton bouton ?
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
Voilà:Et les fonctions de traitement des signaux:
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 l->button = gtk_button_new(); GTK_WIDGET_UNSET_FLAGS (l->button, GTK_CAN_DEFAULT); GTK_WIDGET_UNSET_FLAGS (l->button, GTK_CAN_FOCUS); gtk_box_pack_start(GTK_BOX(l->hboxlabel),l->button,FALSE,FALSE,0); gtk_button_set_relief (GTK_BUTTON (l->button), GTK_RELIEF_NONE); gtk_widget_show(l->button); l->sig_handler_tab_close = g_signal_connect ((gpointer) l->button, "clicked", G_CALLBACK (on_button_editor_tab_close_clicked), NULL); l->sig_handler_tab_close_enter = g_signal_connect ((gpointer) l->button, "enter-notify-event", G_CALLBACK (on_button_editor_tab_close_enter), NULL); l->sig_handler_tab_close_leave = g_signal_connect ((gpointer) l->button, "leave-notify-event", G_CALLBACK (on_button_editor_tab_close_leave), NULL); l->sig_handler_tab_close_pressed = g_signal_connect ((gpointer) l->button, "button-press-event", G_CALLBACK (on_button_editor_tab_close_pressed), NULL); l->sig_handler_tab_close_released = g_signal_connect ((gpointer) l->button, "button-release-event", G_CALLBACK (on_button_editor_tab_close_released), NULL); l->sig_handler_tab_close_expose = g_signal_connect ((gpointer) l->button, "expose-event", G_CALLBACK (on_button_editor_tab_close_expose), NULL); l->image_normal = gtk_image_new_from_file("close.png"); l->image_enter = gtk_image_new_from_file("close_hover.png"); l->image_pressed = gtk_image_new_from_file("close_clicked.png"); gtk_container_add(GTK_CONTAINER(l->button),l->image_normal); gtk_widget_show(l->image_normal); gtk_widget_show(l->image_enter); gtk_widget_show(l->image_pressed);
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
89
90
91
92
93
94
95
96
97 int pressed = 0; int leaved_once = 0; void on_button_editor_tab_close_clicked (GtkButton *button, gpointer user_data) { LISTE_OPEN_FILES * l = liste_editor_open_files; while(l != NULL) { if(GTK_BUTTON(l->button) == button) break; l = l->suiv; } editor_close(l); } gboolean on_button_editor_tab_close_enter (GtkButton *button, gpointer user_data) { LISTE_OPEN_FILES * l = liste_editor_open_files; while(l != NULL) { if(GTK_BUTTON(l->button) == button) break; l = l->suiv; } if(pressed == 0) { g_object_ref(l->image_normal); gtk_container_remove(GTK_CONTAINER(l->button),l->image_normal); gtk_container_add(GTK_CONTAINER(l->button),l->image_enter); } else { g_object_ref(l->image_normal); gtk_container_remove(GTK_CONTAINER(l->button),l->image_normal); gtk_container_add(GTK_CONTAINER(l->button),l->image_pressed); } return FALSE; } gboolean on_button_editor_tab_close_leave (GtkButton *button, gpointer user_data) { LISTE_OPEN_FILES * l = liste_editor_open_files; while(l != NULL) { if(GTK_BUTTON(l->button) == button) break; l = l->suiv; } if(pressed == 0) { if(leaved_once == 1) leaved_once = 0; else { g_object_ref(l->image_enter); gtk_container_remove(GTK_CONTAINER(l->button),l->image_enter); gtk_container_add(GTK_CONTAINER(l->button),l->image_normal); } } else { g_object_ref(l->image_pressed); gtk_container_remove(GTK_CONTAINER(l->button),l->image_pressed); gtk_container_add(GTK_CONTAINER(l->button),l->image_normal); leaved_once = 1; } return FALSE; } gboolean on_button_editor_tab_close_pressed (GtkButton *button, gpointer user_data) { LISTE_OPEN_FILES * l = liste_editor_open_files; while(l != NULL) { if(GTK_BUTTON(l->button) == button) break; l = l->suiv; } if(pressed == 0) { g_object_ref(l->image_enter); gtk_container_remove(GTK_CONTAINER(l->button),l->image_enter); gtk_container_add(GTK_CONTAINER(l->button),l->image_pressed); } pressed = 1; return FALSE; } gboolean on_button_editor_tab_close_released (GtkButton *button, gpointer user_data) { pressed = 0; return FALSE; } gboolean on_button_editor_tab_close_expose (GtkButton *button, gpointer user_data) { // Supprime le cadre bleu autour du bouton lorsque la souris est sur le bouton: gtk_widget_set_state((GtkWidget*)button,GTK_STATE_NORMAL); return FALSE; }
Les fonctions gtk_button_set_image(); et gtk_button_get_image(); ne feraient-elles pas l'affaire ?
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager