Seite 1 von 2

Mehrer Menüs abfragen

Verfasst: 11.12.2014 18:45
von stevie1401
Mit folgendem Code kann ich ein Menu erzeugen

Code: Alles auswählen

If OpenWindow(0, 200, 200, 200, 100, "MenuID Example")
    If CreateMenu(0, WindowID(0))
      Debug "Handle of current menu is:"
      Debug MenuID(0)
    EndIf
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf



Mit EventMenu() kann ich lediglich den Index des angeklicketen Eintrages feststellen, nicht das Menu selbst.
Was ist, wenn ich mehrere Menus habe.
Wie kann ich die Abfragen?

__________________________________________________
Quote-Tags durch Code-Tags ersetzt
11.12.2014
RSBasic

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 18:54
von ts-soft
Es werden alle MenuItems durchnummeriert, so das es keine doppelten geben kann (ausser gewollte wie ToolBar, ShortCuts usw.)

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 19:11
von stevie1401
Aber wie frage ich die ab?
Über Eventmenu() kann ich ja nur herausfinden, DASS es einen Klick gab, aber NICHT in welchem Menu?

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 19:18
von NicTheQuick
Das müsstest du am besten im Voraus wissen. Oder du baust dir da was mit einer Map um dir das Programm-intern merken zu können.

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 19:34
von stevie1401
Ok, letzter Versuch:
Welchen BEFEHL gibt es, um herauszufinden welches Menu angeklickt wurde?

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 19:41
von ts-soft
Ok, letzter Versuch :lol:
Es ist nicht notwendig rauszufinden, welches Menü angeklickt worden ist, ich weiß doch, wo ich welches MenüItem hinterlegt habe
und in welchem Menu dieses sich befindet.

Ansonsten geht es natürlich per API. Ist normalerweise nicht notwendig.

Beispiel einer Enumeration:

Code: Alles auswählen

Enumeration ; Menuitem
  #mnu_File_Save
  #mnu_File_Open
  ;...
  #mnu_Edit_Copy
  #mnu_Edit_Cut
  ; ...
  #mnu_PopUpmenu1_bla
  ; usw.
EndEnumeration

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 21:16
von stevie1401
Da ich mit unterschiedlichen Menus unterschiedliche Dinge erreichen möchte, ist es für mich zwingend notwendig zu wissen, welche Menu angeklickt wurden, weil ich nur so herausfinden kann, was der Benutzer möchte.
Danke für die Hilfe, ich werde wohl eine andere Lösung finden müssen.
Aus euren Antworten erahne ich allerdings, dass es tatsächlich NICHT möglich ist das Menü herauszufinden, welches angeklickt wurde.

Re: Mehrere Menüs abfragen

Verfasst: 11.12.2014 21:33
von jear
In der Datei Menu.pb der PB-Hilfe steht:

Code: Alles auswählen

  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the Event
  ; isn't 0 and we just have to see what have happened...
  ;
  
  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Menu

        Select EventMenu()  ; To see which menu has been selected

          Case 11 ; About
            MessageRequester("About", "Cool Menu example", 0)
            
          Default
            MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)

        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1
Wonach Du fragst ist also vermutlich: EventMenu()

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 22:03
von stevie1401

Code: Alles auswählen

OpenWindow(0, 10, 10, 800, 600, "Window 1")
    If CreateMenu(0, WindowID(0))   
      MenuTitle("Project")
        MenuItem(1, "Open"   +Chr(9)+"Ctrl+O")
        MenuItem(2, "Save"   +Chr(9)+"Ctrl+S")
        MenuItem(3, "Save as"+Chr(9)+"Ctrl+A")
        MenuItem(4, "Close"  +Chr(9)+"Ctrl+C")
      EndIf
      
       OpenWindow(1, 200, 200, 800, 600, "Window 2")
      If CreateMenu(1, WindowID(1))   
      MenuTitle("Menu2")
        MenuItem(1, "Zeile1")
        MenuItem(2, "Zeile2")
        MenuItem(3, "Zeile3")
        MenuItem(4, "Zeile4")
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  
Mit EventMenu() kann ich nur herausfinden Dass ein bestimmter INDEX eines Menus angeklickt wurde, nicht aber welches Menu.
Wie kann ich herausfinden, dass Zeile 2 in Menu 2 angeklickt wurde?

Re: Mehrer Menüs abfragen

Verfasst: 11.12.2014 22:05
von RSBasic
Nur mit API:
Für Windows:

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Select uMsg
    Case #WM_UNINITMENUPOPUP
      If wParam = MenuID(1)
        Debug "Menü 1"
      EndIf
      If wParam = MenuID(2)
        Debug "Menü 2"
      EndIf
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreatePopupMenu(1)
    MenuItem(10, "Item in Menu 1")
  EndIf
  If CreatePopupMenu(2)
    MenuItem(15, "Item in Menu 2")
  EndIf
  
  SetWindowCallback(@WinCallback())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_RightClick
        DisplayPopupMenu(1, WindowID(0))
      Case #PB_Event_LeftClick
        DisplayPopupMenu(2, WindowID(0))
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Lösungen für Linux und MacOS musst du auf andere warten.