IsPopupMenuVisible_()?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

IsPopupMenuVisible_()?

Beitrag von Rudi »

Nach dem Erstellen eines Popup-Menüs, zeige ich es per DisplayPopupMenu() an. Nun kann ich draufklicken oder daneben. In beiden Fällen verschwindet es in den Hintergrund, bleibt aber existent.

Frage: Wie kann ich nun feststellen, ob es im Hintergrund oder im Vordergund ist?
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: IsPopupMenuVisible_()?

Beitrag von RSBasic »

Anders gefragt: Möchtest du ermitteln, ob das Popup-Menü geschlossen wurde? Meinst du so?

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  
  Select uMsg
    Case #WM_UNINITMENUPOPUP
      Debug "PopupMenu wurde geschlossen."
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreatePopupMenu(1)
    MenuItem(1, "Hallo")
    MenuItem(2, "Welt")
  EndIf
  
  SetWindowCallback(@WinCallback())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_RightClick
        DisplayPopupMenu(1, WindowID(0))
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: IsPopupMenuVisible_()?

Beitrag von Rudi »

Ja, ist soweit richtig - danke! Dachte mir schon, dass es nur im Callback geht.
Muss nur noch sehen, wie ich die Verbindung zur Procedure herstelle, da das Menü dort erstellt wird und in einer eigenen Eventschleife läuft. Wenn sich das Menü versteckt, soll das Menü beendet werden, um beim nächsten Rechtsklick wieder neu zu erstellt zu werden.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
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: IsPopupMenuVisible_()?

Beitrag von ts-soft »

Verstehe ich nicht? Ich erstelle bei jedem Rechtsklick ein neues Popupmenu und zeige es dann an, jedenfalls wenn es ein angepaßtes
Kontextmenü ist, welches ja auf alles mögliche reagieren sollte (z.B. sind Daten in der Zwischenablage usw.).

Und das Callback ist auch nicht erforderlich.

Gruß
Thomas
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: IsPopupMenuVisible_()?

Beitrag von NicTheQuick »

Generell sollte man nicht verschiedene Eventschleifen erstellen, sondern alles in einer verarbeiten. Man könnte ja auch direkt auf einen Button klicken anstatt in das Popmenü. Und auf diesen Buttonklick soll ja reagiert werden.
Alternativ kannst du dir mal die BindEvent()-Sachen anschauen. Damit kannst du einzelne Procedures schreiben, die auf einzelne Events, z.B. Menü-Events reagieren.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: IsPopupMenuVisible_()?

Beitrag von Rudi »

Nee muss ich so machen, da noch diverse Parameter übergeben werden und das Menü, je nachdem wo ich ins Lig geklickt habe, dann ein anderes Aussehen hat. habe mal RSBasic Code erweitert:

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
	Select uMsg
		Case #WM_INITMENUPOPUP
			Debug "PopupMenu wurde geöffnet."
		Case #WM_UNINITMENUPOPUP
			If IsMenu(0)
				FreeMenu(0)
			EndIf
			Debug "PopupMenu wurde geschlossen."
	EndSelect
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure Popup()
	If CreatePopupMenu(0)
		MenuItem(1, "Hallo")
		MenuItem(2, "Welt")
		DisplayPopupMenu(0, WindowID(0))
		
		Repeat
			Select WaitWindowEvent()
				Case #PB_Event_Menu
					Select EventMenu()
						Case 1
							Debug "Hallo"
						Case 2
							Debug "Welt"
					EndSelect
			EndSelect
		Until Not IsMenu(0)
	EndIf
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
	SetWindowCallback(@WinCallback())
	
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_RightClick
				Popup()
			Case #PB_Event_CloseWindow
				End
		EndSelect
	ForEver
EndIf
Komischerweise löst das Callback früher aus als die Eventschleife somit wird weder "Hallo" noch "Welt" ausgegeben, da das Menü vorher beendet worden ist.
Irgendwie fühle ich mich schon selbst wie in einer Eventschleife. Kann mir da jemand raushelfen?
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: IsPopupMenuVisible_()?

Beitrag von RSBasic »

Du rufst Popup() auf, um eine weitere Schleife zu starten. Warum hast du zwei Schleifen?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: IsPopupMenuVisible_()?

Beitrag von Rudi »

Die Popup-Procedure wird wiederum aus verschiedenen Proceduren aufgerufen. Diese haben ebenfalls eine Eventschleife die den Inhalt eines Containers abfragt. Ist also ziemlich umständlich alles. Darum muss man sehen, dass man nicht doppelt codet, was man auch innerhalb einer Procedure verarbeiten kann. Das Problem ist jetzt nur noch das, wie dargestellt.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
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: IsPopupMenuVisible_()?

Beitrag von ts-soft »

Tut mir leid, aber das kann so nicht funktionieren, jedenfalls nicht zuverlässig. 2 WaitWindowEvent, das wird nie was.
Aber da Du anderer Ansicht bist, wünsch ich dir viel Spaß.

Gruß
Thomas
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
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: IsPopupMenuVisible_()?

Beitrag von Rudi »

Es ist zur Laufzeit nur eine WaitWindowEvent() - Schleife in Gebrauch!
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Antworten