Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 15 GTK+
  gp 15.1 Was ist GTK+?
    gp 15.1.1 Was sind GDK und Glib?
    gp 15.1.2 Schnittstellen von GTK+ zu anderen Programmiersprachen
    gp 15.1.3 GTK+ und GNOME
    gp 15.1.4 GTK+ Version 1.2 und 2.x
    gp 15.1.5 GTK+-Aufbau des Kapitels
  gp 15.2 GTK+-Anwendungen übersetzen
  gp 15.3 Eine Einführung in die Glib-Bibliothek
    gp 15.3.1 Datentypen
    gp 15.3.2 Routinen
    gp 15.3.3 Assertions-Funktionen
    gp 15.3.4 Speicherverwaltung
    gp 15.3.5 Stringbearbeitung
    gp 15.3.6 Selbstverwaltender Stringpuffer
    gp 15.3.7 Timer
    gp 15.3.8 Dynamische Arrays
    gp 15.3.9 Listen, Hashtabellen und binäre Bäume
    gp 15.3.10 Ausblick Glib
  gp 15.4 Grundlagen der GTK+-Programmierung
    gp 15.4.1 Die Umgebung initialisieren
    gp 15.4.2 Widgets erzeugen und ggf. die Attribute setzen
    gp 15.4.3 Eine Callback-Funktion einrichten, um Events abzufangen
    gp 15.4.4 Eine GTK+-Anwendung beenden
    gp 15.4.5 Die hierarchische Anordnung der Widgets definieren
    gp 15.4.6 Widgets anzeigen
    gp 15.4.7 Signale und Events abfangen und bearbeiten – (Events-)Verarbeitungsschleife
    gp 15.4.8 GTK+ und Umlaute (Zeichenkodierung)
  gp 15.5 Fenster – GtkWindow
    gp 15.5.1 Dialogfenster (Dialogboxen)
    gp 15.5.2 GtkMessageDialog
  gp 15.6 Anzeige-Elemente
    gp 15.6.1 Text – GtkLabel
    gp 15.6.2 Trennlinie – GtkSeparator
    gp 15.6.3 Grafiken – GtkImage
    gp 15.6.4 Statusleiste – GtkStatusbar
    gp 15.6.5 Fortschrittsbalken – GtkProgressBar
  gp 15.7 Behälter
    gp 15.7.1 Boxen – GtkBox
    gp 15.7.2 Aufteilungen, Register und Button-Box
    gp 15.7.3 Tabellen – GtkTable
    gp 15.7.4 Ausrichtung – GtkAlignment
  gp 15.8 Buttons und Toogled-Buttons
    gp 15.8.1 Buttons allgemein
    gp 15.8.2 Radio-Buttons (GtkRadioButton)
    gp 15.8.3 GtkRadioButton, GtkCheckButton und GtkToggleButton
    gp 15.8.4 Signale für Buttons (GtkButton)
  gp 15.9 Dateneingabe
    gp 15.9.1 Textfelder – GtkEntry
    gp 15.9.2 Schieberegler – GtkScale
    gp 15.9.3 Zahlenfelder – GtkSpinButton
    gp 15.9.4 Einstellungen – GtkAdjustment
    gp 15.9.5 GtkEditable
  gp 15.10 Menü und Toolbar
    gp 15.10.1 Menü – GtkItemFactory
    gp 15.10.2 Toolbar – GtkToolbar
    gp 15.10.3 Options-Menü – GtkOptionsMenu
    gp 15.10.4 Combo-Boxen – GtkCombo
  gp 15.11 Mehrzeiliger Text
    gp 15.11.1 Text(editor) – GtkTextView, GtkTextBuffer
    gp 15.11.2 Scrollendes Fenster – GtkScrolledWindow
  gp 15.12 Auswählen (Selection)
    gp 15.12.1 Dateiauswahl – GtkFileSelection
  gp 15.13 Events
  gp 15.14 Weitere Widget- und GTK+-Elemente im Überblick


Rheinwerk Computing

15.6 Anzeige-Elemente  downtop

Als Nächstes sollen hier einige Widgets vorgestellt werden, mit denen nur etwas angezeigt werden kann. Also einfache Widgets ohne irgendwelche Interaktionen wie Ein- oder Ausgabe.

Im folgenden Beispiel werden das Widget GtkLabel, mit dem Sie eine einfache Beschriftung auf einem Widget anbringen, und das Widget GtkImage verwendet, mit dem Sie, wie man dem Klassennamen schon entnehmen kann, Bilder auf ein Widget anzeigen können. Mit GtkImage lassen sich fast Bilder jeglicher Art darstellen. Des Weiteren finden Sie das Widget GtkStatusbar, womit gewöhnlich, der Status – die aktuelle Aktion – der Anwendung in einem kleinen Balken am unterem Fensterrand angezeigt wird. Daneben wird auch noch das häufig verwendete Widget GtkSeparator (hier mit der Unterklasse GtkHSeparator) zum Anzeigen einer Linie verwendet.

Hierzu das Programmbeispiel mit anschließender Erläuterung der einzelnen Widgets.

/* gkt2.c */
/* Anzeigeelemente:             */
/*       Label,                 */
/*       Grafik                 */
/*       Statusbar              */
#include <gtk/gtk.h>
static gint
delete_Event(GtkWidget *widget, GdkEvent event, gpointer daten) {
  g_print("Das Fenster wird zerstoert!\n");
  /* Nur mit FALSE wird die Anwendung wirklich beendet */
  return FALSE;
}
static void end ( GtkWidget *widget, gpointer daten ) {
  g_print("Und tschuess!\n");
  gtk_main_quit();
}
int main(int argc, char *argv[]) {
  GtkWindow  *win;
  GdkPixbuf  *pic;
  GtkVBox    *vbox;
  GtkLabel   *text;
  GtkImage   *image;
  GtkStatusbar *bar;
  GtkHSeparator *sep1, *sep2, *sep3;
  gtk_init( &argc, &argv );
  /* Eine Grafik in einen Pixbuf laden */
  pic = gdk_pixbuf_new_from_file("icon/at-work.gif", NULL );
  /* Fenster mit folgenden Eigenschaften anlegen */
  win = g_object_new( GTK_TYPE_WINDOW,
                      "title", "Verschiedene Anzeigeelemente",
                      "default-width", 300,
                      "default-height", 200,
                      "resizable", TRUE,
                      "window-position", GTK_WIN_POS_CENTER,
                      "border-width", 5,
                      "icon", pic,
                      NULL );
  /* Eine vertikale Box erzeugen */
  vbox = g_object_new( GTK_TYPE_VBOX,
                       "spacing", 5,
                       "homogeneous", FALSE,
                       NULL );
  /* Ein Text-Label erzeugen */
  text = g_object_new(GTK_TYPE_LABEL,
                      "label","Ein einfaches GtkLabel, das"
                      " die\nAbbildung etwas beschreiben"
                      " koennte.\n",
                      "justify", GTK_JUSTIFY_FILL,
                      NULL);
  /* 3 horizontale Separatoren (Linien) erzeugen */
  sep1 = g_object_new( GTK_TYPE_HSEPARATOR, NULL);
  sep2 = g_object_new( GTK_TYPE_HSEPARATOR, NULL);
  sep3 = g_object_new( GTK_TYPE_HSEPARATOR, NULL);
  /* Ein "Bild"-Widget erzeugen */
  image = g_object_new( GTK_TYPE_IMAGE,
                        "file", "icon/john.png",
                        NULL);
  /* Eine Statusbar erzeugen */
  bar = g_object_new( GTK_TYPE_STATUSBAR, NULL );
  /* Text in der Statusbar einfügen */
  gtk_statusbar_push (bar, 0 ,
         "Informationen der aktellen Aktionen in der Statusbar");
  /* Größe der Statusbar nicht (FALSE) veränderbar */
  gtk_statusbar_set_has_resize_grip (bar, FALSE);
  /* Signalhandler einrichten */
  g_signal_connect( win, "delete-event",
                    G_CALLBACK(delete_Event), NULL );
  g_signal_connect( win, "destroy",
                    G_CALLBACK(end), NULL );
  /* Packen */
  /* vertikale Box in das Hauptfenster */
  gtk_container_add( GTK_CONTAINER(win), GTK_WIDGET(vbox));
  /* Einzelne Widgets von oben nach unten in die vertikale */
  /* Box packen                                            */
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(sep1));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(text));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(sep2));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(image));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(sep3));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(bar));
  /* Fenster anzeigen */
  gtk_widget_show_all( GTK_WIDGET(win) );
  /* Hauptschleife von gtk */
  gtk_main();
  g_print("Die GTK-Hauptschleife wurde beendet\n");
  return 0;
}

Das Programm bei der Ausführung:

$ gcc -Wall -o gtk2 gtk2.c \
  `pkg-config gtk+-2.0 --cflags --libs`
$ ./gtk2

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 15.6    Einfache Anzeige-Elemente


Im Beispiel wurden sämtliche Objekte mit der Funktion g_object_new() und der entsprechenden Typenkennung erzeugt. Neben dem bereits bekannten Typ GTK_TYPE_WINDOW und dem Typ GTK_TYPE_VBOX, den Sie im nächsten Abschnitt näher kennen lernen, finden Sie hier noch die Typen GTK_TYPE_LABEL, GTK_TYPE_HSEPARATOR, GTK_TYPE_IMAGE und GTK_TYPE_STATUSBAR vor.


Rheinwerk Computing

15.6.1 Text – GtkLabel  downtop

Mit GtkLabel können Sie einen einfachen Text an ein Widget anbringen. Obwohl Sie hier im Beispiel nur das Attribut justify zur Ausrichtung der Zeilen der Schriften gegeneinander verwendet haben, können Sie hierbei noch eine Menge weiterer Eigenschaften einsetzen.


Tabelle 15.6    Eigenschaften für GtkLabel (GTK_TYPE_LABEL)

Eigenschaft Datentyp Bedeutung
"justify" GtkJustification Die Ausrichtung der einzelnen Zeilen gegeneinander. Folgende Werte sind hierbei möglich: GTK_JUSTIFY_LEFT linksbündig GTK_JUSTIFY_RIGHT rechtsbündig GTK_JUSTIFY_CENTER zentriert GTK_JUSTIFY_FILL Blocksatz
"label" gchararray Der eigentliche Text
"selectable" gboolean Bei TRUE kann der Wert selektiert werden (z. B. für Copy & Paste).
"selection-bound" gint (nur lesbar) Die Position vom Ende der Markierung (in Zeichen vom Anfang der Markierung). Kann z. B. verwendet werden, wenn der Text per Copy & Paste in einen dynamischen Textpuffer gelegt werden soll. Vorausgesetzt, selectable ist auf TRUE gesetzt!
"cursor-position" gint (nur lesbar) Die Position vom Anfang der Markierung (in Zeichen vom Anfang der Markierung). Verwendungszweck und Voraussetzung siehe selection-bound
"use-underline" gboolean Wird hier TRUE verwendet, wird ein Unterstrich unter einem Zeichen verwendet, wenn das Zeichen '_' davor steht. Z. B. wird mit "_Hallo" der Buchstabe H unterstrichen. Hiermit kann man einen Buchstaben als Abkürzungszeichen markieren.
"mnemonic-widget" GtkWidget Hier befindet sich das Widget, das aktiviert werden soll, wenn das Abkürzungszeichen (siehe "use-underline") betätigt wurde.
"wrap" gboolean Bei TRUE werden zu lange Zeilen umbrochen.
"use-markup" gboolean Bei TRUE kann hierbei eine Markup-Sprache (Pango-Markup) verwendet werden.

Ein Label mit use-markup zu verwenden, lässt die häufig etwas blass aussehenden Text-Labels etwas freudiger erscheinen. Verantwortlich für diese Markup-Sprache ist Pango. Die Syntax von Pango lässt sich aus einer Mischung von HTML mit CSS beschreiben; wobei die Text-Engine von Pango wirklich sehr mächtig ist, weshalb hier für weitere Informationen die entsprechende Dokumentation empfohlen sei. Dennoch will ich Ihnen ein kurzes Listing, das den Einsatz von Pango-Markup demonstriert, nicht vorenthalten.

/* gkt2b.c */
/* Anzeigeelemente:             */
/*       Label mit Pango-Markup */
#include <gtk/gtk.h>
static gint
delete_Event(GtkWidget *widget, GdkEvent event, gpointer daten) {
  g_print("Das Fenster wird zerstoert!\n");
  /* Nur mit FALSE wird die Anwendung wirklich beendet */
  return FALSE;
}
static void end ( GtkWidget *widget, gpointer daten ) {
  g_print("Und tschuess!\n");
  gtk_main_quit();
}
int main(int argc, char **argv) {
  GtkWindow  *win;
  GdkPixbuf  *pic;
  GtkVBox    *vbox;
  GtkLabel   *text;
  gtk_init( &argc, &argv );
  /* Eine Grafik in einen Pixbuf laden */
  pic = gdk_pixbuf_new_from_file("icon/at-work.gif", NULL );
  /* Fenster mit folgenden Eigenschaften anlegen */
  win = g_object_new( GTK_TYPE_WINDOW,
                      "title", "Demonstriert Pango-Markup",
                      "default-width",  300,
                      "default-height", 200,
                      "resizable", TRUE,
                      "window-position", GTK_WIN_POS_CENTER,
                      "border-width", 5,
                      "icon", pic,
                      NULL );
  /* Eine vertikale Box erzeugen */
  vbox = g_object_new( GTK_TYPE_VBOX,
                       "spacing", 5,
                       "homogeneous", FALSE,
                       NULL );
  /* Ein Text-Label erzeugen */
  text = g_object_new( GTK_TYPE_LABEL,
 "justify", GTK_JUSTIFY_CENTER,
 "use-markup", TRUE,
 "label",
 "<span font_desc=\"Times Normal 12\"> Times Normal 12</span> - "
 "<span font_desc=\"Verdana\"> Verdana </span> - "
 "<span font_desc=\"Courier Bold 10\"> Courier Bold 10 "
 " </span>\n\n"
 "<span style=\"italic\"> Kursiv </span> - "
 "<span style=\"oblique\"> Geschraegt </span> - "
 "<span style=\"normal\"> Normal </span>\n\n"
 "<span font_desc=\"Times Normal 12\"  background=\"white\""
 " foreground=\"blue\"> Invers1 </span> - "
 "<span font_desc=\"Courier Bold 14\"  background=\"black\""
 " foreground=\"green\"> Invers2 </span> - "
 "<span style=\"italic\"  background=\"red\""
 " foreground=\"yellow\"> Invers3 </span>\n",
                       NULL);
  /* Signalhandler einrichten */
  g_signal_connect( win, "delete-event",
                    G_CALLBACK(delete_Event), NULL );
  g_signal_connect( win, "destroy",
                    G_CALLBACK(end), NULL );
  /* Packen */
  gtk_container_add( GTK_CONTAINER(win), GTK_WIDGET(vbox));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(text));
  /* Fenster anzeigen */
  gtk_widget_show_all( GTK_WIDGET(win) );
  /* Hauptschleife von gtk */
  gtk_main();
  g_print("Die GTK-Hauptschleife wurde beendet\n");
  return 0;
}

Das Programm bei der Ausführung:

$ gcc -Wall -o gtk2b gtk2b.c \
  `pkg-config gtk+-2.0 --cflags --libs`
$ ./gtk2b

Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 15.7    Verwendung von Pango-Markup mit GtkLabel



Rheinwerk Computing

15.6.2 Trennlinie – GtkSeparator  downtop

Viel lässt sich zu diesem Widget eigentlich nicht sagen, nur dass GtkSeparator die Basisklasse für die Widgets GtkVSeparator (vertikale Linie) und GtkHSeparator (horizontale Linie) ist. Im Beispiel wurden mit dem Typ GTK_TYPE_HSEPARATOR drei horizontale Linien erzeugt. Mit dem Typ GTK_TYPE_VSEPARATOR lassen sich auch vertikale Linien erzeugen.


Rheinwerk Computing

15.6.3 Grafiken – GtkImage  downtop

Ebenso einfach wie einen Text (GtkLabel) können Sie auch eine Grafik auf einem Widget anbringen. Hierzu müssen Sie nur ein Widget mit der Klasse GtkImage (vom Typ GTK_TYPE_IMAGE) erzeugen und mithilfe der Eigenschaft file den Pfadnamen zur Grafik angeben. Hierbei werden so ziemlich alle wichtigen Grafikformate unterstützt (gif, jpeg, png, ico, tiff, bmp, tga etc.).

Wenn Sie allerdings neben dem Anzeigen einer Grafik auch daran interessiert sind, diese zu verändern, dann kommen Sie nicht um Pixbufs (GdkPixbuf) herum. Denn letztendlich geschieht die Verarbeitung und Anzeige der Grafik mit GtkImage über ein GdkPixbuf-Objekt. GdkPixbuf ist eine GDK-interne Struktur für Grafikdaten.

Da GdkPixbuf ein recht umfangreiches Thema ist, wurde der GTK+-Lib hierfür gleich eine extra umfangreiche Dokumentation spendiert, auf die ich Sie bei Bedarf verweisen muss.


Rheinwerk Computing

15.6.4 Statusleiste – GtkStatusbar  downtop

Gewöhnlich platziert man eine Statusbar, wie im Beispiel gesehen, unten am Hauptfenster von GtkWindow. Meistens befinden sich darin Informationen, wie z. B. bei einem Texteditor, welche Datei (mit Pfad) geöffnet wurde, in welcher Zeile/Spalte sich der Cursor befindet oder welche Seite von den insgesamt vorhandenen Seiten gerade bearbeitet wird.

guint gtk_statusbar_push ( 
  GtkStatusbar *statusbar, guint context_id, const gchar *text );
void gtk_statusbar_pop (
 GtkStatusbar *statusbar, guint context_id );
guint gtk_statusbar_get_context_id (
 GtkStatusbar *statusbar, const gchar *context_description );
void gtk_statusbar_set_has_resize_grip (
 GtkStatusbar *statusbar, gboolean setting );
void gtk_statusbar_remove ( 
 GtkStatusbar *statusbar, guint context_id, guint message_id );

Nach dem Erzeugen einer solchen Statusleiste können Sie mit der Funktion gtk_statusbar_push() eine neue Statusinformation in diese Leiste einfügen. Genauer, hiermit wird eine Nachricht auf einen Stack der Statusleiste gepuscht. Beim Anzeigen der Statusleiste wird dann immer die Nachricht angezeigt, die oben aufliegt. Mit der Funktion gtk_statusbar_pop() hingegen können Sie eine Nachricht oberhalb des Stacks wieder entfernen.

Jede Nachricht, die auf dem Stack der Statusbar hinzugefügt wird, benötigt eine bestimmte ID, um die Quelle der Nachricht eindeutig identifizieren zu können. Eine solche ID können Sie auch mit der Funktion gtk_statusbar_get_context_id() erzeugen. Diese Funktion gibt eine neue ID (gint) zurück. Natürlich können Sie hierbei auch die ID selbst, wie im Beispiel gesehen, in der Funktion gtk_statusbar_push() als zweiten Parameter eintragen.

Der Vorteil bei der Verwendung von gtk_statusbar_get_context_id() liegt darin, dass mit der Funktion gtk_statusbar_remove() eine Statusnachricht von einer beliebigen Stelle des Stacks entfernt werden kann.

Wollen Sie, dass die Größe der Statusbar veränderbar ist, können Sie mit der Funktion gtk_statusbar_set_has_resize_grip() den zweiten Parameter auf TRUE setzen.


Rheinwerk Computing

15.6.5 Fortschrittsbalken – GtkProgressBar  toptop

Ein weiteres reines Anzeige-Widget, das in diesem Beispiel nicht verwendet wurde, ist das Widget der Klasse GtkProgressBar vom Typ GTK_TYPE_PROGRESS_BAR. Hierbei handelt es sich um einen Fortschrittsbalken, der z. B. anzeigen kann, wie weit ein bestimmter Vorgang abgeschlossen ist.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern