Growbook, Cannabis, Notizbuch, Growbuch, Pflanzenzucht, Samenbank, Seedbank, Software, Stammbaum, Kreuzen, züchten,growen,anbauen,News,GIB,Lux,Omega,Mars, Dünger,BioBizz,Hesi,Athena,
die Software für deinen Anbau

Willkommen

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.

    Tut14 1


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.

    Tut14 2
Tut14 3


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.

    Tut14 4
Tut14 5


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.

    Tut14 6


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.

    Tut14 7
Tut14 8


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.