Beruflich Dokumente
Kultur Dokumente
page=page_3
Forums Tutoriels Magazine FAQs Blogs Chat Newsletter tudes Emploi Club
Contacts
p
u
Developpez.com b
l
i
Plus de 14 000 cours et tutoriels en informatique professionnelle c
i
t
consulter, tlcharger ou visionner en vido.
Accueil ALM Java .NET Dv. Web EDI Programmation SGBD Office Solutions d'entreprise Applications Mobiles Systmes
Accueil C Forums C FAQ C Tutoriels C Livres C Compilateurs et outils C Sources C Bibliothques C GTK+
ACCUEIL GTK+ FORUM GTK+ FAQ GTK+ TUTORIELS GTK+ SOURCES GTK+ BIBLIOTHEQUES LIVRES GTK+ OUTILS GTK+
Cours GTK 2
Avant de commencer l'tude des fentres, il faut savoir que les objets graphiques de GTK+ sont
appels des widgets. Un widget est en fait une structure dfinissant les proprits d'un objet
associe une large panoplie de fonctions permettant de manipuler ces objets.
Ici, le terme est prendre au sens littral, mais aussi au sens Programmation Oriente Objet
(POO). En effet, bien que GTK+ soit crit en C, il introduit la notion d'hritage et les widgets de
GTK+ suivent une hirarchie bien dfinie. Ainsi tous les objets graphiques hritent des proprits
et des fonctions d'un widget de base qui s'appelle GtkWidget.
Ainsi le widget permettant d'afficher une fentre se nomme GtkWindow. Il a bien sr ses propres
fonctions, mais grce l'hritage il bnficie aussi des fonctions de plusieurs autres widgets.
Voici donc la position de GtkWindow dans la hirarchie GTK+ :
Dans un premier temps, il faut dclarer un pointeur sur notre objet fentre. Bien que nous
voulions crer un objet GtkWindow, il faut dclarer un objet GtkWidget.
Slectionnez
GtkWidget *pWindow;
Par la suite, quel que soit l'objet crer, il faudra toujours dclarer un GtkWidget.
Une fois l'objet pWindow dclarer, il faut l'initialiser. Pour cela, une fonction est notre
disposition :
Slectionnez
GtkWidget* gtk_window_new(GtkWindowType type);
Le paramtre type dfinit le type de la fentre en cours de cration, et peut prendre une des
deux valeurs suivantes :
GTK_WINDOW_TOPLEVEL : pour crer une fentre complte avec une zone rserve dans
la barre des tches ;
GTK_WINDOW_POPUP : pour crer une fentre sans aucune dcoration (barre de titre,
bordure).
La valeur de retour est le pointeur sur notre nouvel objet fentre. Cette fonction est donc
utiliser comme ceci :
Slectionnez
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Un widget n'a pas de fonction spcifique lie son affichage, mais utilise une fonction de
GtkWidget qui est :
Slectionnez
void gtk_widget_show(GtkWidget *widget);
Il suffit donc de passer en paramtre le widget que nous voulons afficher, ainsi pour afficher
notre fentre, la ligne de code est :
Slectionnez
gtk_widget_show(pWindow);
Slectionnez
void gtk_widget_destroy(GtkWidget *widget);
Voici donc le code source complet de notre programme affichant une fentre.
Slectionnez
#include <stdlib.h>
#include <gtk/gtk.h>
/* Cration de la fentre */
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* Affichage de la fentre */
gtk_widget_show(pWindow);
/* Destruction de la fentre */
gtk_widget_destroy(pWindow);
return EXIT_SUCCESS;
}
En essayant ce programme, vous ne verrez srement pas la fentre s'afficher. La raison est
simple : la destruction de la fentre a lieu tout de suite aprs son affichage. Nous allons
maintenant tudier la thorie de signaux afin que l'application ne se termine qu'au moment o
l'utilisateur le demande.
Nous allons maintenant tudier comment faire ragir une application GTK+ aux actions de
l'utilisateur.
Dans un premier temps, lorsque l'utilisateur interagi avec l'application (clique sur un bouton,
ferme une fentre), le widget concern met un signal (par exemple destroy lorsque l'on
ferme une fentre). Chaque widget est associ un ou plusieurs signaux et permet donc ainsi de
programmer toutes les actions possibles.
Ce signal va ensuite tre intercept par une boucle vnementielle qui va vrifier qu'une action
spcifique ce signal et ce widget a bien t dfinie. Si tel est le cas, la fonction associe sera
excute. Ce type de fonction s'appelle fonction callback.
Il faut donc crer une fonction callback pour chacun des vnements susceptible d'avoir lieu
pendant l'excution du programme et associer (ou connecter) cette fonction un signal.
La premire tape consiste donc crer une fonction callback. Dans la majorit des cas, une
fonction callback sera de cette forme :
Slectionnez
void nom_de_la_fonction(GtkWidget *widget, gpointer data)
Le paramtre widget est le widget qui a mis le signal, et data est une donne supplmentaire
qui peut tre utilise.
Ensuite, pour connecter un signal une fonction callback, GTK+ utilise une fonction de la
bibliothque GLib qui est :
Slectionnez
gulong g_signal_connect(gpointer *object, const gchar *name, GCallback func, gpointer func_data );
Le premier paramtre object, correspond au widget qui met le signal. Cependant, la variable
demande par g_signal_connect tant de type gpointer* (correspond void* du C standard) et le
widget de type GtkWidget*, il faut convertir ce dernier pour ne pas provoquer d'erreur lors de la
compilation. Pour cela GTK+ (ou dans ce cas GLib) fourni une macro de conversion (G_OBJECT)
qui sera utiliser chaque utilisation de cette fonction.
Le second paramtre name, est le signal qui doit tre intercept par la boucle vnementielle.
Dans ce cours, certains signaux seront utiliss dans les exemples, mais la rubrique En savoir
plus donnera une liste complte des signaux qui peuvent tre mis par un widget.
Le troisime paramtre func, dfinit la fonction callback associer au signal. Cette fois encore, il
faudra utiliser une macro de conversion qui est G_CALLBACK(func).
Une fois que les signaux sont connects, il faut lancer la boucle vnementielle en appelant cette
fonction :
Slectionnez
void gtk_main(void);
Cela aura pour effet de faire entrer GTK+ dans une boucle infinie qui ne pourra tre stoppe que
par l'appel de la fonction de fin de boucle qui est :
Slectionnez
void gtk_main_quit(void);
Ces fonctions correspondent au minimum afin de pouvoir crer une application GTK+ correcte.
D'autres fonctions permettent une utilisation avance des signaux et de la boucle vnementielle
et seront traites dans un autre chapitre du cours.
III-A-4. Exemple
Nous allons maintenant faire en sorte que la fentre cre reste visible jusqu' que l'utilisateur
clique sur la croix situe droite de la barre de titre.
Slectionnez
void OnDestroy(GtkWidget *pWidget, gpointer pData);
La seule action que doit faire cette fonction est d'arrter la boucle vnementielle. La seule
instruction ajouter est donc gtk_main_quit();.
Slectionnez
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
Slectionnez
gtk_main();
Voici donc le code source complet de notre application affichant une fentre.
Slectionnez
#include <stdlib.h>
#include <gtk/gtk.h>
/* Cration de la fentre */
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* Connexion du signal "destroy" */
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
/* Affichage de la fentre */
gtk_widget_show(pWindow);
/* Demarrage de la boucle evenementielle */
gtk_main();
return EXIT_SUCCESS;
}
Rsultat :
Nous allons maintenant tudier quelques fonctions permettant de modifier l'aspect de la fentre
prcdemment cre. L'exemple final consistera crer une fentre de taille 320x200 au centre
de l'cran ayant pour titre Chapitre I.
La premire fonction tudie permet de dfinir la position de la fentre avant son affichage. Son
prototype est le suivant :
Slectionnez
void gtk_window_set_position(GtkWindow* window, GtkWindowPosition position);
Le deuxime paramtre est la position que l'on veut donner la fentre. Les valeurs acceptes
sont :
La deuxime fonction est utilisable tout moment du programme et permet de donner la position
exacte de la fentre :
Slectionnez
void gtk_window_move(GtkWindow *window, gint x, gint y);
Les deux autres paramtres sont la nouvelle position de la fentre. Le paramtre x est la position
suivante l'axe X (axe horizontal) et le paramtre y, la position suivant l'axe Y (axe vertical). Le
type gint est le type int du C.
Slectionnez
void gtk_window_get_position(GtkWindow *window, gint *root_x, gint *root_y);
Les paramtres correspondent aux mmes valeurs que pour la fonction gtk_window_move.
Pour le programme exemple, le plus simple est d'utiliser la premire fonction ainsi :
Slectionnez
gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
Cette fois-ci, une seule fonction est notre disposition pour modifier le titre de la fentre. Cette
dernire est trs simple d'utilisation :
Slectionnez
void gtk_window_set_title(GtkWindow* window, const gchar* title)
Le deuxime paramtre title est bien entendu le titre que l'on veut donner la fentre (gchar
correspond char en C).
Slectionnez
gtk_window_set_title(GTK_WINDOW(pWindow), "Chapitre I.");
Slectionnez
G_CONST_RETURN gchar* gtk_window_get_title(GtkWindow *window);
La variable qui recevra la valeur de retour de cette fonction devra tre de type const gchar*.
Slectionnez
void gtk_window_set_default_size(GtkWindow* window, gint width, gint height);
Le paramtre width est la largeur de la fentre tandis que le paramtre height est sa hauteur.
Slectionnez
gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
Et trs logiquement, la fonction pour connatre la taille par dfaut de la fentre est :
Slectionnez
void gtk_window_get_default_size(GtkWindow *window, gint *width, gint *height);
Slectionnez
#include <stdlib.h>
#include <gtk/gtk.h>
/* Cration de la fentre */
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* Dfinition de la position */
gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
/* Dfinition de la taille de la fentre */
gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
/* Titre de la fentre */
gtk_window_set_title(GTK_WINDOW(pWindow), "Chapitre I.");
/* Connexion du signal "destroy" */
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
/* Affichage de la fenetre */
gtk_widget_show(pWindow);
/* Dmarrage de la boucle vnementielle */
gtk_main();
return EXIT_SUCCESS;
}
Rsultat :
III-C-1. Signaux
activate-default
Slectionnez
void user_function(GtkWindow *window, gpointer user_data);
activate-focus
Slectionnez
void user_function(GtkWindow *window, gpointer user_data);
frame-event
Slectionnez
gboolean user_function(GtkWindow *window, GdkEvent *event, gpointer user_data);
keys-changed
Slectionnez
void user_function(GtkWindow *window, gpointer user_data);
move-focus
Slectionnez
void user_function(GtkWindow *window, GtkDirectionType arg1, gpointer user_data);
set-focus
Slectionnez
void user_function(GtkWindow *window, GtkWidget *widget, gpointer user_data);
Slectionnez
void gtk_window_set_resizable(GtkWindow *window, gboolean resizable);
Entre(s) :
window : la fentre.
resizable : TRUE si l'on peut modifier la taille, FALSE sinon.
Sortie : rien.
Slectionnez
gboolean gtk_window_get_resizable(GtkWindow *window);
Entre(s) :
window : la fentre.
Slectionnez
void gtk_window_set_gravity(GtkWindow *window, GdkGravity gravity);
Entre(s) :
window : la fentre
Sortie : rien.
Slectionnez
GdkGravity gtk_window_get_gravity(GtkWindow *window);
Entre(s) :
window : la fentre.
Slectionnez
void gtk_window_set_focus(GtkWindow *window, GtkWidget *focus);
Entre(s) :
Sortie : rien.
Slectionnez
GtkWidget* gtk_window_get_focus(GtkWindow *window);
Entre(s) :
window : la fentre.
Slectionnez
void gtk_window_set_default(GtkWindow *window, GtkWidget *default_widget);
Entre(s) :
Sortie : rien.
Slectionnez
void gtk_window_iconify(GtkWindow *window);
Entre(s) :
window : la fentre.
Sortie : rien.
Slectionnez
void gtk_window_deiconify(GtkWindow *window);
Entre(s) :
window : la fentre.
Sortie : rien.
Slectionnez
void gtk_window_maximize(GtkWindow *window);
Entre(s) :
window : la fentre.
Sortie : rien.
Slectionnez
void gtk_window_unmaximize(GtkWindow *window);
Entre(s) :
window : la fentre.
Sortie : rien.
Slectionnez
void gtk_window_set_decorated(GtkWindow *window, gboolean setting);
Entre(s) :
window : la fentre.
resizable :TRUE si l'on veut l'afficher, FALSE sinon.
Sortie : rien.
Slectionnez
gboolean gtk_window_get_decorated(GtkWindow *window);
Entre(s) :
window : la fentre.
Slectionnez
void gtk_window_resize(GtkWindow *window, gint width, gint height);
Entre(s) :
window : la fentre.
width : largeur.
height : hauteur.
Sortie : rien.
Slectionnez
void gtk_window_set_wmclass(GtkWindow *window, const gchar *wmclass_name, const gchar
void gtk_window_set_policy(GtkWindow *window, gintallow_shrink, gintallow_grow, gintauto_shrink);
void gtk_window_add_accel_group(GtkWindow *window, GtkAccelGroup *accel_group);
void gtk_window_remove_accel_group(GtkWindow *window, GtkAccelGroup *accel_group);
gboolean gtk_window_activate_focus(GtkWindow *window);
gboolean gtk_window_activate_default(GtkWindow *window);
void gtk_window_set_modal(GtkWindow *window, gboolean modal);
void gtk_window_set_geometry_hints(GtkWindow *window, GtkWidget *geometry_widget, GdkGeometry
void gtk_window_set_transient_for(GtkWindow *window, GtkWindow *parent);
void gtk_window_set_destroy_with_parent(GtkWindow *window, gboolean setting);
GList* gtk_window_list_toplevels(void);
void gtk_window_add_mnemonic(GtkWindow *window, guintkeyval, GtkWidget *target);
void gtk_window_remove_mnemonic(GtkWindow *window, guintkeyval, GtkWidget *target);
gboolean gtk_window_mnemonic_activate(GtkWindow *window, guintkeyval, GdkModifierType modifier);
void gtk_window_present(GtkWindow *window);
void gtk_window_stick(GtkWindow *window);
void gtk_window_unstick(GtkWindow *window);
void gtk_window_begin_resize_drag(GtkWindow *window, GdkWindowEdge edge, gint button, gintroot_x, gin
void gtk_window_begin_move_drag(GtkWindow *window, gintbutton, gintroot_x, gintroot_y, guint32 timest
void gtk_window_set_frame_dimensions(GtkWindow *window, gintleft, ginttop, gintright, gintbottom);
void gtk_window_set_has_frame(GtkWindow *window, gboolean setting);
void gtk_window_set_mnemonic_modifier(GtkWindow *window, GdkModifierType modifier);
void gtk_window_set_role(GtkWindow *window, const gchar *role);
void gtk_window_set_type_hint(GtkWindow *window, GdkWindowTypeHinthint);
GList* gtk_window_get_default_icon_list(void);
gboolean gtk_window_get_destroy_with_parent(GtkWindow *window);
void gtk_window_get_frame_dimensions(GtkWindow *window, gint*left, gint*top, gint*right, gint
gboolean gtk_window_get_has_frame(GtkWindow *window);
GdkPixbuf* gtk_window_get_icon(GtkWindow *window);
GList* gtk_window_get_icon_list(GtkWindow *window);
GdkModifierType gtk_window_get_mnemonic_modifier(GtkWindow *window);
gboolean gtk_window_get_modal(GtkWindow *window);
G_CONST_RETURN gchar* gtk_window_get_role(GtkWindow *window);
GtkWindow* gtk_window_get_transient_for(GtkWindow *window);
GdkWindowTypeHint gtk_window_get_type_hint(GtkWindow *window);
gboolean gtk_window_parse_geometry(GtkWindow *window, const gchar *geometry);
void gtk_window_reshow_with_initial_size(GtkWindow *window);
void gtk_window_set_default_icon_list(GList *list);
void gtk_window_set_icon(GtkWindow *window, GdkPixbuf *icon);
void gtk_window_set_icon_list(GtkWindow *window, GList *list);
void gtk_decorated_window_init(GtkWindow *window);
void gtk_decorated_window_calculate_frame_size(GtkWindow *window);
void gtk_decorated_window_set_title(GtkWindow *window, const gchar *title);
void gtk_decorated_window_move_resize_window(GtkWindow *window, gintx, ginty, gintwidth, gintheight);
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre
convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par les droits
d'auteur. Copyright 2013 developpez. Aucune reproduction, mme partielle, ne peut tre faite de ce
site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de
l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages
et intrts.