Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, Systemprogrammierung C C++ C/C++ ANSI C Linux Windows GUI gtk gtk+ Gimp Toolkit Fenster Window GUI gtk gtk+ Gimp Toolkit Fenster Window Ein Fenster mit gtk+

Ein leeres Fenster           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

Es ist immer am schwierigsten bei einen Tutorial den Anfang zu machen. Ich beginne als erstes mit dem Hauptwidget dem Fenster (Window). Dies können Sie sich auch gleich merken. Ein Fenster ist auch ein Widget! Bevor Sie aber loslegen, sollten Sie testen, ob Sie GTK auch wirklich Installiert haben. Sie können ja die Version mit folgender Eingabe in einer Konsole testen ...

gtk-config --version

gtk-config ist ein Shell-Skript. Mehr dazu erfahren sie mit der Eingabe von ...

gtk-config --help

Ich verwende bei diesen Beispielen des Tutorials die Version 1.2.8, obwohl bereits höhere Versionen erhältlich sind. Somit können Sie auf jeden Fall sicher sein, dass alles was Sie hier lesen, das es mindestens ab Version 1.2.x funktioniert.

Nun wollen wir uns ansehen, wie mit GTK ein Fenster erzeugt wird. Lassen wir doch mal ein Programmbeispiel für sich sprechen ...

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
 GtkWidget *fenster;

 gtk_init(&argc, &argv);

 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
                    GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

 gtk_widget_show(fenster);

 gtk_main();
 return 0;
}

Übersetzen Sie nun dieses Programmbeispiel folgendermaßen ...

gcc fenster.c `gtk-config --cflags --libs` -o fenster

Wenn alles glatt verlaufen ist, müssten Sie folgendes Fenster vor sich haben ...

Ein leeres Fenster mit gtk

Nun wollen wir die einzelnen Fragmente des Programms analysieren. Die Funktion gtk_signal_connect werden wir vorerst noch ignorieren.

Zur die Headerdatei gtk/gtk.h denke ich mal, muss ich nichts sagen. Zuerst definieren wir in der main-Funktion einen Zeiger auf ein Widget (GtkWidget). In diesem Fall auf des Widget fenster. GtkWidget ist eine Struktur. Aber dazu später mehr.

Nun kommt eine wichtige Zeile. Mit ...

gtk_init(&argc, &argv);

... initialisieren wir GTK. Dies bedeutet, Sie stellen eine Verbindung zum X-Server her. Die Argumente in argv werden geparst. Und zu guter letzt richtet die Funktion gtk_init noch eine "Cleanup-Funktion" ein und zwar die Funktion atexit() (Standardfunktion in ANSI-C). Warum die Funktion atexit() und nicht exit() werden ich noch aufklären.

Im nächsten Schritt ...

fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);

... legen Sie eine Struktur für das Fenster an, auf die unser Widget-Zeiger fenster zeigt. Hierzu der reguläre Syntax für die Funktion ...

GtkWidget *gtk_window_new(GtkWindowType *type);

Folgende Konstanten können Sie für den Fenstertypen (GtkWindowType) verwenden ...

Und zum Schluss wird noch die Funktion ...

gtk_widget_show(fenster);

... für die Anzeige des Fensters auf dem Bildschirm verwendet. Ohne dem Aufruf dieser Funktion, wird das Widget nicht auf dem Bildschirm ausgegeben.

Die Funktion ...

gtk_main();

... am Ende stellt eine Endlosschleife da. Die Schleife wird so lange wiederholt, bis die Funktion gtk_main_quit() aufgerufen wird. Hierzu der Syntax der beiden Funktionen ...

void gtk_main(void);
void gtk_main_quit(void);

Wird die Funktion gtk_main_quit() aufgerufen, geht es hinter gtk_main weiter. In diesem Beispiel wird der main()-Funktion der Rückgabewert 0 übergeben und damit das Programm beendet.

GTK mit MS-Windows           zurück Ein Kapitel tiefer Ein Kapitel höher zum Inhaltsverzeichnis

Nun folgt, wie Versprochen, eine kurze Anleitung wie Sie Programme mit der gtk-Bibliothek unter MS-Windows erstellen können.

Ich verwende hierzu den Compiler Bloodshed Dev C++ 5, welcher einem das Leben mit Gtk recht einfach macht.

Anschließend benötigen Sie die GTK-Laufzeitbibliothek (GTK+ 2.0.0 runtime libraries) für Windows (http://www.bloodshed.net/dev/packages/gtk.html) und speziell für den Bloodshed-Compiler das Packet GTK+ 2.0.0 development package. Bevor Sie eines dieser Dateien installieren benötigen Sie zuerst noch die Bibliothek Imagelib (http://www.bloodshed.net/dev/packages/imagelib.html). Somit hätten Sie sich alles erst mal heruntergeladen.

Nun gehen Sie wie folgt vor ...

Als Beispiel dient nun wieder das leere Fenster, welches wir soeben erstellt haben ...

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
 GtkWidget *fenster;

 gtk_init(&argc, &argv);

 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
                    GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

 gtk_widget_show(fenster);

 gtk_main();
 return 0;
}

Nun müssen Sie ein neues Projekt erstellen. Klicken Sie dann auf das Menü GUI's auf das Symbol GTK. Nun schreiben Sie darin folgenden Quellcode. Fett geschrieben sind die Zeilen, die gegenüber der Orginalversion geändert wurden ...

#include <stdlib.h>
#include <gtk/gtk.h>
#include <windows.h>


int WINAPI
WinMain (HINSTANCE hThisInstance,
         HINSTANCE hPrevInstance,
         LPSTR lpszArgument,
         int nFunsterStil)
{
  GtkWidget *fenster;

  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING,
                    (GLogFunc) gtk_false, NULL);
  gtk_init (&_argc, &_argv);
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING,
  g_log_default_handler, NULL);

 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
                    GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

 gtk_widget_show(fenster);

 gtk_main();
 return 0;
}

Und das kommt dabei heraus ...

Ein Fenster unter XP

Wer sich gleich ein Grundgerüst für jedes neue GTK-Projekt erstellen will, kann dies mit der Datei GTK+.txt im Verzeichnis Laufwerk:/Dev-cpp/Template/ machen. Meist befindet sich dabei schon ein Template darin, welcher aber unnötig viel Code enthält, den man jedesmal wieder mühsam entfernen muss.

Bei mir sieht diese Datei folgendermaßen aus ...

#include <stdlib.h>
#include <gtk/gtk.h>
#include <windows.h>


int WINAPI
WinMain (HINSTANCE hThisInstance,
         HINSTANCE hPrevInstance,
         LPSTR lpszArgument,
         int nFunsterStil)
{
  /* Eventuelle Variablen deklarieren */

  /*GTK initialisieren - Anfang */
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING,
                    (GLogFunc) gtk_false, NULL);
  gtk_init (&_argc, &_argv);
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING,
  g_log_default_handler, NULL);
  /*GTK initialisieren - Ende */

  /* Hier beginnt das eigentliche Programm */

 gtk_main();
 return 0;
}

Mit diese Grundgerüst, können Sie nun auch alle Programme dieses Tutorials mit MS-Windows nachprogrammieren. Wie Sie die GTK-Bibliothek unter anderen Windows-Compiler als dem Bloodshed-Dev-Cpp zum Laufen bringen, müssen Sie leider selber in Erfahrung bringen.



Tipp
 

Einige Tipps, womit Sie sich ein Menge Konfigurations-Arbeit ersparen können, die für jedes neue gtk-projekt sonst anfallen finden Sie hier.

Hinweis
 

Sollten Sie eine Fehlermeldung zurückbekommen wie:
cc1plus.exe unrecognized option '-fnativ-struct'
könnte folgendes helfen:
Ersetzen Sie in der Menüoption "Projekte/Projektoptionen" bei den Parametern der Linkeroptionen die Schalter -fnative-struct durch -mms-bitfields

Weitere Eigenschaften und Einstellungen für Fenster           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

Es gibt eine Menge weiterer Funktionen, mit denen Sie die Darstellung bzw. Einstellung eines Fensters ändern können. Einige dazu finden Sie in folgendem Programm wieder ...

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
 GtkWidget *fenster;

 gtk_init(&argc, &argv);

 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(fenster), "destroy",
                    GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

 gtk_window_set_title(GTK_WINDOW(fenster), "Der Fenstertitel");

 gtk_window_set_default_size(GTK_WINDOW(fenster), 400, 200);

 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_widget_show(fenster);

 gtk_main();

 return 0;
}

Hierzu nun die Erklärung der im Programm verwendeten Funktionen, die, wie Sie sehen konnten, recht einfach zu implementieren sind.

Um unserem Fenster einen Titel zu verpassen haben wir die Funktion ...

gtk_window_set_title(GTK_WINDOW(fenster), "Der Fenstertitel");

... verwendet. Die Schreibweise ...

GTK_WINDOW(fenster)

... in der Funktion gtk_window_set_title() ist ein Casten des Typs. Damit vermeiden Sie eine Warnung von dem Compiler, die bei nicht Casten des Typs ausgegeben wird. Hier der Syntax der Funktion ...

void gtk_window_set_title(GtkWindow *window, const gchar *title);

Mit der nächsten Funktion ...

gtk_window_set_default_size(GTK_WINDOW(fenster), 400, 200);

... haben wir dem Fenster eine Default-Größe von 400x200 Pixel gegeben. Normalerweise liegt diese Default-Größe bei 200x200 Pixel.

Mit der nächsten Funktion legen wir die Position fest, wo unser neues Fenster im Window-Manager erscheinen soll ...

gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

Der Syntax erläutert dabei genaueres zu dieser Funktion ...

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position);

Folgende Positioniermöglichkeiten haben Sie dabei ...

Eine weitere recht nützliche Funktion, die wir aber hier nicht in der Praxis verwendet haben, wäre die Funktion ...

void gtk_window_set_policy(GtkWindow *window, gint allow_shrink,
                           gint allow_grow, gint auto_shrink);

Damit können Sie die Größenveränderung für ein Fenster einstellen bzw. erlauben. Beispielsweise bedeutet ...

gtk_window_set_policy(GTK_WINDOW(fenster), FALSE, FALSE, TRUE);

... das die Fenstergröße Programm-Abhängig ist und die aktuelle Fenstergröße an ein Kind-Fenster vererbt wird.

Es gibt natürlich noch eine ganze Menge mehr Funktionen dazu. Manche werden Sie im Verlaufe dieses Tutorials kennen lernen und andere finden Sie am Ende des Kurses in der Referenz.

Weiter mit Signale und Callbacks