Date de publication : 20 Février 2007
Maintenant, nous connaissons suffisamment de widgets pour créer des fenêtres complexes. Afin d'améliorer l'esthétique des ces fenêtres nous allons voir comment ajouter des décorations (ou séparation) entre les différentes parties de la fenêtre. Il existe deux types de décoration :
GtkFrame
qui entoure toute une zone de la fenêtre
et qui possède un texte permettant de définir la zone ;GtkSeparator
qui divise en deux parties différentes,
le widget GtkHSeparator
pour les lignes horizontales et le widget
GtkVSeparator
pour les lignes verticales.Le widget GtkFrame étant très simple, il n'y a qu'une seule fonction de création :
GtkWidget* gtk_frame_new(const gchar *label);
Le paramètre label
est tout simplement le texte qui sera
affiché en haut à gauche du cadre (position par défaut).
Il peut arriver que dans votre application, le texte du cadre nécessite
une modification. Bien entendu, le widget GtkFrame
est fourni avec
toutes les fonctions nécessaires.
void gtk_frame_set_label(GtkFrame *frame, const gchar *label);
Le paramètre frame
est le widget GtkFrame
dont nous voulons modifier le texte, et label
est le nouveau texte
à inscrire. Cette fois encore, il faut utiliser une macro de conversion
pour le premier paramètre qui est cette fois GTK_FRAME()
.
Pour récupérer le texte du GtkFrame
, la fonction
est :
G_CONST_RETURN gchar* gtk_frame_get_label(GtkFrame *frame);
Les cadres offrent aussi la possibilité de remplacer le texte par un
widget quelconque (GtkImage
, GtkStockItem
, ...) grâce
à cette fonction :
gtk_frame_set_label_widget(GtkFrame *frame, GtkWidget *label_widget);
Et comme toujours, la fonction permettant de connaître le widget affiché:
GtkWidget* gtk_frame_get_label_widget(GtkFrame *frame);
Par défaut, la position du texte est en haut à gauche du cadre, centré en hauteur par rapport à la ligne supérieure. Cela aussi peut être modifié avec cette fonction :
void gtk_frame_set_label_align(GtkFrame *frame, gfloat xalign, gfloat yalign);
Les valeurs xalign
et yalign
doivent être comprises
entre 0.0 et 1.0.
Le paramètre xalign
définit la position horizontale
du texte. Une valeur de 0.0 positionne le texte à gauche du cadre, tandis
qu'une valeur de 1.0 le positionne à droite. Evidemment, une valeur de
0.5 centrera le texte.
Quant à yalign
, il permet de définir la position
verticale du texte par rapport à la ligne supérieur du cadre.
Une valeur de 0.0 mettra le nommeur en dessous de la ligne et une valeur de
1.0 le mettra au-dessus de la ligne.
On peut, bien sûr, connaître les valeurs de positionnement avec les fonctions suivantes :
void gtk_frame_get_label_align(GtkFrame *frame, gfloat *xalign, gfloat *yalign);
Le style du cadre correspond plus à la configuration visuelle des lignes du cadre et plus précisément encore l'ombre des lignes. Cette modification de fait avec cette fonction :
void gtk_frame_set_shadow_type(GtkFrame *frame, GtkShadowType type);
Le paramètre type
peut prendre cinq valeurs différentes
dont voici la liste avec leurs illustrations :
Valeur de type | Illustration de la ligne supérieure |
GTK_SHADOW_NONE | En fait, on ne voit pas la ligne. |
GTK_SHADOW_IN | |
GTK_SHADOW_OUT | |
GTK_SHADOW_ETCHED_IN (par défaut) | |
GTK_SHADOW_ETCHED_OUT |
Et sans surprise, voici la fonction qui permet de connaître le type des lignes :
GtkShadowType gtk_frame_get_shadow_type(GtkFrame *frame);
Alors cette fois, cela va être très rapide et très simple.
GtkWidget* gtk_hseparator_new(void);
GtkWidget* gtk_vseparator_new(void);
La première fonction crée une ligne horizontale alors que la deuxième crée une ligne verticale.
Il n'y a rien de plus à propos de ce widget.
Afin de vous montrer l'avantage visuel de l'utilisation des GtkFrame
et GtkSeparator
, nous allons créer une fenêtre qui
demande à l'utilisateur de saisir des informations le concernant (nom,
prénom, adresse, ...).
Voila à quoi ressemble la fenêtre sans l'utilisation des décorations :
Attention, ce programme ne fait rien du tout, c'est simplement pour montrer la différence entre avec et sans les décorations.
#include <stdlib.h> #include <gtk/gtk.h> int main(int
argc, char **argv) gtk_init(&argc, &argv); pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); pVBox = gtk_vbox_new(TRUE, 0); /* Creation du premier
GtkFrame */ /* Creation et insertion
d une boite pour le premier GtkFrame */ /* Creation et insertion
des elements contenus dans le premier GtkFrame */ sUtf8 = g_locale_to_utf8("Prénom
:", -1, NULL, NULL, NULL); /* Creation d un GtkHSeparator
*/ pLabel = gtk_label_new("Date de naissance :"); /* Creation du deuxieme
GtkFrame */ /* Creation et insertion
d une boite pour le deuxieme GtkFrame */ /* Creation et insertion
des elements contenus dans le deuxieme GtkFrame */ pLabel = gtk_label_new("Adresse :"); pLabel = gtk_label_new("Code postal :"); pLabel = gtk_label_new("Ville :"); /* Creation du troisieme
GtkFrame */ /* Creation et insertion
d une boite pour le troisieme GtkFrame */ /* Creation et insertion
des elements contenus dans le troisieme GtkFrame */ pLabel = gtk_label_new("Professionnel"); pLabel = gtk_label_new("Portable"); gtk_widget_show_all(pWindow); gtk_main(); return EXIT_SUCCESS; |
Résultat : |