Tutorial 14: Menüs und Popupmenüs
The MaxGUI Beginner Tutorial Series - Tutorial 14: Menüs und Popupmenüs
(c) Assari Jan 07 2005
Ins Deutsche übersetzt von simi
Menüs sind ein anderes, oft gebrauchtes GUI-Gadget. In diesem Tutorial behandeln wir die Menüs. Lass uns wie immer mit einem sehr einfachen Beispiel starten.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End End Select Forever |
Wir können das File-Menü sehen, aber wir können noch nichts damit machen.
|
Die Vorraussetzungen um ein Menü in unserem Fenster zu erstellen sind ein bisschen lästiger als bei anderen Gadgets, die wir schon früher gesehen haben. Zuerst müssen wir immer folgendes angeben:
- Den Text, der in der Menübar angezeigt werden soll.
- Eine spezifische (einmalige) Menü-ID.
- Ein Parent-Fenster, mithilfe von WindowMenu.
- Dann müssen wir einen Eintrag für das zweite Level erstellen (siehe CreateMenu "Exit"-Beispiel unten).
- Bevor wir unser Menü dann benützen können, müssen wir UpdateWindowMenu aufrufen. Nach diesem Aufruf erscheint unser Menü.
Im obigen Beispiel passiert bei einem Klick auf das Menü noch nichts. Lass uns etwas Interessanteres machen.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Beenden",101,FileMenu UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End End Select End Select Forever |
Nach dem Ausführen haben wir ein Datei-Menü mit einem Submenü "Beenden". Beim Klicken auf "Beenden" erscheint ein Infofenster und das Programm wird beendet.
|
Beachte, dass wir ein Beenden-Menü erstellen, das den FileMenu-Gadget als Parent hat. Die ID 101 wurde für dieses Menü gesetzt. Eine ander ID, die nur einmal vorkommt, würde auch gehen. Vergiss nie die UpdateWindowMenu-Funktion aufzurufen.
Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Exit",101,FileMenu UpdateWindowMenu MyWindow |
Wenn der Benutzer auf einen Menuitem klickt, wird ein EVENT_MENUACTION-Event erzeugt. Wir müssen dann nur noch überprüfen welches Menü angeklickt wurde. Das machen wir über die ID, die wir schon früher bei CreateMenu angegeben haben.
Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End End Select |
Lass uns sehen, wie wir mit mehreren Menüitems umgehen können.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Öffnen",102,FileMenu CreateMenu "Beenden",101,FileMenu Local HelpMenu:TGadget=CreateMenu("Hilfe",0,WindowMenu(MyWindow)) CreateMenu "Über...",123456,HelpMenu UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End Case 102 Notify "Du hast soeben auf Öffnen geklilckt!" Case 123456 Notify "Ein sehr simples Menübeispiel~n(c) Assari 2006" End Select End Select Forever |
Führe das obige Programm aus, und klicke auf Hilfe=>Über... und du wirst die Infobox sehen, wie wir sie in unserem Programm angegeben haben.
|
Die erste Zeile unten erstellt das Datei-Menü und dann erstellen wir 2 Submenüs Öffnen und Beenden.
Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Öffnen",102,FileMenu CreateMenu "Beenden",101,FileMenu |
Als nächstes erstellen wir das Hilfe und das Über...-Menü.
Local HelpMenu:TGadget=CreateMenu("Hilfe",0,WindowMenu(MyWindow)) CreateMenu "Über...",123456,HelpMenu |
Wir benutzen dann Select/Case für EventData(), die uns die ID, welche wir in der CreateMenu-Funktion angegeben haben, des angeklickten Menüs zurückgibt.
Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End Case 102 Notify "Du hast soeben auf Öffnen geklickt!" Case 123456 Notify "Ein sehr simples Menübeispiel~n(c) Assari 2006" End Select |
Wie du siehst, ist das benutzen von mehr Menüs nur eine Erweiterung der obigen Methode.
Die Syntax für CreateMenu ist folgende:
Function CreateMenu:TGadget( text$,tag,parent:TGadget,hotKey=0,modifier=0 ) |
Lass uns nun den hotkey-Parameter anschauen. Dieser Parameter erlaubt dir eine Tastenkombination (Hotkey) zum Menü hinzuzufügen => das Drücken des zugewiesenen Hotkeys löst einen Menüitem-Event aus.
Im diesem Beispiel fügen wir zum File-Exit-Menü den Taste F4 hinzu. Beachte die Benutzung der Konstante KEY_F4 in der CreateMenu-Funktion unten.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Beenden",101,FileMenu,KEY_F4 UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End End Select End Select Forever |
Jetzt führe das Programm aus und drücke die F4-Taste. Du wirst die Infobox sehen, so wie wenn du Datei-Beenden gedrückt hättest.
Den nächsten Parameter, den wir anschauen wollen, ist modifier. Der Modifier erlaubt und die CTRL- oder ALT-Taste mit unserer anderen Taste, hier F4, zu kombinieren => CTRL-F4 anstatt von F4 zum Beenden des Programmes.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Beenden",101,FileMenu,KEY_F4, MODIFIER_COMMAND UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End End Select End Select Forever |
Jetzt führe das obige Programm aus und drücke CTRL-F4. Du wirst wieder die Infobox sehen, wie wenn du auf Datei-Beenden gedrückt hättest.
Eine Liste von Tasten und Modifiern kann in der Hilfe gefunden werden.
POPUP-MENÜ
MaxGUI erlaubt auch das erstellen von Popupmenüs, die beim Klicken der rechten Maustaste erscheinen. Lass uns sehen, wie wir das machen.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local MyPanel:TGadget=CreatePanel(0,0,300,200,MyWindow,PANEL_ACTIVE) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) CreateMenu "Öffnen",102,FileMenu CreateMenu "Beenden",101,FileMenu UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MOUSEDOWN If EventSource()=MyPanel And EventData()=2 Then PopupWindowMenu MyWindow,FileMenu EndIf Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End Case 102 Notify "Du hast soeben auf Öffnen geklickt!" End Select End Select Forever |
Das Rechtsklicken auf das Panel öffnet nun das Datei-Menü bei unseren Mauskoordinaten.
|
Zuerst brauchen wir ein Gadget welches mit Mausevents umgehen kann. In diesem Beispiel benutzen wir ein Panel. Wir müssen nur daran denken, dass wir den PANEL_ACTIVE-Style setzten müssen, dass die Events auch generiert werden.
Local MyPanel:TGadget=CreatePanel(0,0,300,200,MyWindow,PANEL_ACTIVE) |
Dann müssen wir die Mausevents mit WaitEvent() und Select/Case verarbeiten. Wir müssen überprüfen ob der Mausevent von unserem Panel (EventSource()=MyPanel) kommt und dass die rechte Maustaste gedrückt wurde (EventData()=2). Wenn diese beiden Bedingungen erfüllt werden, können wir die PopupWindowMenu-Funktion aufrufen.
Case EVENT_MOUSEDOWN If EventSource()=MyPanel And EventData()=2 Then PopupWindowMenu MyWindow,FileMenu EndIf |
DisableMenu
Es gibt viele Funktionen, die zum Manipulieren von Menüitems benutzt werden können. Wir werden nicht alle hier behandeln. Eine Funktion, die wir hier behandeln ist DisableMenu, die, wie der Name schon sagt, ein Menü ausschaltet/deaktiviert. Lass uns sehen, wie das funktioniert.
SuperStrict Import MaxGui.Driver Local MyWindow:TGadget=CreateWindow("Menü-Beispiel", 200,200,320,240) Local MyPanel:TGadget=CreatePanel(0,0,300,200,MyWindow,PANEL_ACTIVE) Local FileMenu:TGadget=CreateMenu("Datei",0,WindowMenu(MyWindow)) Local ExitMenu:TGadget=CreateMenu("Beenden",101,FileMenu) CreateMenu "Beenden-Menü (de)aktivieren",103,FileMenu CreateMenu "Öffnen",102,FileMenu UpdateWindowMenu MyWindow Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MOUSEDOWN If EventSource()=MyPanel And EventData()=2 Then PopupWindowMenu MyWindow,FileMenu EndIf Case EVENT_MENUACTION Select EventData() Case 101 Notify "Du hast soeben auf Beenden geklickt!" End Case 102 Notify "Du hast soeben auf Öffnen geklickt!" Case 103 If MenuEnabled(ExitMenu)=1 DisableMenu ExitMenu Else EnableMenu ExitMenu EndIf UpdateWindowMenu MyWindow End Select End Select Forever |
Auf den Screenshots können wir sehen, dass das Menü deaktiviert wurde, nachdem wir auf das (De)Aktivieren-Menü geklickt haben. Das deaktivierte Menü wird nun grau dargestellt.
|
Das Erste was wir brauchen, ist eine Variable für den Menüitem, den wir deaktivieren wollen. Für die anderen Items ist dies, wie wir gesehen haben, nicht nötig.
Local ExitMenu:TGadget=CreateMenu("Beenden",101,FileMenu) |
Wenn das Beenden-Menü (de)aktivieren-Menü angeklickt wurde, gibt der EventData() die ID 103 zurück. Wir überprüfen dann den aktuellen Status des Menüs mittels MenuEnabled. Gestützt auf das, aktivieren (EnableMenu) oder deaktivieren (DisableMenu) wir das Menü dann.
Case 103 If MenuEnabled(ExitMenu)=1 DisableMenu ExitMenu Else EnableMenu ExitMenu EndIf UpdateWindowMenu MyWindow |
Beachte, dass immer die UpdateWindowMenu-Funktion aufgerufen werden muss, wenn wir an unserem Menü Verränderungen vorgenommen haben.
Zum Schluss...
Menüs sind ziemlich einfache Gadgets und wie wir oben sehen können, auch ziemlich einfach zum verwalten.
Das haben wir bis jetzt gelernt:
- Wir erstellen Menüs mit der Funktion CreateMenu.
- Menüs müssen mit UpdateWindowMenu aktiviert und aktualisiert werden, bevor sie benutzt werden können.
- Ein Menüevent wird erzeugt, wenn man auf den Menüitem klickt, oder wenn der Hotkey, den wir via den hotkey- und modifier-Parameter von CreateMenu angeben können, gedrückt wurde.
- Popupmenüs können via der Funktion PopupWindowMenu benutzt werden.
- Menüs lösen einen EVENT_MENUACTION-Event aus. Die relevante Menü-ID kann mit der EventData() Funktion herausgefunden werdne.
- Menüs können mit EnableMenu und DisableMenu aktiviert oder deaktiviert werden.