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
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.