Einfacher Taschenrechner

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… ;-)

Das Grundgerüst

…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.

Das Layout

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.

Ein Entry

…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:

  • Die linke Seite von entry grenzt an Spalte 0 (also ganz links)
  • Die rechte Seite von entry grenzt an Spalte 4 (entspricht bei 4 Spalten ganz rechts)
  • Die obere Seite von entry grenzt an Zeile 0 (ganz oben)
  • Die untere Seite von entry grenzt an Zeile 1 (erste Zeile)

FIXME

1)
Ein Widget, das andere Widgets tragen kann