[X] GTKmm Tutorial Teil 1
-
estartu_de schrieb:
Ja, meine ich. :p
Und nun übernimm mal die Korrekturen und häng die neue Version hier an, damit man (ich ) das mal aus Anfängersicht probelesen kann.
Dabei fällt mir auf... sind eventuelle Ergänzungswünsche noch angebracht? Eigentlich sollte doch Rechtschreibung immer am Ende erfolgen.Änderungswünsche sind in der Tat erwünscht. Nur so als Hinweis das ist einer der ersten Artikel die hier gepostet wurden nur hab ich einen neuen Thread aufgemacht. Da sich keiner mehr dafür interessiert hat. Er war mindestens 1 Monat lang [AF] und das seit dem es die Tags gab. Zum technischen ist das so ein Ding wer sollte das denn noch lesen? Ich wüsste jetzt keinen der von GTKmm mehr weis als ich ( ja ich weis Eigenlob stinkt *g* ) Ich tue mein bestes. Wenn ihr Wünsche habt auf was ich noch mehr eingehen sollte nur her damit. Nur so als Hinweis, das ist der erste von vielen abschnitten. Das ist lediglich die Einführung, sozusagen das "Hello World" in GTKmm. Damit das beim Änderungswunsch bedacht wird.
Ich will eigentlich so gut wie jedes Widget irgendwann mal zur Sprache bringen. Im Moment bin ich nur etwas ausgelastet weil wir ( in unserer Firma ) gerade an einem Release arbeiten das gerade zu 70% fertig ist und noch nicht mal in der Betaphase ist obwohl es im November releast wird und wir sind nur 2 Programmierer. Ich arbeite sogar in meiner Freizeit an dem Programm weil es mir Spass macht.
Sag einfach was du noch gerne wissen möchtest und ich werde schauen wo und wie ich das unterbringe.
BR
Vinzenz
-
So, ich frag dann mal drauflos und du kannst dir überlegen, ob du es einbauen willst.
Eines vorweg, ich bin wirklich nur auf MFC und Windows eingeschossen, also in diesem Thema völlig neu.Kap 1.1
Was ist ein Widget?Kap 1.2
Was wäre ein Beispiel für so einen Kompromiss?Kap 2
Wo kriege ich die Entwicklerversion her? Kostet die was?
In welches Forum gehören die Fragen denn genau?Kap 3
dies gilt dann auch für GDKmm, Glibmm, Pangomm und SigC++
äh, was ist dass denn nun wieder?
Wo gucke ich nach, welche Header ich wirklich brauche? Gibt das sowas wie die MSDN? Wo?
Eine kurze Erwähung, dass main ja aus normalem C bekannt sein sollte wäre gut für die Gliederung. Mich hat es etwas verwirrt, dass die Zeile nicht vorkam.
dann solltet ihr eure Auswertung erst nach GTKmm durchführen!
Nach was? Und wieso?
Und du erwähnst nur implizit, dass ich damit für Windows und Linux programmieren kann. Gerade das solltest du in der Einleitung kurz erwähnen.
Außerdem würde ich gerne wissen, ob ich für Linux extra kompilieren muss und ob ich Windowsprogramme (also welche für Windows) unter Linux kompilieren kann und umgekehrt.Trotz der vielen Fragen:
Ich glaube, ich muss mir mal wieder einen Linuxpc installieren, ich wollte sowas schon immer mal versuchen.
Ist da bei Mandriva gleich was dabei?
-
momääääänt. ich habe nich gesagt, dass du aufhören sollst und ich will nicht, dass wir meinetwegen keine autoren mehr haben...
aber ich muss ja auch meine ehrliche meinung dazu sagen (und die war meines erachtens nicht so gemeint, dass du aufhören solltest), damit du auch was davon hast. ich meine, andere wollen ja gerade, dass ich ihnen tipps gebe, damit sie sich bessern. willst du das etwa nicht? is doch auch ne hilfe für dich oder willst du immer dieselben fehler machen? siehs als ne chance.
Mr. B
-
Sorry bin derzeit etwas ausgelastet mit anderen Sachen. Ich werde das aber asap in Angriff nehmen.
Nicht das Ihr denkt das ich aufgegeben habe.
-
wieso is hier rechtschreibung im titel des threads? artikel is doch noch nich fertig, oder? na ja. bin grad im urlaub, deshalb werd ich den JETZT ohnehin nich korrigieren...
Mr. B
-
Mr.B, das soll eine Serie werden. Mehrere Artikel eben und dieser ist soweit fertig.
Hab auch Urlaub...
-
Dasselbe gilt für den Artikel? Das mit den Teilen hab ich jetzt auch verstanden. Soll ich diesen ersten Teil jetzt nochmals überprüfen, oder ist der soweit fertig?
Mr. B
-
hallo? was ist mit der version vom 21.09 von elvissimo? soll ich die jetzt korrigieren oder nicht? ich mache nur ungern zweimal dasselbe!
Also nur zur Erinnerung!
Mr. B
-
Sorry. Ich müsste eigentlich noch estardu_de's fragen einbauen. Nur atm find ich keinen Zeit dafür. Ich schaue das ich es diese Woche bis spätestens Sonntag noch einbaue. Ich geb dir dann grünes Licht.
-
Ich mache so lange ein [A] in den Betreff.
-
Grafische Benutzerschnittstellen in C++ mit GTKmm Betriebssystemunabhängig gestalten
1. WILLKOMMEN IN DER WELT VON GTK+
Bevor wir uns mit der Betriebssystemunabhängigen GTKmm-Programmierung befassen, möchte ich erst einmal auf die Herkunft und die Entstehung von GTKmm und GTK+ eingehen. GTKmm ist eine portable Bibliothek mit der man vor allem unter Linux, MacOS und Windows Programme portabel Programme entwerfen kann.
Hier für müssen die Programme zwar für jedes System neu kompiliert werden aber dies ist ohne große Änderungen bzw. ganz ohne Änderungen zu bewerkstelligen.Das Woher, Warum, Wie und Was soll in diesem Tutorial geklärt werden.
Sollte es noch Fragen und Verbesserungsvorschläge geben, schreibt sie mir doch bitte an evilissimo@c-plusplus.net.
Ich werde dieses Tutorial kapitelweise veröffentlichen und verspreche keine regelmäßigen Termine. Ich werde jedoch an dem Tutorial arbeiten.1.1 Was ist ein Widget
In diesem Tutorial wir sehr häufig das Wort Widget fallen, nun stellt sich sicher der ein oder andere die Frage was ist ein "Widget" denn überhaupt? "Als Widgets bezeichnet man meist Steuerelemente. Zu den am häufigsten genutzten Steuerelementen gehören Schaltflächen und Bildlaufleiste. Daneben gibt es eine Vielzahl mehr oder minder häufig genutzter Steuerelemente."[1]
1.2 Was ist GTK+ eigentlich?
GTK steht für "Gimp Tool Kit". Das Gimp Tool Kit ist eine in C geschriebene Bibliothek für eine grafische Benutzerschnittstelle, die ursprünglich als Alternative für Motif unter Linux entwickelt wurde, um somit dem Bildbearbeitungsprogramm GIMP eine Alternative GUI (Graphical User Interface, zu Deutsch: grafische Benutzerschnittstelle) bereitzustellen.
Im Laufe der Zeit hat sich GTK+ zu einer der erfolgreichsten Widget-Bibliotheken entwickelt und ist auf X-Server basierenden Systemen neben dem QT Toolkit auch einer der meist benutzten. GTK+ ist auch die Basis der GNOME Desktop Environment die der eine oder andere von Euch sicherlich kennt.GTK+ ist zwar in C implementiert, aber mit einem objektorientierten Ansatz, der die Anbindung an objektorientierte Sprachen (wie z.B. Python, Perl und C++ und andere Sprachen) stark vereinfachte, da dies von Anfang an berücksichtigt wurde.
GTKmm ist eine solche Anbindung an GTK+ für C++. Im Gegensatz zum Original GTK+ besitzt GTKmm eine Klassenhierarchie, die die Entwicklung und Weiterentwicklung neuer Widgets stark vereinfacht. Die Typensicherheit von GTKmm erleichtert dem Programmierer die Arbeit enorm. Hierdurch werden einige Fehler im Quelltext bereits zur Kompilierzeit erkannt, was bei der C-Variante nicht der Fall ist und die Fehler somit z. B. womöglich erst durch undefiniertes Verhalten auftreten.
In GTK+ werden ausschließlich Zeiger verwendet, wovon man als C++-Programmierer Abstand nehmen und stattdessen vermehrt auf Membervariablen zurückgreifen sollte. Dies vereinfacht die Speicherverwaltung enorm.1.3 GTKmm ist ein Wrapper
GTKmm ist keine native Implementierung eines Toolkits wie QT es z. B. ist. Aber das hat auch Vorteile. So können sich die GTKmm Entwickler mehr Gedanken darüber machen, eine saubere und transparente Schnittstelle zu schaffen, und müssen sich nicht auf Grund von technischen Details auf Kompromisse einlassen. Ein Beispiel hier für wäre, dass man auf Grund von Technischen Details, Abstriche in der Flexibilität von GTKmm machen zu müssen.
1.4 Bestandteile von GTKmm
GTKmm ist eigentlich nur der Teil der Bibliothek, der für die einzelnen Widgets zuständig ist, d.h. z.B. ein Fenster, Button oder aber auch ein Menü die es wiederum aber mit Hilfe von GTK+ implementiert.
GTKmm selbst verwendet aber auch andere Bibliotheken die man bei der Programmierung mit GTKmm kennen sollte.1.4.1 GTK+ Bibliotheken
Da GTKmm nur ein Wrapper einer C Bibliothek ist, baut es vorallem erst einmal auf diversen C Bibliotheken auf.
Es handelt sich hier bei um folgende C Bibliotheken:
- libglib-2.0
- libatk-1.0
- libpango-1.0
- libgtk-2.0
- libgdk-2.0
- libintl
- libiconv
und je nach Implementation auch –libcairoGLib, Pango, ATK, GDK sind alles bestandteile von GTK+ selbst, wurden aber unterteilt und macht das ganze somit etwas flexibler.
GLib ist der Kern der ganzen Library und bildet die Basis von GTK+ und GNOME. Es erleichtert den Umgang mit Datenstrukturen in C, liefert portable wrapper für verschiedene betriebssystemabhängige Funktionen und enthält Schnittstellen zur Laufzeitfunktionalität wie z.b. Ereignisschleifen, Threads, dynamisches laden und ein Objekt System.
Pango ist eine Layout- und Textrendering Bibliothek mit dem Schwerpunkt auf Internationalisierung. Somit bildet es den Kernteil für den Umgang mit Text und Schriftarten in GTK+ 2.x
ATK liefert diverse Schnittstellen für die Zugänglichkeit. Durch das unterstützen von ATK Schnittstellen kann eine Anwendung oder ein Toolkit mit Werkzeugen wie Bildschirmlesern, Lupen oder alternativen Eingabegeräten benutzt werden.
GDK ist eine Schnittstelle zu nativen Zeichenfunktionen eines Betriebssystems und erhöht damit die Portabilität der Zeichnung von Widgets. Es gibt dafür portable Backends ( diverse Bibliotheken mit einem identischen Interface die man austauschen kann nennt man in der Regel Backends ). GTK+ for Win32 ist z.b. ein solches GDK Backend für Windows.
GTK+ Implementiert die Widgets und deren Verhalten mit Hilfe der zuvor genannten Bibliotheken.
1.4.2 Bestandteile von GTKmm
GTKmm benötigt neben den eben genannten C Bibliotheken auch noch diverse andere Bibliotheken.:
- libglibmm
- libgtkmm
- libsigc++-2.0Es gibt noch andere Bibliotheken, die aber bei libgtkmm schon dabei sind:
- libatkmm
- libgdkmm
- libpangommWie es bereits auffällt haben die meisten dieser Bibliotheken einfach nur ein mm Suffix und sind einfach nur C++ Wrapper der C Bibliotheken. Da ich in 1.4.1 bereits erwähnt habe was die einzelnen Bibliotheken tun werde ich das einfach an dieser Stelle auslassen und direkt auf SigC++ zu sprechen kommen das die einzige Bibliothek ist die nicht auf den C Bibliotheken aufbaut.
SigC++ implementiert ein Typensicheres Callback-System in Standard C++. Es erlaubt einem Signale zu definieren und diese mit irgendeiner Callback-Funktion zu verbinden. Dabei können nicht nur Funktionen sondern auch Methoden verwendet werden selbst wenn diese statisch oder virtuell sind. Es beinhaltet auch Adapter die es einem ermöglichen unterschiedliche Callbacks zu verbinden. Es besteht sogar die Möglichkeit Standardparameter zu übergeben und damit eine Funktion mit mehreren Parametern an eine bestimmte Anforderung anzupassen. Mehr dazu wird es zu einem späteren Zeitpunkt geben da die Signal Behandlung in GTKmm ein größeres Kapitel brauchen wird.
2. Voraussetzung für dieses Tutorial
Ich setze für dieses Tutorial voraus, dass sich eine Entwicklerversion von GTKmm 2.4.x oder höher auf dem System befindet und dass der Leser die Grundlagen von C++ beherrscht und sich im Klaren ist, um was es sich bei Vererbung, Polymorphie und auch SmartPointern handelt. Fragen bezüglich der Programmierung mit GTKmm können im C/C++-Forum unter der Adresse http://www.c-plusplus.net/forum gestellt werden.
Bezüglich der Installation wird es evtl. ein gesonderte Anleitung geben.
2.1 Bezugsmöglichkeiten für Windows
Unter Windows gibt es dafür Installer die einem alle notwendigen Bibliotheken auf dem System installieren.
Den Installer für alle GTK+ Bibliotheken bekommt man hier:
http://gladewin32.sourceforge.net/
Nach der Installation der GTK+ Bibliotheken braucht ihr noch die GTKmm Bibliotheken die Ihr auf:
http://www.pcpm.ucl.ac.be/~gustin/win32_ports/
bekommt. Klickt dort im Menü auf „gtkmm on win32“ und klickt auf den Link unter
Developer (Full) Environment
(runtime + headers, import libraries, demo, doc)Solltet Ihr vorhaben mit der DevC++ IDE zu Programmieren empfehle ich Euch nach der Installtion der beiden Pakete meinen GTKmm Template Installer für DevC++ zu verwenden der Euch eine Vorlage in DevC++ installiert die bereits sämtliche benötigten Includeverzeichnisse und Bibliotheken in das Projekt einbindet.
Ihr findet den Installer auf http://www.evilissimo-softdev.de/downloads.html2.2 Bezugsmöglichkeiten für Linux
Bei Linux hängt es von eurer Distribution ab und ihr solltet euch diesbezüglich extra noch einmal informieren. Fragen zu diesem Thema sind natürlich im GUI Forum des C/C++ Boards Willkommen. (http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html )
Da dies ein Tutorial zur Programmierung mit GTKmm werden soll, werden wir an dieser Stelle mit den "Nebensächlichkeiten" aufhören und non-stop mit der Einführung in die Programmierung beginnen.
3. Grundlagen
3.1 Ein einfaches Beispiel
Das erste GTKmm Programm, das ich euch zeigen möchte, ist ein einfaches Fenster 200 x 200 Pixel.
Hiermit möchte ich verdeutlichen, wie einfach es sein kann, eine GTKmm Anwendung zu schreiben.#include <gtkmm.h> int main(int argc, char *argv[]) { Gtk::Main main_obj(argc, argv); Gtk::Window window_obj; main_obj.run(window_obj); return 0; }
Nun es ist nicht viel Code, aber es erzeugt schon ein Fenster. Nun werde ich detailierter auf die einzelnen Zeilen eingehen und ein paar Bemerkungen dazu machen.
#include <gtkmm.h>
Wir binden mit dieser Zeile alle Headerdateien ein, die zu GTKmm gehören; dies gilt dann auch für GDKmm, Glibmm, Pangomm und SigC++. Der Nachteil dieser Zeile ist, dass sie bei größeren Projekten zu längeren Kompilierzeiten führt, da erst einmal alle Header analysiert werden müssen. Daher ist es empfehlenswert, aber nicht zwingend notwendig, nur die benötigten Header einzubinden. In unserem Fall wären das die folgenden:
#include <gtkmm/main.h> #include <gtkmm/window.h>
In der Dokumentation auf http://www.gtkmm.org/docs/gtkmm-2.4/docs/ findet Ihr heraus in welchen Headern sich die verwendeteten Klassen befinden.
int main(int argc, char *argv[])
Der normale Programm Einstiegspunkt der aus C++ aber auch aus C Programmen bekannt sein sollte.
Gtk::Main main_obj(argc, argv);
Mit dieser Zeile starten wir das GTK+- und GTKmm-Subsystem und stellen durch Übergeben der Parameter argc und argv sicher, dass auch unsere Anwendung wie alle GTK+ Anwendungen bestimmte Standard Parameter annimmt und auswertet. Damit passen wir unser Programm nur an das Verhalten anderer GTK+ Programmen an. Mehr müssen wir darüber nicht wissen, es sei denn wir möchten selber Parameter übergeben - dann solltet ihr eure Auswertung der Parameter erst nach GTKmm durchführen da GTKmm sie zur Initialisierung benötigt!
Merke: Immer erst das GTKmm Subsystem starten.
Die restlichen zwei Zeilen sind nicht sonderlich spektakulär, aber ich werde trotzdem kurz erklären, was diese tun.
Gtk::Window window_obj;
Erstellt ein Fensterobjekt, das wir mir der Zeile:
main_obj.run(window_obj);
starten.
Nachdem wir den Sourcecode in eine Sourcedatei gepackt haben - ich nenne sie hier mal einfach "beispiel1.cpp" - werden wir die Anwendung kompilieren.
Je nach OS wird anders kompiliert. Die Windows-User mit DevC++ drücken vielleicht einfach nur F9. Unix/Linux/*BSD/Whatever-User schreiben dann eher
g++ beispiel1.cpp `pkg-config gtkmm-2.4 --cflags --libs` -o beispiel1
Da dies sehr unterschiedlich ist, möchte ich an dieser Stelle nicht tiefer darauf eingehen. Diese Fragen werden gerne im GUI-Forum auf dem C/C++ Board (http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html ) beantwortet und erhalten dann sicherlich auch Einzug in die FAQ
Und so sieht das dann z.B. unter Window XP aus:
Soviel zum ersten Teil des Tutorials. Ich freue mich schon auf Euer Feedback. Im nächsten Teil werde ich euch die ersten Widgets näher bringen. Darunter fallen Label, Buttons und das GTK Boxen System. Auch eine kleine Einführung in die Verwendung von Signalren. Mehr dazu im nächsten Teil.
evilissimo
Verweise und Referenzen:
[1] Widget (GUI) Beschreibung von Wikipedia
[2] Homepage von GTK+
[3] Homepage von GTKmm
[4] GTKmm Dokumentation
[5] GTKmm Template installer für DevC++ von evilissimo
[6] gladewin32 Installer ( GTK+ Entwicklungsbibliotheken für GTK+ )
[7] GTKmm Installer für Windows ( Entwicklungsbibliotheken für GTKmm)
-
evilissimo schrieb:
Grafische Benutzerschnittstellen in C++ mit GTKmm Betriebssystemunabhängig gestalten
1. WILLKOMMEN IN DER WELT VON GTK+
Bevor wir uns mit der betriebssystemunabhängigen GTKmm-Programmierung befassen, möchte ich erst einmal auf die Herkunft und die Entstehung von GTKmm und GTK+ eingehen. GTKmm ist eine portable Bibliothek mit der man vor allem unter Linux, MacOS und Windows ~doppeltes "Programme" entfernt~portabel Programme entwerfen kann.
Hierfür müssen die Programme zwar für jedes System neu kompiliert werden***,*** aber dies ist ohne große Änderungen bzw. ganz ohne Änderungen zu bewerkstelligen.Das Woher, Warum, Wie und Was soll in diesem Tutorial geklärt werden.
Sollte es noch Fragen und Verbesserungsvorschläge geben, schreibt sie mir doch bitte an evilissimo@c-plusplus.net.
Ich werde dieses Tutorial kapitelweise veröffentlichen und verspreche keine regelmäßigen Termine. Ich werde jedoch an dem Tutorial arbeiten.1.1 Was ist ein Widget
In diesem Tutorial wir sehr häufig das Wort Widget fallen, nun stellt sich sicher der ein oder andere die Frage***: "Was*** ist ein "Widget" denn überhaupt?"
Als Widgets bezeichnet man meist Steuerelemente. Zu den am häufigsten genutzten Steuerelementen gehören Schaltflächen und Bildlaufleisten***. Daneben gibt es eine Vielzahl mehr oder minder häufig genutzter Steuerelemente.~" entfernen*~[1]1.2 Was ist GTK+ eigentlich?
GTK steht für "Gimp Tool Kit". Das Gimp Tool Kit ist eine in C geschriebene Bibliothek für eine grafische Benutzerschnittstelle, die ursprünglich als Alternative für Motif unter Linux entwickelt wurde, um somit dem Bildbearbeitungsprogramm GIMP eine Alternative GUI (Graphical User Interface, zu Deutsch: grafische Benutzerschnittstelle) bereitzustellen.
Im Laufe der Zeit hat sich GTK+ zu einer der erfolgreichsten Widget-Bibliotheken entwickelt und ist auf X-Server basierenden Systemen neben dem QT Toolkit auch einer der meist benutzten. GTK+ ist auch die Basis der GNOME Desktop Environment die der eine oder andere von Euch sicherlich kennt.GTK+ ist zwar in C implementiert, aber mit einem objektorientierten Ansatz, der die Anbindung an objektorientierte Sprachen (wie z.B. Python, Perl und C++ und andere Sprachen) stark vereinfachte, da dies von Anfang an berücksichtigt wurde.
GTKmm ist eine solche Anbindung an GTK+ für C++. Im Gegensatz zum originalen GTK+ besitzt GTKmm eine Klassenhierarchie, die die Entwicklung und Weiterentwicklung neuer Widgets stark vereinfacht. Die Typensicherheit von GTKmm erleichtert dem Programmierer die Arbeit enorm. Hierdurch werden einige Fehler im Quelltext bereits zur Kompilierzeit erkannt, was bei der C-Variante nicht der Fall ist und die Fehler somit z. B. womöglich erst durch undefiniertes Verhalten auftreten~erkannt werden wäre vielleicht besser~.
In GTK+ werden ausschließlich Zeiger verwendet, wovon man als C++-Programmierer Abstand nehmen und stattdessen vermehrt auf Membervariablen zurückgreifen sollte. Dies vereinfacht die Speicherverwaltung enorm.1.3 GTKmm ist ein Wrapper
GTKmm ist keine native Implementierung eines Toolkits wie es z. B. QT ist. Aber das hat auch Vorteile. So können sich die GTKmm Entwickler mehr Gedanken darüber machen, eine saubere und transparente Schnittstelle zu schaffen, und müssen sich nicht auf Grund~muss das nicht aufgrund heissen?~ von technischen Details auf Kompromisse einlassen. Ein Beispiel hierfür wäre, dass man auf Grund **s.o.** von technischen Details, Abstriche in der Flexibilität von GTKmm machen zu müssen.
1.4 Bestandteile von GTKmm
GTKmm ist eigentlich nur der Teil der Bibliothek, der für die einzelnen Widgets zuständig ist, d.h. z.B. ein Fenster, Button oder aber auch ein Menü die es wiederum aber mit Hilfe von GTK+ implementiert.
GTKmm selbst verwendet aber auch andere Bibliotheken die man bei der Programmierung mit GTKmm kennen sollte.1.4.1 GTK+ Bibliotheken
Da GTKmm nur ein Wrapper einer C Bibliothek ist, baut es vorallem erst einmal auf diversen C Bibliotheken auf.
Es handelt sich hier bei um folgende C Bibliotheken:
- libglib-2.0
- libatk-1.0
- libpango-1.0
- libgtk-2.0
- libgdk-2.0
- libintl
- libiconv
und je nach Implementation auch –libcairoGLib, Pango, ATK, GDK sind alles Bestandteile von GTK+ selbst, wurden aber unterteilt***. Das macht das Ganze*** somit etwas flexibler.
GLib ist der Kern der ganzen Library und bildet die Basis von GTK+ und GNOME. Es erleichtert den Umgang mit Datenstrukturen in C, liefert portable Wrapper für verschiedene betriebssystemabhängige Funktionen und enthält Schnittstellen zur Laufzeitfunktionalität wie z.b. Ereignisschleifen, Threads, dynamisches Laden und ein Objekt System.
Pango ist eine Layout- und Textrendering Bibliothek mit dem Schwerpunkt auf Internationalisierung. Somit bildet es den Kernteil für den Umgang mit Text und Schriftarten in GTK+ 2.x***.***
ATK liefert diverse Schnittstellen für die Zugänglichkeit. Durch das Unterstützen von ATK Schnittstellen kann eine Anwendung oder ein Toolkit mit Werkzeugen wie Bildschirmlesern, Lupen oder alternativen Eingabegeräten benutzt werden.
GDK ist eine Schnittstelle zu nativen Zeichenfunktionen eines Betriebssystems und erhöht damit die Portabilität der Zeichnung von Widgets. Es gibt dafür portable Backends ( diverse Bibliotheken mit einem identischen Interface die man austauschen kann nennt man in der Regel Backends ). GTK+ for Win32 ist z.b. ein solches GDK Backend für Windows.
GTK+ Implementiert die Widgets und deren Verhalten mit Hilfe**zusammen?** der zuvor genannten Bibliotheken.
1.4.2 Bestandteile von GTKmm
GTKmm benötigt neben den eben genannten C Bibliotheken auch noch diverse andere Bibliotheken.:
- libglibmm
- libgtkmm
- libsigc++-2.0Es gibt noch andere~weitere wäre besser, weil andere oben grade war~Bibliotheken, die aber bei libgtkmm schon dabei sind:
- libatkmm
- libgdkmm
- libpangommWie es bereits auffällt haben die meisten dieser Bibliotheken einfach nur ein mm Suffix und sind einfach~Zweimal einfach... klingt komisch~ nur C++ Wrapper der C Bibliotheken. Da ich in 1.4.1 bereits erwähnt habe was die einzelnen Bibliotheken tun werde ich das einfach~schon wieder...~ an dieser Stelle auslassen und direkt auf SigC++ zu sprechen kommen das die einzige Bibliothek ist die nicht auf den C Bibliotheken aufbaut.
SigC++ implementiert ein typensicheres Callback-System in Standard C++. Es erlaubt einem Signale zu definieren und diese mit irgendeiner Callback-Funktion zu verbinden. Dabei können nicht nur Funktionen sondern auch Methoden verwendet werden selbst wenn diese statisch oder virtuell sind. Es beinhaltet auch Adapter die es einem ermöglichen unterschiedliche Callbacks zu verbinden. Es besteht sogar die Möglichkeit Standardparameter zu übergeben und damit eine Funktion mit mehreren Parametern an eine bestimmte Anforderung anzupassen. Mehr dazu wird es zu einem späteren Zeitpunkt geben da die Signal-Behandlung in GTKmm ein größeres Kapitel brauchen wird.
2. Voraussetzung für dieses Tutorial
Ich setze für dieses Tutorial voraus, dass sich eine Entwicklerversion von GTKmm 2.4.x oder höher auf dem System befindet und dass der Leser die Grundlagen von C++ beherrscht und sich im Klaren ist, um was es sich bei Vererbung, Polymorphie und auch SmartPointern handelt. Fragen bezüglich der Programmierung mit GTKmm können im C/C++-Forum unter der Adresse http://www.c-plusplus.net/forum gestellt werden.
Bezüglich der Installation wird es evtl. ein gesonderte Anleitung geben.~wieso "wird"? Die folgt doch gleich.~
2.1 Bezugsmöglichkeiten für Windows
Unter Windows gibt es dafür Installer die einem alle notwendigen Bibliotheken auf dem System installieren.
Den Installer für alle GTK+ Bibliotheken bekommt man hier:
http://gladewin32.sourceforge.net/
Nach der Installation der GTK+ Bibliotheken braucht ihr noch die GTKmm Bibliotheken die Ihr auf:
http://www.pcpm.ucl.ac.be/~gustin/win32_ports/
bekommt. Klickt dort im Menü auf „gtkmm on win32“ und klickt auf den Link unter
Developer (Full) Environment
(runtime + headers, import libraries, demo, doc)Solltet Ihr vorhaben mit der DevC++ IDE zu programmieren, empfehle ich Euch nach der Installtion der beiden Pakete meinen GTKmm Template Installer für DevC++ zu verwenden***,*** der Euch eine Vorlage in DevC++ installiert die bereits sämtliche benötigten Includeverzeichnisse und Bibliotheken in das Projekt einbindet.
Ihr findet den Installer auf http://www.evilissimo-softdev.de/downloads.html2.2 Bezugsmöglichkeiten für Linux
Bei Linux hängt es von eurer Distribution ab und ihr solltet euch diesbezüglich extra noch einmal informieren. Fragen zu diesem Thema sind natürlich im GUI Forum des C/C++ Boards willkommen. ( http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html )
Da dies ein Tutorial zur Programmierung mit GTKmm werden soll, werden wir an dieser Stelle mit den "Nebensächlichkeiten" aufhören und non-stop mit der Einführung in die Programmierung beginnen.
3. Grundlagen
3.1 Ein einfaches Beispiel
Das erste GTKmm Programm, das ich euch zeigen möchte, ist ein einfaches Fenster von 200 x 200 Pixel.
Hiermit möchte ich verdeutlichen, wie einfach es sein kann, eine GTKmm Anwendung zu schreiben.#include <gtkmm.h> int main(int argc, char *argv[]) { Gtk::Main main_obj(argc, argv); Gtk::Window window_obj; main_obj.run(window_obj); return 0; }
Nun es ist nicht viel Code, aber es erzeugt schon ein Fenster. Nun werde ich detailierter auf die einzelnen Zeilen eingehen und ein paar Bemerkungen dazu machen.
#include <gtkmm.h>
Wir binden mit dieser Zeile alle Headerdateien ein, die zu GTKmm gehören; dies gilt dann auch für GDKmm, Glibmm, Pangomm und SigC++. Der Nachteil dieser Zeile ist, dass sie bei größeren Projekten zu längeren Kompilierzeiten führt, da erst einmal alle Header analysiert werden müssen. Daher ist es empfehlenswert, aber nicht zwingend notwendig, nur die benötigten Header einzubinden. In unserem Fall wären das die folgenden:
#include <gtkmm/main.h> #include <gtkmm/window.h>
In der Dokumentation auf http://www.gtkmm.org/docs/gtkmm-2.4/docs/ findet Ihr heraus in welchen Headern sich die verwendeteten Klassen befinden.
int main(int argc, char *argv[])
Der normale Programm-Einstiegspunkt der aus C++ aber auch aus C Programmen bekannt sein sollte.
Gtk::Main main_obj(argc, argv);
Mit dieser Zeile starten wir das GTK+- und GTKmm-Subsystem und stellen durch Übergeben der Parameter argc und argv sicher, dass auch unsere Anwendung wie alle GTK+ Anwendungen bestimmte Standard Parameter annimmt und auswertet. Damit passen wir unser Programm nur an das Verhalten anderer GTK+ Programme an. Mehr müssen wir darüber nicht wissen, es sei denn wir möchten selber Parameter übergeben - dann solltet ihr eure Auswertung der Parameter erst nach GTKmm durchführen da GTKmm sie zur Initialisierung benötigt!
Merke: Immer erst das GTKmm Subsystem starten.
Die restlichen zwei Zeilen sind nicht sonderlich spektakulär, aber ich werde trotzdem kurz erklären, was diese tun.
Gtk::Window window_obj;
Erstellt ein Fensterobjekt, das wir mir der Zeile:
main_obj.run(window_obj);
starten.
Nachdem wir den Sourcecode in eine Sourcedatei gepackt haben - ich nenne sie hier mal einfach "beispiel1.cpp" - werden wir die Anwendung kompilieren.
Je nach OS wird anders kompiliert. Die Windows-User mit DevC++ drücken vielleicht einfach nur F9. Unix/Linux/*BSD/Whatever-User schreiben dann eher
g++ beispiel1.cpp `pkg-config gtkmm-2.4 --cflags --libs` -o beispiel1
Da dies sehr unterschiedlich ist, möchte ich an dieser Stelle nicht tiefer darauf eingehen. Diese Fragen werden gerne im GUI-Forum auf dem C/C++ Board ( http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html ) beantwortet und erhalten dann sicherlich auch Einzug in die FAQ
Und so sieht das dann z.B. unter Window XP aus:
Soviel zum ersten Teil des Tutorials. Ich freue mich schon auf Euer Feedback. Im nächsten Teil werde ich euch die ersten Widgets näher bringen. Darunter fallen Label, Buttons und das GTK Boxen System. Auch eine kleine Einführung in die Verwendung von Signalen. Mehr dazu im nächsten Teil.
evilissimo
Verweise und Referenzen:
[1] Widget (GUI) Beschreibung von Wikipedia
[2] Homepage von GTK+
[3] Homepage von GTKmm
[4] GTKmm Dokumentation
[5] GTKmm Template installer für DevC++ von evilissimo
[6] gladewin32 Installer ( GTK+ Entwicklungsbibliotheken für GTK+ )
[7] GTKmm Installer für Windows ( Entwicklungsbibliotheken für GTKmm)Uff, ich hoffe ich habe nichts Neues eingebaut. Wenn kein "Aha-Effekt" beim Drübergucken auftritt, dann lass es lieber so wie es war.
Die Anreden solltest du nochmal kontrollieren, die müssen doch groß - oder etwa nicht? "Euch" und "Ihr" statt "euch" und "ihr".
Und du hast auch oft Wortwiederholungen drin. 3 aufeinanderfolgende Sätze und in jedem "andere" oder sowas ähnliches.
-
estartu_de schrieb:
Uff, ich hoffe ich habe nichts Neues eingebaut. Wenn kein "Aha-Effekt" beim Drübergucken auftritt, dann lass es lieber so wie es war.
Die Anreden solltest du nochmal kontrollieren, die müssen doch groß - oder etwa nicht? "Euch" und "Ihr" statt "euch" und "ihr".
Und du hast auch oft Wortwiederholungen drin. 3 aufeinanderfolgende Sätze und in jedem "andere" oder sowas ähnliches.
1. Versuchst du dich jetzt als Rechtschreibkorrekteur? Nein, nein, ist nicht böse gemeint, aber mich hats verwundert, warum du das auf einmal gemacht hast.
2. Nach der neuen Rechtschreibung ist die Anrede in der zweiten Person IMMER kleinzuschreiben. Nur die in der dritten Person bleibt groß. Sprich "ihr", "du", aber "Sie", "Ihnen" und alles andere, was sich daraus ergibt.
3. "aufeinander folgend" - auseinander bitte!
Soll ich noch einmal drüberschauen? Wenn ja, dann mach ich das aber erst heute Abend oder morgen oder am Wochenende.
Mr. B
-
Zu 1: Lies mal die erste Seite.
Zu 2: Okay, muss ich mir mal merken.
Zu 3: Ups, mit dem auseinander oder doch zusammen habe ich wirklich Probleme.
Daher oben auch nur als Anmerkungen.evilissimo hatte mich ja gebeten, nochmal drüber zu lesen, weil ich ja so viele Fragen hatte.
Dabei las sich einiges komisch und ich hab gleich mal markiert, was mir komisch vorkam.Falls dir meine Korrekturen zu falsch vorkommen, dann sag es (ich tus dann auch nicht wieder ) und korrigier einfach den Originalpost.
-
estartu_de schrieb:
Falls dir meine Korrekturen zu falsch vorkommen, dann sag es (ich tus dann auch nicht wieder ) und korrigier einfach den Originalpost.
Also soll ich doch nich deinen korrigieren? Oder hast du da technisches umgebaut, sodass der der aktuellere wäre?
Mr. B
-
Also sie hat jetzt nicht so viel geändert das sich da was gravierend verändert hat. Ich muss nach dem Ihr beide drüber gewesen seid nur noch was wegen dem Wikipedia Zitat ändern ( bei [1] ) aber ansonsten kannst du gerne das von estartu_de korrigieren. Ich übernehme das dann so.
Danke
-
Grafische Benutzerschnittstellen in C++ mit GTKmm Betriebssystemunabhängig gestalten
1. WILLKOMMEN IN DER WELT VON GTK+
Bevor wir uns mit der betriebssystemunabhängigen GTKmm-Programmierung befassen, möchte ich erst einmal auf die Herkunft und die Entstehung von GTKmm und GTK+ eingehen. GTKmm ist eine portable Bibliothek***,*** mit der man vor allem unter Linux, MacOS und Windows portabel Programme entwerfen kann.
Hierfür müssen die Programme zwar für jedes System neu kompiliert werden, aber dies ist ohne große Änderungen und manchmal auch ganz ohne Änderungen zu bewerkstelligen.Das Woher, Warum, Wie und Was soll in diesem Tutorial geklärt werden.
Sollte es noch Fragen und Verbesserungsvorschläge geben, schreibt sie mir doch bitte an evilissimo@c-plusplus.net.
Ich werde dieses Tutorial kapitelweise veröffentlichen und verspreche keine regelmäßigen Termine. Ich werde jedoch an dem Tutorial arbeiten.1.1 Was ist ein Widget
In diesem Tutorial wir sehr häufig das Wort Widget fallen. Nun stellt sich sicher der ein oder andere die Frage: "Was ist ein "Widget" denn überhaupt?"
Als Widgets bezeichnet man meist Steuerelemente. Zu den am häufigsten genutzten Steuerelementen gehören Schaltflächen und Bildlaufleisten. Daneben gibt es eine Vielzahl mehr oder minder häufig genutzter Steuerelemente.[1]1.2 Was ist GTK+ eigentlich?
GTK steht für "Gimp Tool Kit". Das Gimp Tool Kit ist eine in C geschriebene Bibliothek für eine grafische Benutzerschnittstelle, die ursprünglich als Alternative für Motif unter Linux entwickelt wurde, um somit dem Bildbearbeitungsprogramm GIMP eine Alternative GUI (Graphical User Interface, zu Deutsch: grafische Benutzerschnittstelle) bereitzustellen.
Im Laufe der Zeit hat sich GTK+ zu einer der erfolgreichsten Widget-Bibliotheken entwickelt und ist auf X-Server basierenden Systemen neben dem QT Toolkit auch einer der meist benutzten. GTK+ ist auch die Basis der GNOME Desktop Environment***,*** die der eine oder andere von euch sicherlich kennt.GTK+ ist zwar in C implementiert, aber mit einem objektorientierten Ansatz, der die Anbindung an objektorientierte Sprachen (wie z.B. Python, Perl und C++ und andere Sprachen) stark vereinfachte, da dies von Anfang an berücksichtigt wurde.
GTKmm ist eine solche Anbindung an GTK+ für C++. Im Gegensatz zum originalen GTK+ besitzt GTKmm eine Klassenhierarchie, die die Entwicklung und Weiterentwicklung neuer Widgets stark vereinfacht. Die Typensicherheit von GTKmm erleichtert dem Programmierer die Arbeit enorm. Hierdurch werden einige Fehler im Quelltext bereits zur Kompilierzeit erkannt, was bei der C-Variante nicht der Fall ist und die Fehler somit z. B. womöglich erst durch undefiniertes Verhalten auftreten.
In GTK+ werden ausschließlich Zeiger verwendet, wovon man als C++-Programmierer Abstand nehmen und stattdessen vermehrt auf Membervariablen zurückgreifen sollte. Dies vereinfacht die Speicherverwaltung enorm.1.3 GTKmm ist ein Wrapper
GTKmm ist keine native Implementierung eines Toolkits wie es QT z. B. ist. Aber das hat auch Vorteile. So können sich die GTKmm-Entwickler mehr Gedanken darüber machen, eine saubere und transparente Schnittstelle zu schaffen, und müssen sich nicht auf Grund von technischen Details auf Kompromisse einlassen. Ein Beispiel hierfür wäre, dass man auf Grund von technischen Details, Abstriche in der Flexibilität von GTKmm machen müsste.
1.4 Bestandteile von GTKmm
GTKmm ist eigentlich nur der Teil der Bibliothek, der für die einzelnen Widgets zuständig ist, d.h. z.B. ein Fenster, Button oder aber auch ein Menü die es wiederum aber mit Hilfe von GTK+ implementiert. ~SATZ DURCHLESEN! kapier ich nicht... letzter satzbestandteil!~
GTKmm selbst verwendet aber auch andere Bibliotheken***,*** die man bei der Programmierung mit GTKmm kennen sollte.1.4.1 GTK+ Bibliotheken
Da GTKmm nur ein Wrapper einer C Bibliothek ist, baut es vor allem erst einmal auf diversen C Bibliotheken auf.
Es handelt sich hier bei um folgende C Bibliotheken:
- libglib-2.0
- libatk-1.0
- libpango-1.0
- libgtk-2.0
- libgdk-2.0
- libintl
- libiconv
und je nach Implementierung auch –libcairoGLib, Pango, ATK, GDK sind alle Bestandteile von GTK+ selbst, wurden aber unterteilt. Das macht die ganze Sache somit etwas flexibler.
GLib ist der Kern der ganzen Library und bildet die Basis von GTK+ und GNOME. Es erleichtert den Umgang mit Datenstrukturen in C, liefert portable Wrapper für verschiedene betriebssystemabhängige Funktionen und enthält Schnittstellen zur Laufzeitfunktionalität wie z.B. Ereignisschleifen, Threads, dynamisches Laden und ein Objektsystem.
Pango ist eine Layout- und Textrenderingbibliothek mit dem Schwerpunkt auf Internationalisierung. Somit bildet es den Kernteil für den Umgang mit Text- und Schriftarten in GTK+ 2.x.
ATK liefert diverse Schnittstellen für die Zugänglichkeit. Durch das Unterstützen von ATK Schnittstellen kann eine Anwendung oder ein Toolkit mit Werkzeugen wie Bildschirmlesern, Lupen oder alternativen Eingabegeräten benutzt werden.
GDK ist eine Schnittstelle zu nativen Zeichenfunktionen eines Betriebssystems und erhöht damit die Portabilität der Zeichnung von Widgets. Es gibt dafür portable Backends (diverse Bibliotheken mit einem identischen Interface***,*** die man austauschen kann***,*** nennt man in der Regel Backends). GTK+ for Win32 ist z.B. ein solches GDK-Backend für Windows.
GTK+ Implementiert die Widgets und deren Verhalten mit Hilfe der zuvor genannten Bibliotheken.
1.4.2 Bestandteile von GTKmm
GTKmm benötigt neben den eben genannten C Bibliotheken auch noch diverse andere Bibliotheken.:
- libglibmm
- libgtkmm
- libsigc++-2.0Es gibt noch andereBibliotheken, die aber bei libgtkmm schon dabei sind:
- libatkmm
- libgdkmm
- libpangommWie es bereits auffällt***,*** haben die meisten dieser Bibliotheken einfach nur ein mm als Suffix und sind einfach nur C++-Wrapper der C-Bibliotheken. Da ich in 1.4.1 bereits erwähnt habe***,*** was die einzelnen Bibliotheken tun***,*** werde ich das einfach an dieser Stelle auslassen und direkt auf SigC++ zu sprechen kommen***,*** das die einzige Bibliothek ist***,*** die nicht auf den C-Bibliotheken aufbaut.
SigC++ implementiert ein typensicheres Callback-System in Standard C++. Es erlaubt dem Programmierer, Signale zu definieren und diese mit irgendeiner Callback-Funktion zu verbinden. Dabei können nicht nur Funktionen***,*** sondern auch Methoden verwendet werden***,*** selbst wenn diese statisch oder virtuell sind. Es beinhaltet auch Adapter***,*** die es dem Programmierer ermöglichen***,*** unterschiedliche Callbacks zu verbinden. Es besteht sogar die Möglichkeit***,*** Standardparameter zu übergeben und damit eine Funktion mit mehreren Parametern an eine bestimmte Anforderung anzupassen. Mehr dazu wird es zu einem späteren Zeitpunkt geben***,*** da die Signalbehandlung in GTKmm ein größeres Kapitel brauchen wird.
2. Voraussetzung für dieses Tutorial
Ich setze für dieses Tutorial voraus, dass sich eine Entwicklerversion von GTKmm 2.4.x oder höher auf dem System befindet und dass der Leser die Grundlagen von C++ beherrscht und sich im Klaren ist, um was es sich bei Vererbung, Polymorphie und auch SmartPointern handelt. Fragen bezüglich der Programmierung mit GTKmm können im C/C++-Forum unter der Adresse http://www.c-plusplus.net/forum gestellt werden.
Bezüglich der Installation wird es evtl. ein gesonderte Anleitung geben.
2.1 Bezugsmöglichkeiten für Windows
Unter Windows gibt es dafür Installer***, die dem Programmierer*** alle notwendigen Bibliotheken auf dem System installieren.
Den Installer für alle GTK+ Bibliotheken bekommt man hier:
http://gladewin32.sourceforge.net/
Nach der Installation der GTK+ Bibliotheken braucht man noch die GTKmm Bibliotheken die man auf:
http://www.pcpm.ucl.ac.be/~gustin/win32_ports/
bekommt. Klickt dort im Menü auf „gtkmm on win32“ und auf den Link unter
"Developer (Full) Environment"
(runtime + headers, import libraries, demo, doc).Solltet ihr vorhaben***,*** mit der DevC++ IDE zu programmieren, empfehle ich euch nach der Installtion der beiden Pakete meinen GTKmm-Template-Installer für DevC++ zu verwenden, der euch eine Vorlage in DevC++ installiert***,*** die bereits sämtliche benötigten Includeverzeichnisse und Bibliotheken in das Projekt einbindet.
Ihr findet den Installer auf http://www.evilissimo-softdev.de/downloads.html.2.2 Bezugsmöglichkeiten für Linux
Bei Linux hängt es von eurer Distribution ab und ihr solltet euch diesbezüglich noch einmal extra informieren. Fragen zu diesem Thema sind natürlich im GUI Forum des C/C++ Boards willkommen. (http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html)
Da dies ein Tutorial zur Programmierung mit GTKmm werden soll, werden wir an dieser Stelle mit den Nebensächlichkeiten aufhören und mit der Einführung in die Programmierung beginnen.
3. Grundlagen
3.1 Ein einfaches Beispiel
Das erste GTKmm Programm, das ich euch zeigen möchte, ist ein einfaches Fenster von 200 x 200 Pixel.
Hiermit möchte ich verdeutlichen, wie einfach es sein kann, eine GTKmm Anwendung zu schreiben.#include <gtkmm.h> int main(int argc, char *argv[]) { Gtk::Main main_obj(argc, argv); Gtk::Window window_obj; main_obj.run(window_obj); return 0; }
Nun es ist nicht viel Code, aber es erzeugt schon ein Fenster. Nun werde ich detailierter auf die einzelnen Zeilen eingehen und ein paar Bemerkungen dazu machen.
#include <gtkmm.h>
Wir binden mit dieser Zeile alle Headerdateien ein, die zu GTKmm gehören; dies gilt dann auch für GDKmm, Glibmm, Pangomm und SigC++. Der Nachteil dieser Zeile ist, dass sie bei größeren Projekten zu längeren Kompilierzeiten führt, da erst einmal alle Header analysiert werden müssen. Daher ist es empfehlenswert, aber nicht zwingend notwendig, nur die benötigten Header einzubinden. In unserem Fall wären das die folgenden:
#include <gtkmm/main.h> #include <gtkmm/window.h>
In der Dokumentation auf http://www.gtkmm.org/docs/gtkmm-2.4/docs/ findet ihr heraus in welchen Headern sich die verwendeteten Klassen befinden.
int main(int argc, char *argv[])
Der normale Programmeinstiegspunkt***,*** der aus C++***,*** aber auch aus C Programmen bekannt sein sollte.
Gtk::Main main_obj(argc, argv);
Mit dieser Zeile starten wir das GTK+- und GTKmm-Subsystem und stellen durch Übergeben der Parameter argc und argv sicher, dass auch unsere Anwendung wie alle GTK+ Anwendungen bestimmte Standardparameter annimmt und auswertet. Damit passen wir unser Programm nur an das Verhalten anderer GTK+ Programme an. Mehr müssen wir darüber nicht wissen, es sei denn***,*** wir möchten selber Parameter übergeben - dann solltet ihr eure Auswertung der Parameter erst nach GTKmm durchführen***,*** da GTKmm sie zur Initialisierung benötigt!
Merke: Immer erst das GTKmm Subsystem starten.
Die restlichen zwei Zeilen sind nicht sonderlich spektakulär, aber ich werde trotzdem kurz erklären, was diese tun.
Gtk::Window window_obj;
Erstellt ein Fensterobjekt, das wir mir der Zeile:
main_obj.run(window_obj);
starten.
Nachdem wir den Sourcecode in eine Sourcedatei gepackt haben - ich nenne sie hier mal einfach "beispiel1.cpp" - werden wir die Anwendung kompilieren.
Je nach OS wird anders kompiliert. Die Windows-User mit DevC++ drücken vielleicht einfach nur F9. Unix/Linux/*BSD/Whatever-User schreiben dann eher
g++ beispiel1.cpp `pkg-config gtkmm-2.4 --cflags --libs` -o beispiel1
Da dies sehr unterschiedlich ist, möchte ich an dieser Stelle nicht tiefer darauf eingehen. Diese Fragen werden gerne im GUI-Forum auf dem C/C++ Board (http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html) beantwortet und erhalten dann sicherlich auch Einzug in die FAQ.
Und so sieht das dann z.B. unter Window XP aus:
Soviel zum ersten Teil des Tutorials. Ich freue mich schon auf euer Feedback. Im nächsten Teil werde ich euch die ersten Widgets näher bringen. Darunter fallen Label, Buttons und das GTK Boxen System. Auch eine kleine Einführung in die Verwendung von Signalen. Mehr dazu im nächsten Teil.
evilissimo
Verweise und Referenzen:
[1] Widget (GUI) Beschreibung von Wikipedia
[2] Homepage von GTK+
[3] Homepage von GTKmm
[4] GTKmm Dokumentation
[5] GTKmm Template installer für DevC++ von evilissimo
[6] gladewin32 Installer ( GTK+ Entwicklungsbibliotheken für GTK+ )
[7] GTKmm Installer für Windows ( Entwicklungsbibliotheken für GTKmm)
-
Wird es was mit Morgen Abend? So 19:00 bis 20:00 hatte ich mir überlegt.
Dein Profil fehlt ja auch noch.
-
Grafische Benutzerschnittstellen in C++ mit GTKmm Betriebssystemunabhängig gestalten
1. WILLKOMMEN IN DER WELT VON GTK+
Bevor wir uns mit der betriebssystemunabhängigen GTKmm-Programmierung befassen, möchte ich erst einmal auf die Herkunft und die Entstehung von GTKmm und GTK+ eingehen. GTKmm ist eine portable Bibliothek, mit der man vor allem unter Linux, MacOS und Windows portabel Programme entwerfen kann.
Hierfür müssen die Programme zwar für jedes System neu kompiliert werden, aber dies ist ohne große Änderungen und manchmal auch ganz ohne Änderungen zu bewerkstelligen.Das Woher, Warum, Wie und Was soll in diesem Tutorial geklärt werden.
Sollte es noch Fragen und Verbesserungsvorschläge geben, schreibt sie mir doch bitte an evilissimo@c-plusplus.net.
Ich werde dieses Tutorial kapitelweise veröffentlichen und verspreche keine regelmäßigen Termine. Ich werde jedoch an dem Tutorial arbeiten.1.1 Was ist ein Widget
In diesem Tutorial wir sehr häufig das Wort Widget fallen. Nun stellt sich sicher der ein oder andere die Frage: "Was ist ein "Widget" denn überhaupt?"
Als Widgets bezeichnet man meist Steuerelemente. Zu den am häufigsten genutzten Steuerelementen gehören Schaltflächen und Bildlaufleisten. Daneben gibt es eine Vielzahl mehr oder minder häufig genutzter Steuerelemente.[1]1.2 Was ist GTK+ eigentlich?
GTK steht für "Gimp Tool Kit". Das Gimp Tool Kit ist eine in C geschriebene Bibliothek für eine grafische Benutzerschnittstelle, die ursprünglich als Alternative für Motif unter Linux entwickelt wurde, um somit dem Bildbearbeitungsprogramm GIMP eine Alternative GUI (Graphical User Interface, zu Deutsch: grafische Benutzerschnittstelle) bereitzustellen.
Im Laufe der Zeit hat sich GTK+ zu einer der erfolgreichsten Widget-Bibliotheken entwickelt und ist auf X-Server basierenden Systemen neben dem QT Toolkit auch einer der meist benutzten. GTK+ ist auch die Basis der GNOME Desktop Environment, die der eine oder andere von euch sicherlich kennt.GTK+ ist zwar in C implementiert, aber mit einem objektorientierten Ansatz, der die Anbindung an objektorientierte Sprachen (wie z.B. Python, Perl und C++ und andere Sprachen) stark vereinfachte, da dies von Anfang an berücksichtigt wurde.
GTKmm ist eine solche Anbindung an GTK+ für C++. Im Gegensatz zum originalen GTK+ besitzt GTKmm eine Klassenhierarchie, die die Entwicklung und Weiterentwicklung neuer Widgets stark vereinfacht. Die Typensicherheit von GTKmm erleichtert dem Programmierer die Arbeit enorm. Hierdurch werden einige Fehler im Quelltext bereits zur Kompilierzeit erkannt, was bei der C-Variante nicht der Fall ist und die Fehler somit z. B. womöglich erst durch undefiniertes Verhalten auftreten.
In GTK+ werden ausschließlich Zeiger verwendet, wovon man als C++-Programmierer Abstand nehmen und stattdessen vermehrt auf Membervariablen zurückgreifen sollte. Dies vereinfacht die Speicherverwaltung enorm.1.3 GTKmm ist ein Wrapper
GTKmm ist keine native Implementierung eines Toolkits wie es QT z. B. ist. Aber das hat auch Vorteile. So können sich die GTKmm-Entwickler mehr Gedanken darüber machen, eine saubere und transparente Schnittstelle zu schaffen, und müssen sich nicht auf Grund von technischen Details auf Kompromisse einlassen. Ein Beispiel hierfür wäre, dass man auf Grund von technischen Details, Abstriche in der Flexibilität von GTKmm machen müsste.
1.4 Bestandteile von GTKmm
Da GTKmm die GTK+ C Bibliotheken verwendet sind diese ein wichtiger Bestandteil von GTKmm. GTKmm kapselt die C Bibliothek so gut, dass es die Verwendung gegenüber GTK+ sogar noch etwas vereinfacht. Hier eine Auflistung und kurze Erklärung der einzelnen Bestandteile:1.4.1 GTK+ Bibliotheken
Da GTKmm nur ein Wrapper einer C Bibliothek ist, baut es vor allem erst einmal auf diversen C Bibliotheken auf.
Es handelt sich hier bei um folgende C Bibliotheken:
- libglib-2.0
- libatk-1.0
- libpango-1.0
- libgtk-2.0
- libgdk-2.0
- libintl
- libiconv
und je nach Implementierung auch –libcairoGLib, Pango, ATK, GDK sind alle Bestandteile von GTK+ selbst, wurden aber unterteilt. Das macht die ganze Sache somit etwas flexibler.
GLib ist der Kern der ganzen Library und bildet die Basis von GTK+ und GNOME. Es erleichtert den Umgang mit Datenstrukturen in C, liefert portable Wrapper für verschiedene betriebssystemabhängige Funktionen und enthält Schnittstellen zur Laufzeitfunktionalität wie z.B. Ereignisschleifen, Threads, dynamisches Laden und ein Objektsystem.
Pango ist eine Layout- und Textrenderingbibliothek mit dem Schwerpunkt auf Internationalisierung. Somit bildet es den Kernteil für den Umgang mit Text- und Schriftarten in GTK+ 2.x.
ATK liefert diverse Schnittstellen für die Zugänglichkeit. Durch das Unterstützen von ATK Schnittstellen kann eine Anwendung oder ein Toolkit mit Werkzeugen wie Bildschirmlesern, Lupen oder alternativen Eingabegeräten benutzt werden.
GDK ist eine Schnittstelle zu nativen Zeichenfunktionen eines Betriebssystems und erhöht damit die Portabilität der Zeichnung von Widgets. Es gibt dafür portable Backends (diverse Bibliotheken mit einem identischen Interface, die man austauschen kann, nennt man in der Regel Backends). GTK+ for Win32 ist z.B. ein solches GDK-Backend für Windows.
GTK+ Implementiert die Widgets und deren Verhalten mit Hilfe der zuvor genannten Bibliotheken.
1.4.2 Bestandteile von GTKmm
GTKmm benötigt neben den eben genannten C Bibliotheken auch noch diverse andere Bibliotheken.:
- libglibmm
- libgtkmm
- libsigc++-2.0Es gibt noch andereBibliotheken, die aber bei libgtkmm schon dabei sind:
- libatkmm
- libgdkmm
- libpangommWie es bereits auffällt, haben die meisten dieser Bibliotheken einfach nur ein mm als Suffix und sind einfach nur C++-Wrapper der C-Bibliotheken. Da ich in 1.4.1 bereits erwähnt habe, was die einzelnen Bibliotheken tun, werde ich das einfach an dieser Stelle auslassen und direkt auf SigC++ zu sprechen kommen, das die einzige Bibliothek ist, die nicht auf den C-Bibliotheken aufbaut.
SigC++ implementiert ein typensicheres Callback-System in Standard C++. Es erlaubt dem Programmierer, Signale zu definieren und diese mit irgendeiner Callback-Funktion zu verbinden. Dabei können nicht nur Funktionen, sondern auch Methoden verwendet werden, selbst wenn diese statisch oder virtuell sind. Es beinhaltet auch Adapter, die es dem Programmierer ermöglichen, unterschiedliche Callbacks zu verbinden. Es besteht sogar die Möglichkeit, Standardparameter zu übergeben und damit eine Funktion mit mehreren Parametern an eine bestimmte Anforderung anzupassen. Mehr dazu wird es zu einem späteren Zeitpunkt geben, da die Signalbehandlung in GTKmm ein größeres Kapitel brauchen wird.
2. Voraussetzung für dieses Tutorial
Ich setze für dieses Tutorial voraus, dass sich eine Entwicklerversion von GTKmm 2.4.x oder höher auf dem System befindet und dass der Leser die Grundlagen von C++ beherrscht und sich im Klaren ist, um was es sich bei Vererbung, Polymorphie und auch SmartPointern handelt. Fragen bezüglich der Programmierung mit GTKmm können im C/C++-Forum unter der Adresse http://www.c-plusplus.net/forum gestellt werden.
Bezüglich der Installation wird es evtl. ein gesonderte Anleitung geben.
2.1 Bezugsmöglichkeiten für Windows
Unter Windows gibt es dafür Installer, die dem Programmierer alle notwendigen Bibliotheken auf dem System installieren.
Den Installer für alle GTK+ Bibliotheken bekommt man hier:
http://gladewin32.sourceforge.net/
Nach der Installation der GTK+ Bibliotheken braucht man noch die GTKmm Bibliotheken die man auf:
http://www.pcpm.ucl.ac.be/~gustin/win32_ports/
bekommt. Klickt dort im Menü auf „gtkmm on win32“ und auf den Link unter
"Developer (Full) Environment"
(runtime + headers, import libraries, demo, doc).Solltet ihr vorhaben, mit der DevC++ IDE zu programmieren, empfehle ich euch nach der Installtion der beiden Pakete meinen GTKmm-Template-Installer für DevC++ zu verwenden, der euch eine Vorlage in DevC++ installiert, die bereits sämtliche benötigten Includeverzeichnisse und Bibliotheken in das Projekt einbindet.
Ihr findet den Installer auf http://www.evilissimo-softdev.de/downloads.html.2.2 Bezugsmöglichkeiten für Linux
Bei Linux hängt es von eurer Distribution ab und ihr solltet euch diesbezüglich noch einmal extra informieren. Fragen zu diesem Thema sind natürlich im GUI Forum des C/C++ Boards willkommen. (http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html)
Da dies ein Tutorial zur Programmierung mit GTKmm werden soll, werden wir an dieser Stelle mit den Nebensächlichkeiten aufhören und mit der Einführung in die Programmierung beginnen.
3. Grundlagen
3.1 Ein einfaches Beispiel
Das erste GTKmm Programm, das ich euch zeigen möchte, ist ein einfaches Fenster von 200 x 200 Pixel.
Hiermit möchte ich verdeutlichen, wie einfach es sein kann, eine GTKmm Anwendung zu schreiben.#include <gtkmm.h> int main(int argc, char *argv[]) { Gtk::Main main_obj(argc, argv); Gtk::Window window_obj; main_obj.run(window_obj); return 0; }
Nun es ist nicht viel Code, aber es erzeugt schon ein Fenster. Nun werde ich detailierter auf die einzelnen Zeilen eingehen und ein paar Bemerkungen dazu machen.
#include <gtkmm.h>
Wir binden mit dieser Zeile alle Headerdateien ein, die zu GTKmm gehören; dies gilt dann auch für GDKmm, Glibmm, Pangomm und SigC++. Der Nachteil dieser Zeile ist, dass sie bei größeren Projekten zu längeren Kompilierzeiten führt, da erst einmal alle Header analysiert werden müssen. Daher ist es empfehlenswert, aber nicht zwingend notwendig, nur die benötigten Header einzubinden. In unserem Fall wären das die folgenden:
#include <gtkmm/main.h> #include <gtkmm/window.h>
In der Dokumentation auf http://www.gtkmm.org/docs/gtkmm-2.4/docs/ findet ihr heraus in welchen Headern sich die verwendeteten Klassen befinden.
int main(int argc, char *argv[])
Der normale Programmeinstiegspunkt, der aus C++, aber auch aus C Programmen bekannt sein sollte.
Gtk::Main main_obj(argc, argv);
Mit dieser Zeile starten wir das GTK+- und GTKmm-Subsystem und stellen durch Übergeben der Parameter argc und argv sicher, dass auch unsere Anwendung wie alle GTK+ Anwendungen bestimmte Standardparameter annimmt und auswertet. Damit passen wir unser Programm nur an das Verhalten anderer GTK+ Programme an. Mehr müssen wir darüber nicht wissen, es sei denn, wir möchten selber Parameter übergeben - dann solltet ihr eure Auswertung der Parameter erst nach GTKmm durchführen, da GTKmm sie zur Initialisierung benötigt!
Merke: Immer erst das GTKmm Subsystem starten.
Die restlichen zwei Zeilen sind nicht sonderlich spektakulär, aber ich werde trotzdem kurz erklären, was diese tun.
Gtk::Window window_obj;
Erstellt ein Fensterobjekt, das wir mir der Zeile:
main_obj.run(window_obj);
starten.
Nachdem wir den Sourcecode in eine Sourcedatei gepackt haben - ich nenne sie hier mal einfach "beispiel1.cpp" - werden wir die Anwendung kompilieren.
Je nach OS wird anders kompiliert. Die Windows-User mit DevC++ drücken vielleicht einfach nur F9. Unix/Linux/*BSD/Whatever-User schreiben dann eher
g++ beispiel1.cpp `pkg-config gtkmm-2.4 --cflags --libs` -o beispiel1
Da dies sehr unterschiedlich ist, möchte ich an dieser Stelle nicht tiefer darauf eingehen. Diese Fragen werden gerne im GUI-Forum auf dem C/C++ Board (http://www.c-plusplus.net/forum/viewforum-var-f-is-51.html) beantwortet und erhalten dann sicherlich auch Einzug in die FAQ.
Und so sieht das dann z.B. unter Window XP aus:
Soviel zum ersten Teil des Tutorials. Ich freue mich schon auf euer Feedback. Im nächsten Teil werde ich euch die ersten Widgets näher bringen. Darunter fallen Label, Buttons und das GTK Boxen System. Auch eine kleine Einführung in die Verwendung von Signalen. Mehr dazu im nächsten Teil.
evilissimo
Verweise und Referenzen:
[1] Widget (GUI) Beschreibung von Wikipedia
[2] Homepage von GTK+
[3] Homepage von GTKmm
[4] GTKmm Dokumentation
[5] GTKmm Template installer für DevC++ von evilissimo
[6] gladewin32 Installer ( GTK+ Entwicklungsbibliotheken für GTK+ )
[7] GTKmm Installer für Windows ( Entwicklungsbibliotheken für GTKmm)