Documente Academic
Documente Profesional
Documente Cultură
page=page_4
Forums Tutoriels Magazine FAQs Blogs Chat Newsletter tudes Emploi Club
Contacts
p
u
Vos offres d'emploi informatique U I
b
T li
T
Dveloppeurs, chefs de projets, ingnieurs, informaticiens GRA c
i
Postez gratuitement vos offres d'emploi ici visible par 4 000 000 visiteurs uniques par mois t
emploi.developpez.com
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
Nous allons maintenant voir comment crer un label, et comment l'insrer dans la
fentre principale.
Slectionnez
GtkWidget *pLabel;
Ensuite il faut initialiser cet objet. Pour cela, il n'existe qu'une seule fonction :
Slectionnez
Le paramtre str n'est autre que la chane de caractres qu'il faudra afficher.
Slectionnez
pLabel = gtk_label_new("Hello World!");
Pour pouvoir afficher le texte, il faut insrer le widget pLabel dans la fentre principale
(widget pWindow). Pour cela, nous allons utiliser le fait que le widget GtkWindow
drive du widget GtkContainer. L'atout principal d'un GtkContainer est, comme son
nom le laisse entendre, qu'il peut contenir et afficher un autre widget. Les widgets de
ce type sont appels des conteneurs. Il faudra donc diffrencier deux types d'objets :
tudions donc maintenant la fonction qui nous servira insrer un widget dans un
widget conteneur :
Slectionnez
void gtk_container_add(GtkContainer *container, GtkWidget *widget);
Le premier paramtre, container, est le widget conteneur dans lequel on veut insrer
le widget widget qui lui est pass en deuxime paramtre. Le premier paramtre de
cette fonction est de type GtkContainer, alors que les widgets conteneurs seront tous
de type GtkWidget. Il faudra donc nouveau utiliser une macro de conversion qui
cette fois est GTK_CONTAINER().
Slectionnez
gtk_container_add(GTK_CONTAINER(pWindow), pLabel);
Slectionnez
#include <stdlib.h>
#include <gtk/gtk.h>
gtk_init(&argc,&argv);
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(pWindow), "Les labels");
gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
/* Creation du label */
pLabel=gtk_label_new("Hello World!");
/* Connexion du signal
/* On appelle directement la fonction de sortie de boucle */
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return EXIT_SUCCESS;
}
Rsultat :
Vous avez peut-tre dj essay d'afficher du texte contenant des caractres tel que
, , , , et lors de l'excution, votre texte ne s'affiche compltement. Nous
allons maintenant voir le pourquoi du comment.
Pour vous montrer tout cela, nous allons reprendre l'exemple prcdent en remplaant
Hello Word par Texte afficher , et cela ne marche pas! En effet vous obtenez
cela :
Pour afficher du texte, Gtk utilise la librairie Pango qui s'occupe du rendu et de
l'affichage du texte. Le but de Pango est de permettre l'internationalisation des
applications, et pour cela Pango utilise l'encodage UTF8. Ce charset est code sur 16
bits, ce qui offre la possibilit d'afficher plus 65000 caractres, permettant ainsi
d'afficher des caractres accentus et bien plus (ex : pour le grec, le chinois).
Puisque Pango sait faire tout cela, pourquoi le test n'a-t-il pas fonctionn? Et bien, tout
simplement parce que votre systme d'exploitation n'utilise pas ce charset. Lorsque
vous souhaitez afficher Texte afficher , Pango va avant tout vrifier l'encodage
d'un caractre et si l'un de ces caractres n'est pas correct, Pango va arrter son
processus de rendu et envoyer un message d'erreur.
Le moyen le plus simple pour voir les effets d'une erreur d'encodage est de changer
celui de votre navigateur. Modifiez les options de votre navigateur afin d'utiliser
l'encodage UNICODE. Cette page web utilisant le charset iso-8859-1, les caractres
accentus deviendront des carrs ou autre chose.
IV-B-3. Solution
Une seule chose s'impose nous : il faut convertir notre chane de caractre en UTF8.
Pour cela, il faut utiliser une fonction de Glib qui est :
Slectionnez
gchar* g_locale_to_utf8(const gchar *opsysstring, gsize len, gsize *bytes_read, gsize
Les trois derniers paramtres sont utiles en cas d'erreur lors de la conversion. Tout
d'abord bytes_read est le nombre d'octet qui ont t lus dans le texte convertir, et
bytes_writen le nombre d'octet qui ont t cris dans la nouvelle chane de caractres.
Le dernier paramtre error, donne plus de prcision en cas d'erreur. Voici la liste des
messages d'erreur possibles :
G_CONVERT_ERROR_NO_CONVERSION ;
G_CONVERT_ERROR_ILLEGAL_SEQUENCE ;
G_CONVERT_ERROR_FAILED ;
G_CONVERT_ERROR_PARTIAL_INPUT ;
G_CONVERT_ERROR_BAD_URI ;
G_CONVERT_ERROR_NOT_ABSOLUTE_PATH.
Pour notre exemple, nous n'allons pas utiliser les trois derniers paramtres. En cas
d'erreur, il n'y aura donc aucun moyen d'avoir plus de prcision sur l'erreur survenue.
Slectionnez
#include <stdlib.h>
#include <gtk/gtk.h>
gtk_init(&argc, &argv);
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(pWindow), "Les labels II");
gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
/* Connexion du signal
/* On appelle directement la fonction de sortie de boucle */
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_main();
return EXIT_SUCCESS;
}
Rsultat :
Nous allons maintenant voir comment modifier l'apparence de notre texte (police,
couleur).
Pour notre application test, nous allons afficher une ligne en Courier gras taille 10, une
ligne en Times New Roman italique bleu taille 12, et une ligne en Verdana soulign
taille 16. Et tout cela centr (bien sr).
Une fois encore, nous allons utiliser les proprits de Pango (mme si nous n'allons
pas utiliser les fonctions de Pango directement).
Pour dfinir le format du texte, il suffit d'insrer des balises l'intrieur mme de
notre texte. Pango s'occupe ensuite de rechercher les balises puis de formater le texte
notre convenance.
Les balises rapides servent mettre le texte en gras, italique ou autre de manire trs
simple. Voici l'intgralit de ces balises :
Pour utiliser ces balises, il suffit d'encadrer le texte modifier des balises de
formatage. Par exemple, pour mettre le texte en gras, il faudra entrer : Normal vs
<b>Gras</b> .
Mais cela ne suffit pas, il faut aussi dire que le texte utilise les balises Pango, ce qui
est possible avec la fonction suivante :
Slectionnez
void gtk_label_set_use_markup(GtkLabel *label, gboolean setting);
Un autre moyen de spcifier l'utilisation des balises, est d'utiliser cette fonction :
Slectionnez
void gtk_label_set_markup(GtkLabel *label, const gchar *str);
Cette fonction dit Pango qu'il faut utiliser les balises, mais elle modifie aussi le label
en affichant la chane de caractres str (deuxime paramtre).
Cette fois-ci, nous allons tudier la balise <span> en dtail. Avec celle-ci, nous allons
pouvoir changer la police de caractres, la couleur du texte et bien d'autres choses.
Cette balise s'utilise comme les prcdentes si ce n'est qu'elle accepte des
paramtres. Le tableau ci-dessous prsente tous les paramtres et les effets sur le
texte.
Tous ces paramtres peuvent tre mis l'intrieur d'une seule balise <span>.
Maintenant, nous allons voir comment aligner notre texte, lorsque celui-ci comporte
plusieurs lignes. Comme d'habitude, GTK+ nous fourni une fonction trs simple
d'utilisation :
Slectionnez
void gtk_label_set_justify(GtkLabel *label, GtkJustification jtype);
Slectionnez
GtkJustification gtk_label_get_justify(GtkLabel *label);
Slectionnez
#include <stdlib.h>
#include <gtk/gtk.h>
gtk_init(&argc,&argv);
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(pWindow),"Les labels III");
gtk_window_set_default_size(GTK_WINDOW(pWindow),320,200);
/* On centre le texte */
gtk_label_set_justify(GTK_LABEL(pLabel), GTK_JUSTIFY_CENTER);
/* Connexion du signal
/* On appelle directement la fonction de sortie de boucle */
g_signal_connect(G_OBJECT(pWindow),"destroy",G_CALLBACK(gtk_main_quit),0);
gtk_main();
return EXIT_SUCCESS;
}
Rsultat :
Slectionnez
void gtk_label_set_text(GtkLabel* label, const char* str)
void gtk_label_set_label(GtkLabel* label, const gchar* str)
Entre(s) :
Slectionnez
G_CONST_RETURN gchar* gtk_label_get_text(GtkLabel* label)
G_CONST_RETURN gchar* gtk_label_get_label(GtkLabel* label)
Entre(s) :
Slectionnez
gboolean gtk_label_get_use_markup(GtkLabel *label);
Entre(s) :
Slectionnez
void gtk_label_set_attributes(GtkLabel *label, PangoAttrList *attrs);
void gtk_label_set_markup_with_mnemonic(GtkLabel *label, const gchar *str);
void gtk_label_set_pattern(GtkLabel *label, const gchar *pattern);
guint gtk_label_parse_uline(GtkLabel *label, const gchar *string);
void gtk_label_set_line_wrap(GtkLabel *label, gboolean wrap);
void gtk_label_get_layout_offsets(GtkLabel *label, gint *x, gint *y);
guint gtk_label_get_mnemonic_keyval(GtkLabel *label);
gboolean gtk_label_get_selectable(GtkLabel *label);
GtkWidget* gtk_label_new_with_mnemonic(const char *str);
void gtk_label_select_region(GtkLabel *label, gint start_offset, gint end_offset);
void gtk_label_set_mnemonic_widget(GtkLabel *label, GtkWidget *widget);
void gtk_label_set_selectable(GtkLabel *label, gboolean setting);
void gtk_label_set_text_with_mnemonic(GtkLabel *label, const gchar *str);
PangoAttrList* gtk_label_get_attributes(GtkLabel *label);
PangoLayout* gtk_label_get_layout(GtkLabel *label);
gboolean gtk_label_get_line_wrap(GtkLabel *label);
GtkWidget* gtk_label_get_mnemonic_widget(GtkLabel *label);
gboolean gtk_label_get_selection_bounds(GtkLabel *label, gint *start, gint *end);
gboolean gtk_label_get_use_underline(GtkLabel *label);
void gtk_label_set_use_underline(GtkLabel *label, gboolean setting);
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.