source: trunk/third/gtk/docs/html/gtk_tut_fr-7.html @ 14482

Revision 14482, 27.4 KB checked in by ghudson, 25 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14481, which included commits to RCS files with non-trunk default branches.
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
2<HTML>
3<HEAD>
4 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
5 <TITLE>Didacticiel: Widgets divers</TITLE>
6 <LINK HREF="gtk_tut_fr-8.html" REL=next>
7 <LINK HREF="gtk_tut_fr-6.html" REL=previous>
8 <LINK HREF="gtk_tut_fr.html#toc7" REL=contents>
9</HEAD>
10<BODY BGCOLOR="#FFFFFF">
11<A HREF="gtk_tut_fr-8.html">Page suivante</A>
12<A HREF="gtk_tut_fr-6.html">Page précédente</A>
13<A HREF="gtk_tut_fr.html#toc7">Table des matières</A>
14<HR NOSHADE>
15<H2><A NAME="s7">7. Widgets divers</A></H2>
16
17<P>
18<H2><A NAME="ss7.1">7.1 Labels</A>
19</H2>
20
21<P>Les labels sont très utilisés dans GTK et sont relativement
22simples. Ils n'émettent pas de signaux car ils n'ont pas de fenêtre X
23qui leur est associée. Si vous avez besoin de capturer des signaux ou
24de faire des coupures (« clippings »), utilisez un widget EventBox.
25<P>Pour créer un label, on utilise&nbsp;:
26<P>
27<BLOCKQUOTE><CODE>
28<PRE>
29GtkWidget* gtk_label_new (char *str);
30</PRE>
31</CODE></BLOCKQUOTE>
32<P>Où l'unique paramètre est la chaîne de caractères que l'on veut que le
33label affiche.
34<P>Pour changer le texte d'un label après sa création, on utilise la fonction&nbsp;:
35<P>
36<BLOCKQUOTE><CODE>
37<PRE>
38void gtk_label_set (GtkLabel  *label,
39                    char      *str);
40</PRE>
41</CODE></BLOCKQUOTE>
42<P>où le premier paramètre est le label que l'on veut modifier, que l'on
43convertit en utilisant la macro GTK_LABEL(), et le second est la
44nouvelle chaîne.
45<P>L'espace nécessaire à la nouvelle chaîne sera automatiquement ajusté
46si nécessaire.
47<P>Pour récupérer la chaîne courante, on utilise la fonction&nbsp;:
48<P>
49<BLOCKQUOTE><CODE>
50<PRE>
51void gtk_label_get (GtkLabel  *label,
52                    char     **str);
53</PRE>
54</CODE></BLOCKQUOTE>
55<P>où le premier paramètre est le label dont on veut récupérer la chaîne
56et le second sert à retourner cette chaîne.
57<P>
58<H2><A NAME="ss7.2">7.2 Le widget bulle d'aide</A>
59</H2>
60
61<P>Ce sont les petits textes qui surgissent lorsque vous laissez votre
62pointeur sur un bouton ou un autre widget pendant quelques secondes.
63Ils sont faciles à utiliser, on ne donnera donc pas d'exemple. Si vous
64voulez voir du code, consultez le programme <EM>testgtk.c</EM> distribué
65avec GTK.
66<P>Certains widgets (comme les labels) ne fonctionnent pas avec les
67bulles d'aide.
68<P>Le premier appel que vous utiliserez sera pour créer une nouvelle
69bulle d'aide. Vous n'avez besoin que de le faire une fois dans une
70fonction donnée. Le <EM>GtkTooltip</EM> que cette fonction retourne peut
71être utilisé pour créer plusieurs bulles d'aide.
72<P>
73<BLOCKQUOTE><CODE>
74<PRE>
75GtkTooltips *gtk_tooltips_new (void);
76</PRE>
77</CODE></BLOCKQUOTE>
78<P>Lorsque vous avez créé une nouvelle bulle d'aide et le widget sur lequel vous
79voulez l'utiliser, vous n'avez qu'à faire cet appel pour la configurer&nbsp;:
80<P>
81<BLOCKQUOTE><CODE>
82<PRE>
83void gtk_tooltips_set_tips   (GtkTooltips *tooltips,
84                              GtkWidget   *widget,
85                              gchar       *tips_text);
86</PRE>
87</CODE></BLOCKQUOTE>
88<P>Les paramètres sont la bulle d'aide déjà créée, suivi du widget pour
89lequel vous voulez voir apparaître cette bulle et le texte que vous
90voulez qu'elle contienne.
91<P>Voici un petit exemple&nbsp;:
92<P>
93<BLOCKQUOTE><CODE>
94<PRE>
95GtkTooltips *tooltips;
96GtkWidget *button;
97...
98tooltips = gtk_tooltips_new ();
99button = gtk_button_new_with_label ("bouton 1");
100...
101gtk_tooltips_set_tips (tooltips, button, "C'est le bouton 1");
102</PRE>
103</CODE></BLOCKQUOTE>
104<P>
105<P>D'autres fonctions peuvent être utilisées avec les bulles d'aide. Je ne ferais que les énumérer et les décrire brièvement.
106<P>
107<BLOCKQUOTE><CODE>
108<PRE>
109void gtk_tooltips_destroy    (GtkTooltips *tooltips);
110</PRE>
111</CODE></BLOCKQUOTE>
112<P>Destruction de bulles d'aide.
113<P>
114<BLOCKQUOTE><CODE>
115<PRE>
116void gtk_tooltips_enable     (GtkTooltips *tooltips);
117</PRE>
118</CODE></BLOCKQUOTE>
119<P>Activation d'un ensemble de bulles d'aide désactivées.
120<P>
121<BLOCKQUOTE><CODE>
122<PRE>
123void gtk_tooltips_disable    (GtkTooltips *tooltips);
124</PRE>
125</CODE></BLOCKQUOTE>
126<P>Désactivation d'un ensemble de bulles d'aide activées.
127<P>
128<BLOCKQUOTE><CODE>
129<PRE>
130void gtk_tooltips_set_delay  (GtkTooltips *tooltips,
131                              gint         delay);
132</PRE>
133</CODE></BLOCKQUOTE>
134 Configure le nombre de millisecondes pendant lequel
135le pointeur soit se trouver sur le widget avant que la bulle d'aide
136n'apparaisse. Par défaut, ce délai est de 1000 millisecondes, soit 1
137seconde.
138<P>
139<BLOCKQUOTE><CODE>
140<PRE>
141void      gtk_tooltips_set_tips (GtkTooltips *tooltips,
142                                 GtkWidget   *widget,
143                                 gchar    *tips_text);
144</PRE>
145</CODE></BLOCKQUOTE>
146<P>Change le texte d'une bulle d'aide déjà créée.
147<P>
148<BLOCKQUOTE><CODE>
149<PRE>
150void gtk_tooltips_set_colors (GtkTooltips *tooltips,
151                              GdkColor    *background,
152                              GdkColor    *foreground);
153</PRE>
154</CODE></BLOCKQUOTE>
155<P>Configure les couleurs de fond et de premier plan des bulles
156d'aides. Je ne sais toujours pas comment spécifier les couleurs...
157<P>Et c'est tout concernant les fonctions associées aux bulles
158d'aide. C'est plus que vous ne vouliez sûrement en savoir :)
159<P>
160<H2><A NAME="ss7.3">7.3 Barres de progression</A>
161</H2>
162
163<P>Les barres de progression sont utilisées pour afficher la progression
164d'une opération. Elles sont très simple à utiliser comme vous pourrez
165le constater en étudiant le code ci-dessous. Commençons d'abord par
166l'appel permettant de créer une nouvelle barre.
167<P>
168<BLOCKQUOTE><CODE>
169<PRE>
170GtkWidget *gtk_progress_bar_new (void);
171</PRE>
172</CODE></BLOCKQUOTE>
173<P>Maintenant que la barre est créée, nous pouvons l'utiliser.
174<P>
175<BLOCKQUOTE><CODE>
176<PRE>
177void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);
178</PRE>
179</CODE></BLOCKQUOTE>
180<P>Le premier paramètre est la barre de progression sur laquelle on veut
181agir, et le second est le pourcentage « effectué », signifiant le
182remplissage de la barres de 0 à 100 % (réel compris entre 0 et 1).
183<P>Les barres de progression sont généralement utilisées avec les délais
184d'expiration ou autres fonctions identiques (voir la section sur
185<A HREF="gtk_tut_fr-15.html#sec_timeouts">Expirations, fonctions d'E/S et d'attente</A>)
186pour donner l'illusion du multi-tâches. Toutes emploient la fonction
187<EM>gtk_progress_bar_update</EM> de la même façon.
188<P>Voici un exemple de barre de progression mise à jour par des
189expirations. Ce code montre aussi comment réinitialiser une barre.
190<P>
191<BLOCKQUOTE><CODE>
192<PRE>
193#include &lt;gtk/gtk.h>
194
195static int ptimer = 0;
196int pstat = TRUE;
197
198/* Cette fonction incrémente et met à jour la barre de progression,
199 * elle la réinitialise si pstat vaut FALSE */
200
201gint progress (gpointer data)
202{
203    gfloat pvalue;
204   
205    /* récupération de la valeur courante de la barre */
206
207    pvalue = GTK_PROGRESS_BAR (data)->percentage;
208   
209    if ((pvalue >= 1.0) || (pstat == FALSE)) {
210        pvalue = 0.0;
211        pstat = TRUE;
212    }
213    pvalue += 0.01;
214   
215    gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);
216   
217    return TRUE;
218}
219
220/* Cette fonction signale une réinitialisation de la barre */
221
222void progress_r (void)
223
224    pstat = FALSE; 
225}
226
227void destroy (GtkWidget *widget, gpointer *data)
228{
229    gtk_main_quit ();
230}
231
232int main (int argc, char *argv[])
233{
234    GtkWidget *window;
235    GtkWidget *button;
236    GtkWidget *label;
237    GtkWidget *table;
238    GtkWidget *pbar;
239   
240    gtk_init (&amp;argc, &amp;argv);
241   
242    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
243   
244    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
245                        GTK_SIGNAL_FUNC (destroy), NULL);
246   
247    gtk_container_border_width (GTK_CONTAINER (window), 10);
248   
249    table = gtk_table_new(3,2,TRUE);
250    gtk_container_add (GTK_CONTAINER (window), table);
251   
252    label = gtk_label_new ("Exemple de barre de progression");
253    gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2,0,1);
254    gtk_widget_show(label);
255   
256    /* Crée une barre, la place dans la table et l'affiche */
257
258    pbar = gtk_progress_bar_new ();
259    gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0,2,1,2);
260    gtk_widget_show (pbar);
261   
262    /* Configure le délai d'expiration pour gérer automatiquement la
263     *  mise à jour de la barre */
264
265    ptimer = gtk_timeout_add (100, progress, pbar);
266   
267    /* Ce bouton indique à la barre qu'elle doit se réinitialiser */
268
269    button = gtk_button_new_with_label ("Reset");
270    gtk_signal_connect (GTK_OBJECT (button), "clicked",
271                        GTK_SIGNAL_FUNC (progress_r), NULL);
272    gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,2,3);
273    gtk_widget_show(button);
274   
275    button = gtk_button_new_with_label ("Annuler");
276    gtk_signal_connect (GTK_OBJECT (button), "clicked",
277                        GTK_SIGNAL_FUNC (destroy), NULL);
278   
279    gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,2,3);
280    gtk_widget_show (button);
281   
282    gtk_widget_show(table);
283    gtk_widget_show(window);
284   
285    gtk_main ();
286   
287    return 0;
288}
289</PRE>
290</CODE></BLOCKQUOTE>
291<P>Dans ce petit programme, il y a quatre parties concernant le
292fonctionnement général des barres de progression, nous les étudierons
293dans l'ordre de leurs appels.
294<P>
295<BLOCKQUOTE><CODE>
296<PRE>
297pbar = gtk_progress_bar_new ();
298</PRE>
299</CODE></BLOCKQUOTE>
300<P>Cet appel crée une nouvelle barre, nommée <EM>pbar</EM>.
301<P>
302<BLOCKQUOTE><CODE>
303<PRE>
304ptimer = gtk_timeout_add (100, progress, pbar);
305</PRE>
306</CODE></BLOCKQUOTE>
307<P>Cet appel utilise des délais d'expiration pour permettre un intervalle
308de temps constant. ces délais ne sont pas nécessaires à l'utilisation
309des barres de progression.
310<P>
311<BLOCKQUOTE><CODE>
312<PRE>
313pvalue = GTK_PROGRESS_BAR (data)->percentage;
314</PRE>
315</CODE></BLOCKQUOTE>
316<P>Ce code assigne à <EM>pvalue</EM> la valeur du pourcentage de la barre.
317<P>
318<BLOCKQUOTE><CODE>
319<PRE>
320gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);
321</PRE>
322</CODE></BLOCKQUOTE>
323<P>Finalement, ce code met à jour la barre avec la valeur de <EM>pvalue</EM>.
324<P>Et c'est tout ce qu'il y a à savoir sur les barres de
325progression. Amusez-vous bien.
326<P>
327<H2><A NAME="ss7.4">7.4 Boîtes de dialogue</A>
328</H2>
329
330<P>
331<P>Les widgets boîtes de dialogue sont très simples&nbsp;: ce sont
332simplement des fenêtres avec plusieurs choses déjà placées dedans. La
333structure d'une boîte de dialogue est&nbsp;:
334<P>
335<BLOCKQUOTE><CODE>
336<PRE>
337struct GtkDialog
338{
339      GtkWindow window;
340   
341      GtkWidget *vbox;
342      GtkWidget *action_area;
343};
344</PRE>
345</CODE></BLOCKQUOTE>
346<P>Comme vous le voyez, cela crée simplement une fenêtre et la place dans
347une vbox suivie d'un séparateur et d'une hbox pour la « zone d'action ».
348<P>Le widget boîte de dialogue peut servir à produire des messages pour
349l'utilisateur ainsi qu'à d'autres tâches. Il est vraiment rudimentaire
350et il n'y a qu'une seule fonction pour les boîtes de dialogue&nbsp;:
351<P>
352<BLOCKQUOTE><CODE>
353<PRE>
354GtkWidget* gtk_dialog_new (void);
355</PRE>
356</CODE></BLOCKQUOTE>
357<P>Ainsi, pour créer un nouveau dialogue, on utilise&nbsp;:
358<P>
359<BLOCKQUOTE><CODE>
360<PRE>
361GtkWidget window;
362window = gtk_dialog_new ();
363</PRE>
364</CODE></BLOCKQUOTE>
365<P>Ceci créera la boîte de dialogue et c'est maintenant à vous de
366l'utiliser. Vous pouvez, par exemple, placer un bouton dans la zone
367d'action en faisant quelque chose comme&nbsp;:
368<P>
369<BLOCKQUOTE><CODE>
370<PRE>
371button = ...
372gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
373                    TRUE, TRUE, 0);
374gtk_widget_show (button);
375</PRE>
376</CODE></BLOCKQUOTE>
377<P>Et vous pouvez aussi ajouter un label à la zone de la vboxb&nbsp;:
378<P>
379<BLOCKQUOTE><CODE>
380<PRE>
381label = gtk_label_new ("Les boîtes de dialogues sont pratiques");
382gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE,
383                    TRUE, 0);
384gtk_widget_show (label);
385</PRE>
386</CODE></BLOCKQUOTE>
387<P>Comme exemple d'utilisation d'une boîte de dialogue, vous pourriez
388mettre deux boutons dans la zone d'action (un bouton « Annuler » et un
389bouton « Ok ») et un label dans la zone de la vbox posant une question
390à l'utilisateur ou signalant une erreur, etc. Vous pouvez alors
391attacher un signal différent à chacun des boutons et réaliser
392l'opération que l'utilisateur a choisie.
393<P>
394<P>
395<H2><A NAME="ss7.5">7.5 Pixmaps</A>
396</H2>
397
398<P>Les pixmaps sont des structures de données contenant des
399images. Celles-ci peuvent être utilisées à différents endroits, mais
400le plus souvent comme icônes dans le bureau X Window. Un bitmap est un
401pixmap de 2 couleurs.
402<P>Pour utiliser des pixmaps avec GTK, on doit d'abord construire une
403structure <EM>GdkPixmap</EM> en utilisant les fonctions de la couche
404GDK. Les pixmaps peuvent soit être créés à partir de données en
405memoire, ou à partir de données lues dans un fichier. Nous utiliserons
406chacun des appels pour créer un pixmap.
407<P>
408<BLOCKQUOTE><CODE>
409<PRE>
410GdkPixmap *gdk_bitmap_create_from_data( GdkWindow *window,
411                                        gchar     *data,
412                                        gint      width,
413                                        gint      height );
414</PRE>
415</CODE></BLOCKQUOTE>
416<P>Cette fonction sert à créer un pixmap mono-plan (2 couleurs) à partir
417de données en mémoire. Chaque bit de la donnée <EM>data</EM>. <EM>width</EM>
418et <EM>height</EM> sont exprimés en pixels. Le pointeur vers un
419<EM>GdkWindow</EM> pointe sur la fenêtre courante car les ressources d'un
420pixmap n'ont de signification que dans le contexte de l'écran où il
421doit s'afficher.
422<P>
423<BLOCKQUOTE><CODE>
424<PRE>
425GdkPixmap* gdk_pixmap_create_from_data( GdkWindow  *window,
426                                        gchar      *data,
427                                        gint        width,
428                                        gint        height,
429                                        gint        depth,
430                                        GdkColor   *fg,
431                                        GdkColor   *bg );
432</PRE>
433</CODE></BLOCKQUOTE>
434<P>Cette fonction est utilisée pour créer un pixmap d'une profondeur
435donnée (nombre de couleurs) à partir de la donnée spécifiée pas
436<EM>data</EM>. <EM>fg</EM> et <EM>bg</EM> sont les couleurs à utiliser pour
437l'avant et l'arrière-plan.
438<P>
439<BLOCKQUOTE><CODE>
440<PRE>
441GdkPixmap* gdk_pixmap_create_from_xpm( GdkWindow  *window,
442                                       GdkBitmap **mask,
443                                       GdkColor   *transparent_color,
444                                       const gchar *filename );
445</PRE>
446</CODE></BLOCKQUOTE>
447<P>Le format XPM est une représentation des pixmaps reconnue par le système X Window. Il est largement utilisé et de nombreux utilitaires pour créer des fichiers d'images à ce format sont disponibles. Le fichier <EM>filename</EM> doit contenir une image dans ce format qui sera chargée dans la structure pixmap. Le masque <EM>mask</EM> indique quels sont les bits opaques du pixmap. Tous les autres bits sont colorisés en utilisant la couleur spécifiée par <EM>transparent_color</EM>. Un exemple d'utilisation est présenté ci-dessous.
448<P>
449<BLOCKQUOTE><CODE>
450<PRE>
451GdkPixmap* gdk_pixmap_create_from_xpm_d (GdkWindow  *window,
452                                         GdkBitmap **mask,
453                                         GdkColor   *transparent_color,
454                                         gchar     **data);
455</PRE>
456</CODE></BLOCKQUOTE>
457<P>De petites images peuvent être intégrées dans un programme sous la forme de
458données <EM>data</EM> au format XPM. Un pixmap est créé en utilisant ces données au
459lieu de les lire dans un fichier. Un exemple de telles données est&nbsp;:
460<P>
461<BLOCKQUOTE><CODE>
462<PRE>
463/* XPM */
464static const char * xpm_data[] = {
465"16 16 3 1",
466"       c None",
467".      c #000000000000",
468"X      c #FFFFFFFFFFFF",
469"                ",
470"   ......       ",
471"   .XXX.X.      ",
472"   .XXX.XX.     ",
473"   .XXX.XXX.    ",
474"   .XXX.....    ",
475"   .XXXXXXX.    ",
476"   .XXXXXXX.    ",
477"   .XXXXXXX.    ",
478"   .XXXXXXX.    ",
479"   .XXXXXXX.    ",
480"   .XXXXXXX.    ",
481"   .XXXXXXX.    ",
482"   .........    ",
483"                ",
484"                "};
485</PRE>
486</CODE></BLOCKQUOTE>
487<P>
488<BLOCKQUOTE><CODE>
489<PRE>
490void gdk_pixmap_destroy( GdkPixmap  *pixmap );
491</PRE>
492</CODE></BLOCKQUOTE>
493<P>Lorsqu'on a utilisé un pixmap et que l'on en a plus besoin tout de suite, il est préférable de libérer la ressource en utilisant un appel à <EM>gdk_pixmap_destroy</EM>.  Les pixmaps doivent être considérées comme une ressource précieuse.
494<P>Quand le pixmap est créé, on peut l'afficher comme un widget GTK. On
495doit créer un widget pixmap qui contiendra le pixmap GDK. Ceci est
496réalisé de la façon suivante&nbsp;:
497<P>
498<BLOCKQUOTE><CODE>
499<PRE>
500GtkWidget* gtk_pixmap_new( GdkPixmap  *pixmap,
501                           GdkBitmap  *mask );
502</PRE>
503</CODE></BLOCKQUOTE>
504<P>Les autres fonctions pour les widgets pixmap sont&nbsp;:
505<P>
506<BLOCKQUOTE><CODE>
507<PRE>
508guint gtk_pixmap_get_type( void );
509void  gtk_pixmap_set( GtkPixmap  *pixmap,
510                      GdkPixmap  *val,
511                      GdkBitmap  *mask);
512void  gtk_pixmap_get( GtkPixmap  *pixmap,
513                      GdkPixmap **val,
514                      GdkBitmap **mask);
515</PRE>
516</CODE></BLOCKQUOTE>
517<P><EM>gtk_pixmap_set</EM> sert à changer le pixmap pris en charge par le widget. <EM>val</EM> est le pixmap créé par le GDK.
518<P>Voici un exemple illustrant l'utilisation d'un pixmap dans un bouton&nbsp;:
519<P>
520<BLOCKQUOTE><CODE>
521<PRE>
522
523#include &lt;gtk/gtk.h>
524
525
526/* données XPM d'une icône "Ouvrir fichier" */
527static const char * xpm_data[] = {
528"16 16 3 1",
529"       c None",
530".      c #000000000000",
531"X      c #FFFFFFFFFFFF",
532"                ",
533"   ......       ",
534"   .XXX.X.      ",
535"   .XXX.XX.     ",
536"   .XXX.XXX.    ",
537"   .XXX.....    ",
538"   .XXXXXXX.    ",
539"   .XXXXXXX.    ",
540"   .XXXXXXX.    ",
541"   .XXXXXXX.    ",
542"   .XXXXXXX.    ",
543"   .XXXXXXX.    ",
544"   .XXXXXXX.    ",
545"   .........    ",
546"                ",
547"                "};
548
549
550/* Termine l'application lorsqu'elle est appelée
551 * via le signal "delete_event" */
552
553void close_application( GtkWidget *widget, GdkEvent *event, gpointer *data )
554{
555    gtk_main_quit();
556}
557
558
559/* Invoquée lorsque le bouton est cliqué. Affiche simplement
560 * un message. */
561
562void button_clicked( GtkWidget *widget, gpointer *data )
563{
564    printf( "bouton cliqué\n" );
565}
566
567
568int main( int argc, char *argv[] )
569{
570    /* GtkWidget est le type pour déclarer les widgets */
571
572    GtkWidget *window, *pixmapwid, *button;
573    GdkPixmap *pixmap;
574    GdkBitmap *mask;
575    GtkStyle *style;
576   
577    /* Crée la fenêtre principale et attache le signal "delete_event" pour
578     * terminer l'application */
579
580    gtk_init( &amp;argc, &amp;argv );
581    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
582    gtk_signal_connect( GTK_OBJECT (window), "delete_event",
583                        GTK_SIGNAL_FUNC (close_application), NULL );
584    gtk_container_border_width( GTK_CONTAINER (window), 10 );
585    gtk_widget_show( window );
586
587    /* Utilisation de GDK pour créer le pixmap */
588
589    style = gtk_widget_get_style( window );
590    pixmap = gdk_pixmap_create_from_xpm_d( window->window,  &amp;mask,
591                                           &amp;style->bg[GTK_STATE_NORMAL],
592                                           (gchar **)xpm_data );
593
594    /* Création d'un widget pixmap GTK pour contenir le pixmap GDK */
595
596    pixmapwid = gtk_pixmap_new( pixmap, mask );
597    gtk_widget_show( pixmapwid );
598
599    /* Création d'un bouton pour contenir le widget pixmap */
600
601    button = gtk_button_new();
602    gtk_container_add( GTK_CONTAINER(button), pixmapwid );
603    gtk_container_add( GTK_CONTAINER(window), button );
604    gtk_widget_show( button );
605
606    gtk_signal_connect( GTK_OBJECT(button), "clicked",
607                        GTK_SIGNAL_FUNC(button_clicked), NULL );
608
609    /* Affichage de la fenêtre */
610    gtk_main ();
611         
612    return 0;
613}
614</PRE>
615</CODE></BLOCKQUOTE>
616<P>
617<P>Pour charger un fichier à partir d'un fichier XPM appelé
618<EM>icon0.xpm</EM> se trouvant dans le répertoire courant, on aurait créé
619le pixmap ainsi&nbsp;:
620<P>
621<BLOCKQUOTE><CODE>
622<PRE>
623    /* Charge un pixmap à partir d'un fichier */
624
625    pixmap = gdk_pixmap_create_from_xpm( window->window, &amp;mask,
626                                         &amp;style->bg[GTK_STATE_NORMAL],
627                                         "./icon0.xpm" );
628    pixmapwid = gtk_pixmap_new( pixmap, mask );
629    gtk_widget_show( pixmapwid );
630    gtk_container_add( GTK_CONTAINER(window), pixmapwid );
631</PRE>
632</CODE></BLOCKQUOTE>
633<P>
634<P>Utilisation des formes
635<P>Un désavantage de l'utilisation des pixmaps est que l'objet affiché
636est toujours rectangulaire, quelle que soit l'image. On voudrait
637pouvoir créer des bureaux et des applications avec des icônes ayant
638des formes plus naturelles. Par exemple, pour une interface de jeu, on
639aimerait avoir des boutons ronds à pousser. Pour faire cela, on doit
640utiliser des fenêtres avec des formes.
641<P>Une fenêtre avec forme est simplement un pixmap dont les pixels du
642fond sont transparents. Ainsi, lorsque l'image d'arrière-plan est
643multicolore, on ne la cache pas avec le bord de notre icône. L'exemple
644suivant affiche une image de brouette sur le bureau.
645<P>
646<BLOCKQUOTE><CODE>
647<PRE>
648
649#include &lt;gtk/gtk.h>
650
651/* XPM */
652static char * WheelbarrowFull_xpm[] = {
653"48 48 64 1",
654"       c None",
655".      c #DF7DCF3CC71B",
656"X      c #965875D669A6",
657"o      c #71C671C671C6",
658"O      c #A699A289A699",
659"+      c #965892489658",
660"@      c #8E38410330C2",
661"#      c #D75C7DF769A6",
662"$      c #F7DECF3CC71B",
663"%      c #96588A288E38",
664"&amp;      c #A69992489E79",
665"*      c #8E3886178E38",
666"=      c #104008200820",
667"-      c #596510401040",
668";      c #C71B30C230C2",
669":      c #C71B9A699658",
670">      c #618561856185",
671",      c #20811C712081",
672"&lt;      c #104000000000",
673"1      c #861720812081",
674"2      c #DF7D4D344103",
675"3      c #79E769A671C6",
676"4      c #861782078617",
677"5      c #41033CF34103",
678"6      c #000000000000",
679"7      c #49241C711040",
680"8      c #492445144924",
681"9      c #082008200820",
682"0      c #69A618611861",
683"q      c #B6DA71C65144",
684"w      c #410330C238E3",
685"e      c #CF3CBAEAB6DA",
686"r      c #71C6451430C2",
687"t      c #EFBEDB6CD75C",
688"y      c #28A208200820",
689"u      c #186110401040",
690"i      c #596528A21861",
691"p      c #71C661855965",
692"a      c #A69996589658",
693"s      c #30C228A230C2",
694"d      c #BEFBA289AEBA",
695"f      c #596545145144",
696"g      c #30C230C230C2",
697"h      c #8E3882078617",
698"j      c #208118612081",
699"k      c #38E30C300820",
700"l      c #30C2208128A2",
701"z      c #38E328A238E3",
702"x      c #514438E34924",
703"c      c #618555555965",
704"v      c #30C2208130C2",
705"b      c #38E328A230C2",
706"n      c #28A228A228A2",
707"m      c #41032CB228A2",
708"M      c #104010401040",
709"N      c #492438E34103",
710"B      c #28A2208128A2",
711"V      c #A699596538E3",
712"C      c #30C21C711040",
713"Z      c #30C218611040",
714"A      c #965865955965",
715"S      c #618534D32081",
716"D      c #38E31C711040",
717"F      c #082000000820",
718"                                                ",
719"          .XoO                                  ",
720"         +@#$%o&amp;                                ",
721"         *=-;#::o+                              ",
722"           >,&lt;12#:34                            ",
723"             45671#:X3                          ",
724"               +89&lt;02qwo                        ",
725"e*                >,67;ro                       ",
726"ty>                 459@>+&amp;&amp;                    ",
727"$2u+                  >&lt;ipas8*                  ",
728"%$;=*                *3:.Xa.dfg>                ",
729"Oh$;ya             *3d.a8j,Xe.d3g8+             ",
730" Oh$;ka          *3d$a8lz,,xxc:.e3g54           ",
731"  Oh$;kO       *pd$%svbzz,sxxxxfX..&amp;wn>         ",
732"   Oh$@mO    *3dthwlsslszjzxxxxxxx3:td8M4       ",
733"    Oh$@g&amp; *3d$XNlvvvlllm,mNwxxxxxxxfa.:,B*     ",
734"     Oh$@,Od.czlllllzlmmqV@V#V@fxxxxxxxf:%j5&amp;   ",
735"      Oh$1hd5lllslllCCZrV#r#:#2AxxxxxxxxxcdwM*  ",
736"       OXq6c.%8vvvllZZiqqApA:mq:Xxcpcxxxxxfdc9* ",
737"        2r&lt;6gde3bllZZrVi7S@SV77A::qApxxxxxxfdcM ",
738"        :,q-6MN.dfmZZrrSS:#riirDSAX@Af5xxxxxfevo",
739"         +A26jguXtAZZZC7iDiCCrVVii7Cmmmxxxxxx%3g",
740"          *#16jszN..3DZZZZrCVSA2rZrV7Dmmwxxxx&amp;en",
741"           p2yFvzssXe:fCZZCiiD7iiZDiDSSZwwxx8e*>",
742"           OA1&lt;jzxwwc:$d%NDZZZZCCCZCCZZCmxxfd.B ",
743"            3206Bwxxszx%et.eaAp77m77mmmf3&amp;eeeg* ",
744"             @26MvzxNzvlbwfpdettttttttttt.c,n&amp;  ",
745"             *;16=lsNwwNwgsvslbwwvccc3pcfu&lt;o    ",
746"              p;&lt;69BvwwsszslllbBlllllllu&lt;5+     ",
747"              OS0y6FBlvvvzvzss,u=Blllj=54       ",
748"               c1-699Blvlllllu7k96MMMg4         ",
749"               *10y8n6FjvllllB&lt;166668           ",
750"                S-kg+>666&lt;M&lt;996-y6n&lt;8*          ",
751"                p71=4 m69996kD8Z-66698&amp;&amp;        ",
752"                &amp;i0ycm6n4 ogk17,0&lt;6666g         ",
753"                 N-k-&lt;>     >=01-kuu666>        ",
754"                 ,6ky&amp;      &amp;46-10ul,66,        ",
755"                 Ou0&lt;>       o66y&lt;ulw&lt;66&amp;       ",
756"                  *kk5       >66By7=xu664       ",
757"                   &lt;&lt;M4      466lj&lt;Mxu66o       ",
758"                   *>>       +66uv,zN666*       ",
759"                              566,xxj669        ",
760"                              4666FF666>        ",
761"                               >966666M         ",
762"                                oM6668+         ",
763"                                  *4            ",
764"                                                ",
765"                                                "};
766
767
768/* Termine l'application lorsqu'elle est appelée
769 * (via le signal "delete_event"). */
770
771void close_application( GtkWidget *widget, GdkEvent *event, gpointer *data )
772{
773    gtk_main_quit();
774}
775
776
777int main (int argc, char *argv[])
778{
779    GtkWidget *window, *pixmap, *fixed;
780    GdkPixmap *gdk_pixmap;
781    GdkBitmap *mask;
782    GtkStyle *style;
783    GdkGC *gc;
784   
785    /* crée la fenêtre principale et attache le signal "delete_event"
786     * pour terminer l'application. On notera que la fenêtre principale
787     * n'a pas de barre de titre car nous la faisons surgir. */
788
789    gtk_init (&amp;argc, &amp;argv);
790    window = gtk_window_new( GTK_WINDOW_POPUP );
791    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
792                        GTK_SIGNAL_FUNC (close_application), NULL);
793    gtk_widget_show (window);
794
795    /* Création du pixmap et du widget pixmap */
796
797    style = gtk_widget_get_default_style();
798    gc = style->black_gc;
799    gdk_pixmap = gdk_pixmap_create_from_xpm_d( window->window, &amp;mask,
800                                             &amp;style->bg[GTK_STATE_NORMAL],
801                                             WheelbarrowFull_xpm );
802    pixmap = gtk_pixmap_new( gdk_pixmap, mask );
803    gtk_widget_show( pixmap );
804
805    /* Pour afficher le pixmap, on utilise un widget fixe pour placer
806     * le pixmap */
807
808    fixed = gtk_fixed_new();
809    gtk_widget_set_usize( fixed, 200, 200 );
810    gtk_fixed_put( GTK_FIXED(fixed), pixmap, 0, 0 );
811    gtk_container_add( GTK_CONTAINER(window), fixed );
812    gtk_widget_show( fixed );
813
814    /* On masque tout sauf l'image elle-même */
815
816    gtk_widget_shape_combine_mask( window, mask, 0, 0 );
817   
818    /* Affichage de la fenêtre */
819
820    gtk_widget_set_uposition( window, 20, 400 );
821    gtk_widget_show( window );
822    gtk_main ();
823         
824    return 0;
825}
826</PRE>
827</CODE></BLOCKQUOTE>
828<P>Pour rendre l'image de la brouette sensible aux clics, on peut lui
829attacher le signal "button_press_event" pour lui faire faire quelque
830chose. Les quelques lignes suivantes font que l'image sera sensible à
831un clic souris qui provoquera l'arrêt de l'application.
832<P>
833<BLOCKQUOTE><CODE>
834<PRE>
835gtk_widget_set_events( window,
836                       gtk_widget_get_events( window ) |
837                       GDK_BUTTON_PRESS_MASK );
838
839gtk_signal_connect( GTK_OBJECT(window), "button_press_event",
840                    GTK_SIGNAL_FUNC(close_application), NULL );
841</PRE>
842</CODE></BLOCKQUOTE>
843<P>
844<P>
845<HR NOSHADE>
846<A HREF="gtk_tut_fr-8.html">Page suivante</A>
847<A HREF="gtk_tut_fr-6.html">Page précédente</A>
848<A HREF="gtk_tut_fr.html#toc7">Table des matières</A>
849</BODY>
850</HTML>
Note: See TracBrowser for help on using the repository browser.