Wie das Menu ermitteln ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Wie das Menu ermitteln ?

Beitrag 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
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
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: Wie das Menu ermitteln ?

Beitrag 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:
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
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie das Menu ermitteln ?

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
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: Wie das Menu ermitteln ?

Beitrag 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:
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Wie das Menu ermitteln ?

Beitrag 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 
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: Wie das Menu ermitteln ?

Beitrag 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 
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
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie das Menu ermitteln ?

Beitrag von Bisonte »

Tja wenn man das so sieht... Da gefällt mir der Highlander Stil von ts-soft doch besser ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Wie das Menu ermitteln ?

Beitrag von NicTheQuick »

Hat trotzdem Spaß gemacht. :P
Antworten