Mehrer Menüs abfragen

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Mehrer Menüs abfragen

Beitrag 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
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrer Menüs abfragen

Beitrag von ts-soft »

Es werden alle MenuItems durchnummeriert, so das es keine doppelten geben kann (ausser gewollte wie ToolBar, ShortCuts usw.)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Mehrer Menüs abfragen

Beitrag 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?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Mehrer Menüs abfragen

Beitrag 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.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Mehrer Menüs abfragen

Beitrag von stevie1401 »

Ok, letzter Versuch:
Welchen BEFEHL gibt es, um herauszufinden welches Menu angeklickt wurde?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mehrer Menüs abfragen

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Mehrer Menüs abfragen

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Re: Mehrere Menüs abfragen

Beitrag 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()
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Mehrer Menüs abfragen

Beitrag 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?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Mehrer Menüs abfragen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten