Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Les widget

Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Les widgets Nous avons vu dans les cours précédents la complexité de programmer en utilisant uniquement la Xlib, en effet il nous manque des objets essentiels comme les boutons, les menus, ... que l'on appelle les widgets. Voici une définition du site wikipedia : Widget est un mot anglais qui est apparu aux États-Unis dans les années 1920. De manière générale, il est utilisé pour désigner un objet banal et quelconque, en français on peut le traduire par « machin » ou gadget. L'origine du mot est d'ailleurs probablement une déformation de ce dernier. Selon l'Office québécois de la langue française (www.granddictionnaire.com), on peut traduire widget par « métachose » ou bien « machin » ou encore « gadget logiciel ». En informatique, le mot widget recouvre deux notions distinctes en relation avec les interfaces graphiques (en ce sens, certains pensent que widget est un mot-valise formé des mots window (fenêtre) et gadget, ce qui signifierait donc « gadget de fenêtre »), il peut désigner : ● Un élément de base d'une interface graphique (liste déroulante, bouton, etc.) que l'on peut désigner également par le terme calqué de l'anglais contrôle ; ● Un petit outil qui permet d'obtenir des informations (météo, actualité, dictionnaire, carte routière, pense-bête (en anglais post-it), traducteur etc.) Plutôt que d'avoir à redéfinir ces objets soi même (ce qui reste possible évidemment), on utilisera une librairie qui proposera ce type d'objets avec évidemment un style différent pour chacune d'entres elles. Il est alors évident que l'ensemble de ces librairies reposent toutes sur la Xlib standard (en ce qui concerne la programmation Xwindow). Dans ce cours nous allons nous intéresser plus particulièrement à l'une d'entre elle : GTK, qui a été créée initialement pour le projet GIMP, en effet GTK signifie Gimp ToolKit. Il existe évidemment d'autres toolkit comme Xt/Motif ou encore Qt (utilisé par KDE). Page 1 / 12 Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Programmation événementielle Nous avons vu dans la programmation Xlib que les fenêtres d'un programme pouvaient recevoir des événements particuliers comme le déplacement de la souris, l'appui d'une touche, ... Le programmeur se doit ensuite de faire le tri, et de déterminer quels sont les actions à entreprendre en fonction de l'évènement, du contexte, ... Ce type de programmation est inadapté à la programmation par widgets, en effet, lorsque le programme reçoit un évènement, il faudrait déterminer par exemple ou se trouve le pointeur de souris pour savoir de quel objet il s'agit par exemple, d'où la nécessité d'une autre approche : La programmation évènementielle. Dans la programmation événementielle ce sont les actions de l'utilisateur qui déclenchent des évènements associés à un objet particulier, par exemple, le fait de cliquer avec le curseur de la souris sur le bouton « A » va déclencher l'évènement « click » associé à l'objet « Bouton A », et uniquement celui ci. Le programmeur va donc définir pour chacun des objets qu'il utilise, les évènements gérés pour cet objet, et donc les actions associées à la gestion de cet évènement pour cet objet. Page 2 / 12 Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Premier programme /* prog1.c */ #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return 0; } La compilation de ce programme va s'effectuer par la commande suivante : gcc prog1.c -o prog1 `gtk-config --cflags --libs` Ceci utilise GTK version 1, si vous voulez utiliser GTK2, il faudra taper : gcc prog1.c -o prog1 `pkg-config --cflags --libs gtk+-2.0` Exercice 1 : Testez ce programme avec les deux librairies. Page 3 / 12 Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Deuxième programme /* prog2.c */ #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label ("Bonjour"); gtk_container_add (GTK_CONTAINER (window), button); gtk_widget_show (button); gtk_widget_show (window); gtk_main (); return 0; } Exercice 2 : Testez ce programme avec les deux librairies. Remarque : Plutôt que de réaliser un appel à la fonction gtk_widget_show() pour chaque objet, on peut le faire en une seule fois : gtk_widget_show_all (window); Page 4 / 12 Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Les fenêtres ● Nous avons vu dans les précédents programmes comment créer une fenêtre principale avec la fonction gtk_window_new () qui prend en argument le type de fenêtre que l'on souhaite créer, le paramètre peut être GTK_WINDOW_ TOPLEVEL, GTK_WINDOW_DIA LOG ou GTK_WINDOW_POPU P. ● Pour donner un titre à notre fenêtre on utilisera la fonction : void gtk_window_set_title (GtkWindow *window, const gchar *title); On peut récupérer le titre avec la fonction inverse : G_CONST_RETURN gchar* gtk_window_get_title (GtkWindow *window); ● On pourra donner une taille spécifique à notre fenêtre en utilisant la fonction : void gtk_window_set_default_size (GtkWindow *window, gint largeur, gint hauteur); Et récupérer cette taille avec la fonction : void gtk_window_get_default_size (GtkWindow *window, gint *width, gint *height); ● Pour positionner une fenêtre avant son affichage on utilise : void gtk_window_set_position(GtkWindow* window, GtkWindowPosition position); Avec l'argument « position » : ● GTK_WIN_POS_NONE : la fenêtre aura une position aléatoire lors de son affichage ; ● GTK_WIN_POS_CEN TER : la fenêtre sera centrée à l'écran ; ● GTK_WIN_POS_MOU SE : le coin supérieur droit de la fenêtre correspondra à la position de la souris au moment de l'affichage ; ● GTK_WIN_POS_CEN TER_ALWAYS : la fenêtre sera centrée et ne pourra être déplacée ; ● GTK_WIN_POS_CEN TER_ON_PARENT : la fenêtre sera centrée par rapport à la fenêtre parente. Pour déplacer cette fenêtre pendant le programme : void gtk_window_move(GtkWindow *window, gint x, gint y); Pour récupérer cette position : void gtk_window_get_position(GtkWindow *window, gint *root_x, gint *root_y); Exercice 3 : Faites un programme prog3.c qui utilisera les fonctions précédentes (taille, position, titre), vous aurez besoin de la fonction GTK_WINDOW(<widget fenêtre>) pour éviter les messages d'avertissements. Page 5 / 12 Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie Placement des objets Nous avons vu précédemment que pour insérer un objet dans la fenêtre on utilisait la fonction gtk_container_add(), qui fonctionne pour un objet mais pas plusieurs !!! Pour cela nous allons devoir utiliser d'autres conteneurs ou boites (ou box) qui sont aussi des widgets. On peut par exemple créer des boites horizontales ou verticales avec : GtkWidget* gtk_hbox_new(gboolean homogeneous, gint spacing); GtkWidget* gtk_vbox_new(gboolean homogeneous, gint spacing); où homogeneous précise si tous les widgets utilisent un espace identique et spacing précise l'espacement. Ensuite nous pouvons placer nos objets (boutons, ...) dans ces boites avec (la première insère de haut en bas et la deuxième fait l'inverse) : void gtk_box_pack_start(GtkBox* box, GtkWidget* child, gboolean expand, gboolean fill, guint padding); void gtk_box_pack_end(GtkBox* box, GtkWidget* child, gboolean expand, gboolean fill, guint padding); avec box le conteneur (si celui ci est du type GtkWidget, on utilisera la fonction GTK_BOX(objet) pour réaliser un cast et éviter un message d'avertissement), child l'objet, expand l'expansion globale, fill l'expansion de la cellule et padding l'espace autour de l'objet. Exercice 4 : Faites un programme prog4.c qui utilisera une boite horizontale contenant trois boutons, vous testerez également les différentes valeurs de homogeneous, spacing, expand, fill et padding. On peut également utiliser des séparateurs avec : GtkWidget* gtk_hseparator_new (void); GtkWidget* gtk_vseparator_new (void); Exercice 5 : Faites un programme prog5.c qui utilisera une boite horizontale contenant trois boites verticales, contenant chacune deux boutons et un séparateur. Page 6 / 12 Programmation GTK C. Drocourt – 2007 UPJV - IUT Amiens CNAM Picardie La gestion des évènements Pour associer la gestion d'un évènement particulier à un objet on utilise la fonction suivante : gtk_signal_connect (GtkObject *object, const gchar *name, GtkSignalFunc *func, gpointer data); Avec : ● object : l'objet considéré, ATTENTION, il faudra faire un cast avec GTK_OBJECT (<Objet Widget>) pour éviter les messages d'avertissements, ● name : le nom du signal à intercepter comme : event, destroy, clicked, button_press_event, button_release_event, motion_notify_event, delete_event, destroy_event, expose_event, key_press_event, key_release_event, enter_notify_event, leave_notify_event, configure_event, focus_in_event, focus_out_event, map_event, unmap_event, property_notify_event, selection_clear_event, selection_request_event, selection_notify_event, proximity_in_event, proximity_out_event, drag_begin_event, drag_request_event, drag_end_event, drop_enter_event, drop_leave_event, drop_data_available_event, other_event. ● func : la fonction qui sera appelée, ATTENTION : il faudra aussi faire un cast avec GTK_SIGNAL_FUNC (<fonction>), de plus la fonction doit avoir le prototype suivant : void callback_func(GtkWidget *widget, gpointer *callback_data); Où widget est la widget concerné par l'évènement, et callback_data le paramètre passé à la fonction. ● data : un paramètre éventuel à passer à la fonction. Remarques : – On quitte proprement un programme GTK en appelant la fonction gtk_main_quit ();, – Lorsque l'on ferme une fenêtre, le système génère d'abord l'évènement delete_event, puis si la fonction de callback existe et retourne 0, l'évènement destroy est généré. Exercice 6 : Faites un programme prog6.c basé sur le précédent, qui quittera proprement, qui possèdera un bouton « Quit », un bouton permettant d'afficher un message sur la console, et un bouton qui uploads/Finance/ cours-nsy110-c-gtk.pdf

  • 21
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Jul 20, 2022
  • Catégorie Business / Finance
  • Langue French
  • Taille du fichier 0.2205MB