GTKmm Tutorial Teil 6



  • Grafische Benutzerschnittstellen in C++ mit GTKmm Betriebssystemunabhängig gestalten Teil 6

    Übersicht

    1. Einleitung

    2. Und Action...

    3. Tastenkombinationen

    4. Ui der Manager

    5. Menüleisten definieren

    6. Toolbars erstellen

    7. Popupmenüs beschreiben

    1 Einleitung

    Nach dem letzten Tutorial das GPC freundlicherweise übernommen hat wird sich dieser Artikel den Menüs widmen, welcher ein wichtiger Bestandteil der meisten Benutzerschnittstellen in heutigen Anwendungen oder aber auch Spielen ist.

    GTKmm macht das erstellen von Menüs sehr komfortabel. Es gibt zwei wichtige Klassen für alle Menüs, egal ob Toolbar, Menüleiste oder Popupmenü.
    Zunächst wäre hier die Gtk::ActionGroup Klasse welche sich um die Verwaltung von Aktionen bei Menüs kümmert und dann wäre da noch die Klasse Gtk::UIManager welche sich um die Verwaltung der Erstellung von Menüs kümmert und die Verbindung mit den Aktionen kümmert.

    2 Und Action...

    Oft ist es so das Aktionen in Menüs mehrmals in den verschiedenen Menüs zu finden sind. Einmal ist es ein Toolbar Button das andere mal ein Menüeintrag, oder ein Popupmenü-Eintrag im Kontextmenü des Tray-Icons.

    GTKmm macht die Verwaltung von Aktionen sehr angenehm und bietet eine komfortable Schnittstelle zur Verwaltung an. Gtk::ActionGroup. Diese kümmert sich nicht nur darum Aktionen mit einem bestimmten Eintrag zu verbinden sondern auch den zugehörigen Text.

    Gtk::ActionGroup verwaltet Gtk::Action Objekte welche erstellt und an das erstellte ActionGroup Objekt übergeben werden.

    Man sollte sich nicht von dem Fakt verwirren lassen das man auch alle Menübeschriftungen als Aktionen definiert auch wenn es zunächst nicht offesichtlich sein mag, hierunter fallen auch Icons, Tooltips, Labels, StockItems und Tastenkombinationen.

    Jede Aktion besitzt auch einen eindeutigen Bezeichner mit welchem man später bei der Definition der Menüstrukturen auf eine Aktion verweisen kann.
    Daher sollte man von vornherein gute Namen wählen um später keine bösen Überraschungen zu erleben.

    Wenn man eine Instanz der Gtk::ActionGroup erstellen möchte ruft man die statische Methode Gtk::ActionGroup::create auf welche eine Instanz auf ein ActionGroup object verwaltet von einem Glib::RefPtr zurück gibt.

    Glib::RefPtr<Gtk::ActionGroup> action_group = Gtk::ActionGroup::create();
    

    Nach dem man die Instanz erstellt hat kann man auch schon direkt loslegen und Aktionen erstellen. Zunächst erstellen wir erst einmal eine Aktion für einen Menüleisten Punkt 'Programm' welcher z.B. den Menüpunkt 'Beenden' beinhalten könnte.

    m_action_group->add(Gtk::Action::create("MenuApplication", "_Programm"));
    

    Mit dem Unterstrich gibt man an das P als Buchstabe für die Tastensteuerung verwendet werden soll um diesen Menüpunkt zu aktivieren.

    Hier wird eine Aktion mit Aktionsbehandlung hinzugefügt:

    m_action_group->add(Gtk::Action::create("NewFile", "_Neue Datei"), sigc::mem_fun(*this, &mainwindow::on_new_file));
    

    Auch recht einfach 🙂

    Noch ein Beispiel mit einem Standardeintrag (Stock Item)

    m_action_group->add(Gtk::Action::create("Quit", Gtk::Stock::QUIT), sigc::mem_fun(*this, &mainwindow::on_quit));
    

    Hier wird dann anstatt dem Text für die Beschriftung das "Stock Item" angegeben. Womit auch gleich ein Icon hinzugefügt wird.

    Ein kurzer Überblick auf die verfügbaren Methoden zum Hinzufügen der Aktionen zu einer Aktions Gruppe:
    ActionGroup besitzt die folgenden add() Methoden zum hinzufügen für Aktionen

    void 	add (const Glib::RefPtr<Action>& action, const AccelKey& accel_key, const Action::SlotActivate& slot)
    void 	add (const Glib::RefPtr<Action>& action, const Action::SlotActivate& slot)
    void 	add (const Glib::RefPtr<Action>& action, const AccelKey& accel_key)
    void 	add (const Glib::RefPtr<Action>& action)
    

    SlotActivate ist ein typedef für einen Callbacktyp der nichts zurück gibt und keine Parameter erwartet "void func(void)"

    Gtk::AccelKey beschreibt Tastenkombinationen welche einer Aktion zugewiesen werden kann und worauf wir jetzt auch zu sprechen kommen.

    2.1 Tastenkombinationen

    Natürlich möchte man für die verschiedenen Aktionen auch Tastenkombinationen festlegen können um Aktionen auführen zu lassen. Hierfür bietet GTKmm die Gtk::AccelKey Klasse an um eine Tastenkombination zu beschreiben.

    Es gibt 2 Konstruktorüberladungen welche 2 Verschiedene Wege anbieten die Tastenkombinationen zu bestimmen.

    AccelKey (guint accel_key, Gdk::ModifierType accel_mods, const Glib::ustring& accel_path="")
    

    Beschreibung der Parameter:
    Mit accel_key bezeichnet man ein Zeichen auf der Tastatur z.B. 'u' oder 'm' in Kleinbuchstaben

    accel_mods kann einer oder mehere der folgenden Werte sein:

    • Gdk::SHIFT_MASK => Umschalt Taste/Shift
    • Gdk::LOCK_MASK => Feststellt Taste/CapsLock
    • Gdk::CONTROL_MASK => Steuerungs Taste/Control
    • Gdk::MOD1_MASK => Meistens Alt kommt aber eventuell auf die Umgebung an
    • Gdk::RELEASE_MASK => Maskiert die Tastenkombination damit diese erst mit dem loslassen der Tastenkombination aktiviert wird

    Es gibt zwar noch mehr deren Anwendung erscheint dem Autor etwas Suspekt weshalb er sich auf die genannten beschränkt hat.
    Die Werte können per Bitweises Oder '|' kombiniert werden.

    accel_path kann dazu verwendet werden Bestimmte Tastenkombinationen zu identifizieren um diese dann zur Laufzeit austauschen zu können. (Siehe Anmerkung zu Gtk::AccelMap weiter unten in diesem Abschnitt)

    AccelKey (const Glib::ustring& accelerator, const Glib::ustring& accel_path=Glib::ustring())
    

    Beschreibung der Parameter:
    accelerator beschreibt eine Tastenkombination als Zeichenkette.
    Wie z.B. "<control><shift>s" oder F1,F2 etc für die Funktionstasten
    Mögliche Modifizierer sind <control>, <shift>, <alt> und <release>

    accel_path kann dazu verwendet werden Bestimmte Tastenkombinationen zu identifizieren um diese dann zur Laufzeit austauschen zu können.

    GTKmm bietet zusätzlich noch eine Möglichkeit an um Tastenkombinationen zu verwalten. Hierfür dient die Klasse Gtk::AccelMap (Siehe Referenz unter [2]) welche neben Routinen zum hinzufügen, abfragen und verändern auch Methoden zum Laden und Speichern anbietet. Da dies nicht Bestandteil der Thematik dieses Artikels entspricht, aber denoch äußerst Interessant für den einen oder anderen Entwickler ist, da man auf einfache Art dem Benutzer die Möglichkeit bieten kann Tastenkombinationen für diverse Aktionen zu bestimmen, war es eine Erwähnung wert.

    3 Ui der Manager

    3.1 Menüleisten definieren

    3.2 Toolbars erstellen

    3.3 Popupmenüs beschreiben

    4 Genug der Theorie ich will Code sehen...

    Schließlich und letztendlich kommen wir zum Sourcecode (ein Beispiel)

    --- TODO Code here ---

    Referenzen:
    [1] [url][/url]
    [2] Gtk::AccelMap Referenz


Anmelden zum Antworten