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
Partager