73. GUIs II: Ein erstes Programm

GUI-Programme, vor allem in prozeduralen Sprachen, neigen zur Verfettung. Folgende Funktion öffnet ein leeres Fenster:

GtkWindow *openMainWindow(char *title, int xSz, int ySz,
  GtkBox **mainBox)
{
  GtkWindow *window=GTK_WINDOW(
    gtk_window_new(GTK_WINDOW_TOPLEVEL));

  gtk_signal_connect(GTK_OBJECT(window), "destroy",
    GTK_SIGNAL_FUNC(gtk_main_quit), "WM destroy");
  gtk_window_set_title(window, title);
  gtk_widget_set_usize(GTK_WIDGET(window), xSz, ySz);

  *mainBox = GTK_BOX(gtk_vbox_new (FALSE, 1));
  gtk_container_border_width(
    GTK_CONTAINER(*mainBox), 1);
  gtk_container_add (GTK_CONTAINER(window),
    GTK_WIDGET(*mainBox));
  gtk_widget_show(GTK_WIDGET(*mainBox));
  gtk_widget_show(GTK_WIDGET(window));

  return window;
}

int main(int argc, char *argv[])
{ GtkWindow *window; GtkBox *mainBox;
  gtk_init(&argc, &argv);
  window = openMainWindow("Mein", 300, 200, &mainBox);
  gtk_main(); return 0;
}

Gtk ist natürlich nicht in der Standardbibliothek, und auch die Header sind üblicherweise nicht an den Stellen, die der Compiler ohne weiteres durchsucht. Daher braucht man Flags, die hier das Programm gtk-config ausspuckt. In einem Makefile könnte man dazu sagen

CFLAGS += ‘gtk-config --cflags‘
LDFLAGS += ‘gtk-config --libs‘

Beobachtungen

gtk_init

wird mit den Kommandozeilenargumenten aufgerufen, damit gtk automatisch Optionen wie --display interpretieren kann.

Ein Window ist automatisch auch ein Widget (es ist “abgeleitet”). Wenn eine Funktion ein GtkWidget braucht, kann man durch Anwendung des Makros GTK_WIDGET einen GtkWindow* auf einen GtkWidget* casten.

Was auf was castbar ist, steht in einer Klassenhierarchie, wobei a auf b castbar ist, wenn a “unter” b steht.

GtkWindows dürfen nur ein Widget einbetten (das ist eine Charakteristik der Oberklasse GtkBin). Deshalb packen wir gleich eine Box – mainBox – rein, die mehrere Widgets einbetten kann (GtkBox erbt direkt von GtkContainer).

Der Aufruf von gtk_signal_connect verbindet hier das Signal “zumachen” mit einer Funktion, die den GTK-Event Loop beendet – ohne den Aufruf wäre das Fenster nicht zu schließen.


Markus Demleitner

Copyright Notice