In diesem Beispiel möchte ich mit euch einen kleinen Taschenrechner erstellen, der zumindest die Grundrechenarten unterstützt. Negative oder gebrochene Zahlen dürft ihr als zusätzliche Übung danach selbst implementieren…
…besteht aus solidem Code:
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_init (&argc, &argv); /* Fenster erstellen */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Calculator"); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; }
Vom Design her wird es keine Besonderheiten geben: Oberflächenerstellung und Callback-Verknüpfung kommt in die main
-Funktion, der Rest der Logik wird in den Callbacks ablaufen.
Globale Konstanten und Variablen behalte ich mir vor, allerdings nur für das Nötigste.
Zum Thema Layout bietet sich bei einem Taschenrechner ein Tabellenformat an. GTK+ liefert hierfür mit GtkTable ein effektives Container-Widget1), welches wir nun einsetzen wollen.
Zuerst eine neue Variable mit Namen table
:
GtkWidget *window, *table; /* Neu */
Dann nach der Erstellung des Fenster folgendes einfügen (oder abtippen):
table = gtk_table_new(5, 4, TRUE); gtk_container_add(GTK_CONTAINER(window), table);
Damit haben wir ein GtkTable mit 5 Zeilen und 4 Spalten, wobei die Eigenschaft, dass die Elemente gleichmäßig angeordnet werden (homogeneous) auf TRUE steht.
Mit Zeile 2 setzen wir table
auf window
.
…werden wir zur Ausgabe der Eingaben und der Ergebnisse benutzen.
Dazu erweitern wir die Liste der GtkWidget Deklaration am Anfang um folgende Zeile:
*entry;
Und fügen folgendes nach der GtkTable Erstellung ein:
entry = gtk_entry_new(); gtk_entry_set_alignment(GTK_ENTRY(entry), 1); gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE); gtk_table_attach_defaults(GTK_TABLE(table), entry, 0, 4, 0, 1);
Zeile 1 sollte selbsterklärend sein.
In Zeile 2 wird die Textausrichtung auf rechtsbündig gesetzt. Eine 0
würde linksbündig bedeuten (default).
In Zeile 3 wird das GtkEntry read-only, Text kann nicht normal über die Tastatur eingegeben werden.
In Zeile 4 wird entry
in table
an folgende Position gesetzt:
entry
grenzt an Spalte 0 (also ganz links)entry
grenzt an Spalte 4 (entspricht bei 4 Spalten ganz rechts)entry
grenzt an Zeile 0 (ganz oben)entry
grenzt an Zeile 1 (erste Zeile)