Seite 1 von 1

Wie das Menu ermitteln ?

Verfasst: 30.07.2013 18:27
von Bisonte
Hallo...

Die Frage die ich mir gerade stelle :

Wie ermittel ich das Menu ?

In einer Eventschleife eines Fensters und sagen wir 2 Popupmenues gibt es da eine Möglichkeit ?
Weil mit EventMenu() bekommt man nur das MenuItem und nicht das Menu selbst.
kleines beispiel :

Code: Alles auswählen

OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)

CreatePopupMenu(0)
MenuItem(1, "Hallo")
MenuItem(2, "Hallo2")
MenuItem(3, "Hallo3")

CreatePopupMenu(1)
MenuItem(1, "AAHallo")
MenuItem(2, "AAHallo2")
MenuItem(3, "AAHallo3")

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_CloseWindow
    Quit = 1
  EndIf
  If Event = #PB_Event_Menu
    ; --- Hier die Frage : Wie bekomme ich das Menu ? 
    ; xx = GetMenu ?
    Debug GetMenuItemText(xx, EventMenu())
  EndIf
  If Event = #PB_Event_RightClick
    DisplayPopupMenu(1, WindowID(0))
  EndIf
  If Event = #PB_Event_LeftClick
    DisplayPopupMenu(0, WindowID(0))
  EndIf    
  
Until Quit > 0

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 18:55
von ts-soft
Das geht mit PB mitteln nicht, ist aber auch nicht nötig, da die Itemnummerierung über alle Menüs eindeutig sein
muß. Dein Beispiel ist das aber nicht :wink:

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 20:05
von Bisonte
In der Hilfe hab ich nichts über eindeutige Itemnummerierung über alle Menüs gefunden.
Ausserdem kann ich ja mehrere Menus erstellen, da stellt sich dann die Frage nach dem Sinn...

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 20:28
von ts-soft
Du kannst mehrere Popup Menüs erstellen, Du kannst aber nur eins zur Zeit darstellen!
Dies dient im endeffekt nur der leichteren Vorkonfiguration des Popupmenüs, weil es wird
nur einen geben :wink:

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 20:47
von NicTheQuick
Hier ein kleiner Wrapper um mehrere gleiche Menu-IDs in unterschiedlichen Menüs verwenden zu können. Geändert hat sich eigentlich nur 'EventMenu()' und 'EventMenuItem()' ist dazu gekommen.
'EventMenu()' gibt jetzt die IDs des Menüs zurück und 'EventMenuItem()' die ID des MenuItems. Eigentlich logisch. :D

Code: Alles auswählen

EnableExplicit
;{
Global WRAPPER_Menu_CurrentMenu.i = 0
Global WRAPPER_Menu_CurrentItemID.i = 0
Structure WRAPPER_Menu_Items
	menu.i
	item.i
EndStructure
Global NewMap WRAPPER_MenuMap.WRAPPER_Menu_Items(128)
Global NewMap WRAPPER_RealID.i(128)
Procedure WRAPPER_CreateImageMenu(Menu.i, WindowID.i, Flags.i = 0)
	Protected id.i
	id = CreateImageMenu(Menu, WindowID, Flags)
	If (id)
		If (Menu = #PB_Any)
			WRAPPER_Menu_CurrentMenu = id
		Else
			WRAPPER_Menu_CurrentMenu = Menu
		EndIf
	EndIf
	ProcedureReturn id
EndProcedure
Procedure WRAPPER_CreateMenu(Menu.i, WindowID.i)
	Protected id.i
	id = CreateMenu(Menu, WindowID)
	If (id)
		If (Menu = #PB_Any)
			WRAPPER_Menu_CurrentMenu = id
		Else
			WRAPPER_Menu_CurrentMenu = Menu
		EndIf
	EndIf
	ProcedureReturn id
EndProcedure
Procedure WRAPPER_CreatePopupImageMenu(Menu.i, Flags.i = 0)
	Protected id.i
	id = CreatePopupImageMenu(Menu, Flags)
	If (id)
		If (Menu = #PB_Any)
			WRAPPER_Menu_CurrentMenu = id
		Else
			WRAPPER_Menu_CurrentMenu = Menu
		EndIf
	EndIf
	ProcedureReturn id
EndProcedure
Procedure WRAPPER_CreatePopupMenu(Menu.i)
	Protected id.i
	id = CreatePopupMenu(Menu)
	If (id)
		If (Menu = #PB_Any)
			WRAPPER_Menu_CurrentMenu = id
		Else
			WRAPPER_Menu_CurrentMenu = Menu
		EndIf
	EndIf
	ProcedureReturn id
EndProcedure
Procedure WRAPPER_MenuItem(MenuItemID.i, Text$, ImageID = #PB_Ignore)
	If (ImageID = #PB_Ignore)
		MenuItem(WRAPPER_Menu_CurrentItemID, Text$)
	Else
		MenuItem(WRAPPER_Menu_CurrentItemID, Text$, ImageID)
	EndIf
	If AddMapElement(WRAPPER_MenuMap(), Str(WRAPPER_Menu_CurrentItemID))
		WRAPPER_MenuMap()\menu = WRAPPER_Menu_CurrentMenu
		WRAPPER_MenuMap()\item = MenuItemID
	EndIf
	WRAPPER_RealID(Str(WRAPPER_Menu_CurrentMenu) + "." + Str(MenuItemID)) = WRAPPER_Menu_CurrentItemID
	WRAPPER_Menu_CurrentItemID + 1
EndProcedure

Procedure WRAPPER_EventMenu()
	FindMapElement(WRAPPER_MenuMap(), Str(EventMenu()))
	ProcedureReturn WRAPPER_MenuMap()\menu
EndProcedure

Procedure.s WRAPPER_GetMenuItemText(Menu.i, MenuItem.i)
	ProcedureReturn GetMenuItemText(Menu, WRAPPER_RealID(Str(Menu) + "." + Str(MenuItem)))
EndProcedure

Procedure.i WRAPPER_GetMenuItemState(Menu.i, MenuItem.i)
	ProcedureReturn GetMenuItemState(Menu, WRAPPER_RealID(Str(Menu) + "." + Str(MenuItem)))
EndProcedure

Procedure.i WRAPPER_SetMenuItemState(Menu, MenuItem, State)
	ProcedureReturn SetMenuItemState(Menu, WRAPPER_RealID(Str(Menu) + "." + Str(MenuItem)), State)
EndProcedure

Procedure.i WRAPPER_SetMenuItemText(Menu, MenuItem, Text$)
	ProcedureReturn SetMenuItemText(Menu, WRAPPER_RealID(Str(Menu) + "." + Str(MenuItem)), Text$)
EndProcedure

Procedure EventMenuItem()
	FindMapElement(WRAPPER_MenuMap(), Str(EventMenu()))
	ProcedureReturn WRAPPER_MenuMap()\item
EndProcedure

Macro EventMenu()
	WRAPPER_EventMenu()
EndMacro

Macro MenuItem(MenuItemID, Text, ImageID = #PB_Ignore)
	WRAPPER_MenuItem(MenuItemID, Text, ImageID)
EndMacro

Macro CreateImageMenu(Menu, WindowID, Flags = 0)
	WRAPPER_CreateImageMenu(Menui, WindowID, Flags)
EndMacro

Macro CreateMenu(Menu, WindowID)
	WRAPPER_CreateMenu(Menu, WindowID)
EndMacro

Macro CreatePopupImageMenu(Menu, Flags = 0)
	WRAPPER_CreatePopupImageMenu(Menu, Flags = 0)
EndMacro

Macro CreatePopupMenu(Menu)
	WRAPPER_CreatePopupMenu(Menu)
EndMacro

Macro GetMenuItemText(Menu, MenuItem)
	WRAPPER_GetMenuItemText(Menu, MenuItem)
EndMacro

Macro GetMenuItemState(Menu, MenuItem)
	WRAPPER_GetMenuItemState(Menu, MenuItem)
EndMacro

Macro SetMenuItemState(Menu, MenuItem, State)
	WRAPPER_SetMenuItemState(Menu, MenuItem, State)
EndMacro

Macro SetMenuItemText(Menu, MenuItem, Text)
	WRAPPER_SetMenuItemText(Menu, MenuItem, Text)
EndMacro

;}

DisableExplicit

OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)

CreatePopupMenu(0)
MenuItem(1, "Hallo")
MenuItem(2, "Hallo2")
MenuItem(3, "Hallo3")

CreatePopupMenu(1)
MenuItem(1, "AAHallo")
MenuItem(2, "AAHallo2")
MenuItem(3, "AAHallo3")

Repeat
	
	Event = WaitWindowEvent()
	
	If Event = #PB_Event_CloseWindow
		Quit = 1
	EndIf
	If Event = #PB_Event_Menu
		Debug GetMenuItemText(EventMenu(), EventMenuItem())
	EndIf
	If Event = #PB_Event_RightClick
		DisplayPopupMenu(1, WindowID(0))
	EndIf
	If Event = #PB_Event_LeftClick
		DisplayPopupMenu(0, WindowID(0))
	EndIf   
	
Until Quit > 0 

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 20:55
von ts-soft
Oh man o man <)
Sehe zwar keinen Bedarf, aber so wäre es wesentlich kürzer und einfacher:

Code: Alles auswählen

EnableExplicit

OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)

CreatePopupMenu(1)
MenuItem(1, "Hallo")
MenuItem(2, "Hallo2")
MenuItem(3, "Hallo3")

CreatePopupMenu(2)
MenuItem(1, "AAHallo")
MenuItem(2, "AAHallo2")
MenuItem(3, "AAHallo3")

Define Event, Quit, Menu

Repeat
 
  Event = WaitWindowEvent()
 
  If Event = #PB_Event_CloseWindow
    Quit = 1
  EndIf
  If Event = #PB_Event_Menu
      Debug Menu
    ; --- Hier die Frage : Wie bekomme ich das Menu ?
    ; xx = GetMenu ?
    ;Debug GetMenuItemText(xx, EventMenu())
  EndIf
  If Event = #PB_Event_RightClick
    DisplayPopupMenu(2, WindowID(0))
    Menu = 2
  EndIf
  If Event = #PB_Event_LeftClick
    DisplayPopupMenu(1, WindowID(0))
    Menu = 1
  EndIf   
 
Until Quit > 0 

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 21:14
von Bisonte
Tja wenn man das so sieht... Da gefällt mir der Highlander Stil von ts-soft doch besser ;)

Re: Wie das Menu ermitteln ?

Verfasst: 30.07.2013 21:19
von NicTheQuick
Hat trotzdem Spaß gemacht. :P