Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
gui:gtk:menus [2010/03/04 15:13] hofian |
gui:gtk:menus [2022/09/22 19:58] (aktuell) |
||
|---|---|---|---|
| Zeile 5: | Zeile 5: | ||
| ===== Menüs ===== | ===== Menüs ===== | ||
| + | {{ :gui:gtk:menubar.jpeg|Menübar }} | ||
| Das Zentrum eines GTK-Menüs ((besser: "Menüleiste")) bildet die ''GtkMenuBar''. In die ''GtkMenuBar'' packt man dann ''GtkMenuItem''s. Um ein aufklappendes Menü zu erzeugen benutzt man ein ''GtkMenu''. Dieses verbindet man mit einem ''GtkMenuItem'' in der ''GtkMenuBar''. In das ''GtkMenu'' kann man dann wieder ''GtkMenuItem''s packen. | Das Zentrum eines GTK-Menüs ((besser: "Menüleiste")) bildet die ''GtkMenuBar''. In die ''GtkMenuBar'' packt man dann ''GtkMenuItem''s. Um ein aufklappendes Menü zu erzeugen benutzt man ein ''GtkMenu''. Dieses verbindet man mit einem ''GtkMenuItem'' in der ''GtkMenuBar''. In das ''GtkMenu'' kann man dann wieder ''GtkMenuItem''s packen. | ||
| - | {{ :gui:gtk:menubar.jpeg|Menübar }} \\ \\ | + | |
| - | Kommen wir zur Umsetzung: Als Basis benutzt bitte das leere Fenster aus dem Kapitel [[:gui:gtk:firststeps|Erste Schritte mit GTK+]] und erweitert es mit einer vertikalen Box.\\ \\ Um eine Menüleiste mit einem Menu ("Datei") und einem Eintrag ("Beenden") zu erstellen, benötigen wir zudem 4 weitere ''GtkWidgets'':\\ | + | |
| + | Kommen wir zur Umsetzung: Als Basis benutzt bitte das leere Fenster aus dem Kapitel [[:gui:gtk:firststeps|Erste Schritte mit GTK+]] und erweitert es mit einer vertikalen Box. | ||
| + | |||
| + | Um eine Menüleiste mit einem Menu ("Datei") und einem Eintrag ("Beenden") zu erstellen, benötigen wir zudem 4 weitere ''GtkWidgets'': | ||
| + | |||
| <code cpp> | <code cpp> | ||
| GtkWidget *menubar, /*die Menüleiste an sich: wird später in die vertikale Box gepackt*/ | GtkWidget *menubar, /*die Menüleiste an sich: wird später in die vertikale Box gepackt*/ | ||
| Zeile 23: | Zeile 29: | ||
| Nun kommen die ''GtkMenuItem''s an die Reihe. Allerdings sollte man hier zwischen verschiedenen Typen unterscheiden: | Nun kommen die ''GtkMenuItem''s an die Reihe. Allerdings sollte man hier zwischen verschiedenen Typen unterscheiden: | ||
| ^Typ^Beschreibung^Funktion zum Erstellen^ | ^Typ^Beschreibung^Funktion zum Erstellen^ | ||
| - | |__GtkMenuItem__|Ein einfaches Item, nur mit Text|<code cpp>gtk_menu_item_new_with_label(const gchar * text) | + | |__GtkMenuItem__|Ein einfaches Item, nur mit Text|<code cpp>gtk_menu_item_new_with_label(const gchar *text) |
| - | gtk_menu_item_new_with_mnemonic(const gchar * text)</code>| | + | gtk_menu_item_new_with_mnemonic(const gchar *text)</code>| |
| |__GtkImageMenuItem__|Ein Item mit einem kleinen Icon, welches über eine GTK_STOCK_ID gesetzt werden kann ((es kann auch über ein externes Bild gesetzt werden))|<code cpp>gtk_image_menu_item_new(void) | |__GtkImageMenuItem__|Ein Item mit einem kleinen Icon, welches über eine GTK_STOCK_ID gesetzt werden kann ((es kann auch über ein externes Bild gesetzt werden))|<code cpp>gtk_image_menu_item_new(void) | ||
| - | gtk_image_menu_item_new_from_stock(const gchar* STOCK, GtkAccelGroup *ag)</code>| | + | gtk_image_menu_item_new_from_stock(const gchar *stock, GtkAccelGroup *ag)</code>| |
| |__GtkSeparatorMenuItem__|Ein einfacher Trennstrich, um bestimmte Bereiche zu gruppieren.|<code cpp>gtk_separator_menu_item_new()</code>| | |__GtkSeparatorMenuItem__|Ein einfacher Trennstrich, um bestimmte Bereiche zu gruppieren.|<code cpp>gtk_separator_menu_item_new()</code>| | ||
| - | |__GtkCheckMenuItem__|Ein Item mit einem abhakbaren Kästchen (Check Box)|<code cpp>gtk_check_menu_item_new_with_label(const gchar * text) | + | |__GtkCheckMenuItem__|Ein Item mit einem abhakbaren Kästchen (Check Box)|<code cpp>gtk_check_menu_item_new_with_label(const gchar *text) |
| - | gtk_check_menu_item_new_with_mnemonic(const gchar * text)</code>| | + | gtk_check_menu_item_new_with_mnemonic(const gchar *text)</code>| |
| |__GtkTearoffMenuItem__|Ein Item zum Ablösen des GtkMenus von der Menüleiste, dargestellt als durchzogene, gepunktete Linie.|<code cpp>gtk_tearoff_menu_item_new()</code>| | |__GtkTearoffMenuItem__|Ein Item zum Ablösen des GtkMenus von der Menüleiste, dargestellt als durchzogene, gepunktete Linie.|<code cpp>gtk_tearoff_menu_item_new()</code>| | ||
| Zeile 39: | Zeile 45: | ||
| ==== Gtk Stocks ==== | ==== Gtk Stocks ==== | ||
| - | Auch müssten euch bei der obigen Tabelle Funktionen aufgefallen sein, die auf ''*_from_stock'' enden. Diese erwarten dann die Angabe einer "STOCK_ID". Zunächst einmal: //Was sind Gtk Stocks?// \\ | + | Auch müssten euch bei der obigen Tabelle Funktionen aufgefallen sein, die auf ''*_from_stock'' enden. Diese erwarten dann die Angabe einer "STOCK_ID". Zunächst einmal: //Was sind Gtk Stocks?// |
| - | Oft sieht man in GTK und [[http://www.gnome.org|GNOME]]-Anwendungen (Image-)Menü-Items mit Icons, die immer gleich sind. Oft werden diese über GTK-STOCKS ((stock: englisch: Vorrat, Lager)) realisiert. Praktisch sind die Gtk Stocks eine ganze Reihe von [[c:pre:define|Defines]], die immer mit ''GTK_STOCK_*'' beginnen.\\ \\ Bei Menü-Items benutzt für die Verwendung von Stocks das GtkImageMenuItem. Um dann ein Beenden-Item, wie ganz oben auf dem Bild zu sehen zu erzeugen, genügt folgender Aufruf: | + | |
| + | |||
| + | Oft sieht man in GTK und [[http://www.gnome.org|GNOME]]-Anwendungen (Image-)Menü-Items mit Icons, die immer gleich sind. Oft werden diese über GTK-STOCKS ((stock: englisch: Vorrat, Lager)) realisiert. Praktisch sind die GtkStocks eine ganze Reihe von [[c:pre:define|Defines]], die immer mit ''GTK_STOCK_*'' beginnen. | ||
| + | |||
| + | |||
| + | Bei Menü-Items benutzt für die Verwendung von Stocks das GtkImageMenuItem. Um dann ein Beenden-Item, wie ganz oben auf dem Bild zu sehen zu erzeugen, genügt folgender Aufruf: | ||
| <code cpp>quititem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);</code> | <code cpp>quititem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);</code> | ||
| - | Eine vollständige Liste von Gtk Stocks (auch mit schönen Bildchen =)) findet ihr in der [[http://library.gnome.org/devel/gtk/2.18/gtk-Stock-Items.html|GTK-Referenz]]. | + | Eine vollständige Liste von Gtk Stocks (auch mit schönen Bildchen =)) findet ihr in der [[http://library.gnome.org/devel/gtk/stable/gtk-Stock-Items.html|GTK-Referenz]]. |
| ==== Zusammenpacken... ==== | ==== Zusammenpacken... ==== | ||
| - | Nun haben wir grundlegendsten Bestandteile einer Menüleiste erstellt, doch haben wir noch lange nicht eine fertige Menüleiste!\\ | + | Nun haben wir grundlegendsten Bestandteile einer Menüleiste erstellt, doch haben wir noch lange nicht eine fertige Menüleiste! |
| - | Zunächst sei noch einmal ein Blick auf das oben gezeigte Diagramm empfohlen, um zu verstehen, was wir in was packen müssen.\\ | + | |
| - | Als erstes Setzen wir unser Beenden-Item (das mit dem Gtk Stock) in unser GtkMenu, welches später über "__D__atei" erreichbar sein soll. Folgender Zeile reicht da vollkommen aus: | + | |
| + | Zunächst sei noch einmal ein Blick auf das oben gezeigte Diagramm empfohlen, um zu verstehen, was wir in was packen müssen. | ||
| + | |||
| + | |||
| + | Als erstes Setzen wir unser Beenden-Item (das mit dem Gtk Stock) in unser GtkMenu, welches später über "__D__atei" erreichbar sein soll. Folgende Zeile reicht da vollkommen aus: | ||
| <code cpp>gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quititem); </code> | <code cpp>gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quititem); </code> | ||
| + | |||
| + | |||
| Als nächstes Packen wir unser "__D__atei" Item (fileitem) in unsere GtkMenuBar: | Als nächstes Packen wir unser "__D__atei" Item (fileitem) in unsere GtkMenuBar: | ||
| <code cpp>gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileitem); </code> | <code cpp>gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileitem); </code> | ||
| + | |||
| + | |||
| Zum Schluss müssen wir nur noch festlegen, dass beim Klicken des ''__D__atei'' Items auf das ''Datei''-Menü (mit unserem Beenden-Item) erscheint: | Zum Schluss müssen wir nur noch festlegen, dass beim Klicken des ''__D__atei'' Items auf das ''Datei''-Menü (mit unserem Beenden-Item) erscheint: | ||
| <code cpp>gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileitem), filemenu); </code> | <code cpp>gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileitem), filemenu); </code> | ||
| + | |||
| + | |||
| Um das alles auch im Fenster sehen zu können, müsst ihr natürlich noch die GtkMenuBar ''menubar'' in die vertikale Box packen. | Um das alles auch im Fenster sehen zu können, müsst ihr natürlich noch die GtkMenuBar ''menubar'' in die vertikale Box packen. | ||
| Zeile 59: | Zeile 80: | ||
| Noch ein kurzer Blick auf die Verwendung von Signalen bei Menü-Items. Um unser kleines Programm bei Klick auf das Beenden Symbol wirklich zu beenden, müssen wir es natürlich verknüpfen, und zwar mit ''gtk_main_quit''((Dieses beendet den GtkMainLoop, der Programmablauf geht dann nach dem Aufruf von gtk_main() weiter.)): | Noch ein kurzer Blick auf die Verwendung von Signalen bei Menü-Items. Um unser kleines Programm bei Klick auf das Beenden Symbol wirklich zu beenden, müssen wir es natürlich verknüpfen, und zwar mit ''gtk_main_quit''((Dieses beendet den GtkMainLoop, der Programmablauf geht dann nach dem Aufruf von gtk_main() weiter.)): | ||
| - | <code cpp>g_signal_connect(G_OBJECT(quititem), "activate", G_CALLBACK(gtk_main_quit),NULL);</code> | + | <code cpp>g_signal_connect(quititem, "activate", G_CALLBACK(gtk_main_quit), NULL);</code> |
| - | Wie unschwer zu erkennen ist, benutzt das "activate" Signal. | + | Wie unschwer zu erkennen ist, benutzt jedes ''GtkMenuItem'' das "activate" Signal. |
| - | ===== ===== | + | ===== Last but not least... ===== |
| Für die Faulen unter euch, hier noch einmal der vollständige Code (bis jetzt, wir wollen diesen noch um eine Werkzeugleiste erweitern): | Für die Faulen unter euch, hier noch einmal der vollständige Code (bis jetzt, wir wollen diesen noch um eine Werkzeugleiste erweitern): | ||
| <code cpp> | <code cpp> | ||
| #include <gtk/gtk.h> | #include <gtk/gtk.h> | ||
| - | int main(int argc, char** argv) | + | int main(int argc, char *argv[]) |
| { | { | ||
| GtkWidget *window; | GtkWidget *window; | ||
| GtkWidget *vbox; | GtkWidget *vbox; | ||
| - | GtkWidget *menubar, /*die Menüleiste an sich: wird später in die vertikale Box gepackt*/ | + | GtkWidget *menubar, /* die Menüleiste an sich: wird später in die vertikale Box gepackt */ |
| - | *filemenu, /*das "Datei"-Menü, in das wir das Beenden-Item stecken.*/ | + | *filemenu, /* das "Datei"-Menü, in das wir das Beenden-Item stecken. */ |
| - | *fileitem, /*das "Datei"-Item: kommt in die Menüleiste und wird mit "filemenu" verknüpft*/ | + | *fileitem, /* das "Datei"-Item: kommt in die Menüleiste und wird mit "filemenu" verknüpft */ |
| - | *quititem; /*das "Beenden"-Item*/ | + | *quititem; /* das "Beenden"-Item */ |
| gtk_init(&argc, &argv); | gtk_init(&argc, &argv); | ||
| Zeile 83: | Zeile 104: | ||
| gtk_container_add(GTK_CONTAINER(window), vbox); | gtk_container_add(GTK_CONTAINER(window), vbox); | ||
| | | ||
| - | /*Erstellen der Menüleiste und der anderen Menü Bestandteile*/ | + | /* Erstellen der Menüleiste und der anderen Menü Bestandteile */ |
| menubar = gtk_menu_bar_new(); | menubar = gtk_menu_bar_new(); | ||
| filemenu = gtk_menu_new(); | filemenu = gtk_menu_new(); | ||
| Zeile 89: | Zeile 110: | ||
| quititem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); | quititem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); | ||
| - | /*Packen*/ | + | /* Packen */ |
| gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quititem); | gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quititem); | ||
| gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileitem); | gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileitem); | ||
| Zeile 96: | Zeile 117: | ||
| gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); | gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); | ||
| - | /*ein neues Signal*/ | + | /* Ein neues Signal */ |
| - | g_signal_connect(G_OBJECT(quititem), "activate", G_CALLBACK(gtk_main_quit), NULL); | + | g_signal_connect(quititem, "activate", G_CALLBACK(gtk_main_quit), NULL); |
| - | g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); | + | g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); |
| gtk_widget_show_all(window); | gtk_widget_show_all(window); | ||
| Zeile 105: | Zeile 126: | ||
| return 0; | return 0; | ||
| }</code> | }</code> | ||
| - | \\ | ||
| - | ====== ====== | + | |
| + | |||
| + | |||
| + | ===== ===== | ||
| In der nächsten Lektion werdet ihr dann die Werkzeugleisten kennen lernen. Dafür werden wir den obenstehenden Quelltext erweitern. | In der nächsten Lektion werdet ihr dann die Werkzeugleisten kennen lernen. Dafür werden wir den obenstehenden Quelltext erweitern. | ||
| - | \\ \\ | ||
| - | Zurück zu [[gui:gtk:dialogs|Dialogen]]||hoch zur [[gui:gtk:start|GTK-Startseite]]||weiter zu [[gui:gtk:toolbars|Werkzeugleisten]] | ||
| - | ---- | ||
| + | |||
| + | |||
| + | |||
| + | <html><center></html> **[[ gui:gtk:dialogs |zurück]] || [[gui:gtk:start|hoch zur Startseite]] || [[ gui:gtk:toolbars |weiter]]**<html></center></html> | ||
| + | ---- | ||
| + | [[http://forum.proggen.org/viewtopic.php?f=39&t=847|Diskussion]] | ||