GTK/ Fenster
Aus Wikibooks
Fenster haben wir ja schon kennen gelernt. Wir haben sie bisher in jedem Beispiel verwendet, um unsere Ausgaben dorthin in Form von Labels zu verlagern. Viel haben wir jedoch bisher noch nicht getan. Du hast gelernt, ein Fenster zu erzeugen - und das war es auch schon. Außerdem ist dir der Name der Anwendung in der Titelleiste garantiert schon aufgefallen - wäre es nicht schön, wenn du den Text selbst bestimmen kannst? Natürlich kannst du das, und dazu noch viele andere Sachen. Schauen wir uns an, welche...
Inhaltsverzeichnis |
[Bearbeiten] Fenstertitel ändern
In diesem Beispiel wird der Titel des Fensters mit gtk_window_set_title gesetzt und danach mit gtk_window_get_title wieder ausgelesen.
-
#include <gtk/gtk.h>
-
-
int handlerfunktion(GtkButton *button, gpointer user_data)
-
{
-
GtkWidget *dialog;
-
-
dialog = gtk_message_dialog_new(
-
NULL,
-
GTK_DIALOG_DESTROY_WITH_PARENT,
-
GTK_MESSAGE_INFO,
-
GTK_BUTTONS_CLOSE,
-
"Der Fenstertitel ist: %s",
-
gtk_window_get_title(GTK_WINDOW(user_data)),
-
NULL);
-
gtk_dialog_run(GTK_DIALOG(dialog));
-
gtk_widget_destroy(dialog);
-
}
-
-
int main(int argc, char *argv[])
-
{
-
GtkWidget *window, *knopf;
-
-
gtk_init(&argc, &argv);
-
-
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
gtk_window_set_title(GTK_WINDOW(window), "Blubb");
-
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
-
-
knopf = gtk_button_new_with_label("Klick mich!");
-
g_signal_connect(G_OBJECT(knopf), "clicked", G_CALLBACK(handlerfunktion), window);
-
-
gtk_container_add(GTK_CONTAINER(window), knopf);
-
-
gtk_widget_show_all(window);
-
-
gtk_main();
-
}
[Bearbeiten] Fenstericon ändern
Ebenfalls kann man das Symbol in der Titelleiste ändern. Dazu übergebt man der Funktion gtk_window_set_icon zusätzlich zu dem Fenster einen Zeiger auf einen Pixelbuffer. Dieser wird hier aus einer Datei erzeugt, deren Name als Parameter der Funktion gdk_pixbuf_new_from_file übergeben wurde.
Für dieses Beispiel benötigst du im entsprechenden Verzeichnis eine Datei namens icon.png. Du könntest die
Beispieldatei verwenden.
-
#include <gtk/gtk.h>
-
-
int main(int argc, char *argv[])
-
{
-
GtkWidget *window;
-
-
gtk_init(&argc, &argv);
-
-
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
gtk_window_set_title(GTK_WINDOW(window), "Blubb");
-
gtk_window_set_icon(GTK_WINDOW(window), gdk_pixbuf_new_from_file("icon.png", NULL));
-
-
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
-
-
gtk_widget_show_all(window);
-
-
gtk_main();
-
}
[Bearbeiten] Fenstergröße ändern
Mit der Funktion gtk_window_resize kann die Größe eines Fensters geändert werden. Zusätzlich zum unumgänglichen Parameter für das zu ändernde Fenster erwartet die Funktion zwei Zahlen für die neue Breite und die neue Höhe. Entsprechend der Mindestgröße kann die Fenstergröße nicht unter dieses Minimum gelangen. Allerdings kann das Fenster auch nicht zu klein gemacht werden - es muss immer der Mindestplatz für alle Elemente vorhanden sein. Kleinere Angaben reduzieren die Größe dann auf das erlaubte Minimum. Dies ist praktisch, wenn man ein Fenster so klein wie möglich machen möchte: man weist ihm einfach die Größe 1/1 zu.
Dazu kann man auch noch festlegen, ob der Benutzer das Fenster selbst verkleinern kann. Dies geschieht mit der Funktion gtk_window_set_resizable, die zusätzlich zum Fenster einen Wert (true oder false) erwartet, der festlegt, ob die Größe geändert werden kann. Analog kann mit gtk_window_get_resizable der Status abgefragt werden.
[Bearbeiten] Schließen-Knopf deaktivieren
Mit dem delete_event-Signal kannst du bereits festlegen, ob ein Fenster geschlossen werden kann (du gibst false in einer Signalfunktion zurück, wenn das Fenster geschlossen werden soll). Dieses Verhalten kannst du weiter ausdehnen: mit gtk_window_set_deletable kannst du festlegen, ob der Schließen-Knopf angezeigt bzw. aktiviert wird. Unter Windows wird der Knopf beispielsweise, wenn du die Eigenschaft auf false setzst, deaktiviert werden.
[Bearbeiten] Übungsaufgaben
Die Lösungen zu den Aufgaben findest du auf der Lösungsseite.
- Erstelle eine Anwendung mit zwei Schaltflächen. Die erste soll die Größe des Fensters auf 300/300 ändern, die zweite soll das Fenster wieder so klein wie möglich machen. Übergebe den beiden Funktionen, wie im ersten Beispiel gezeigt, die Fenstervariable für den Parameter user_data.



