Seite 1 von 2
IsPopupMenuVisible_()?
Verfasst: 19.02.2015 12:47
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?
Re: IsPopupMenuVisible_()?
Verfasst: 19.02.2015 12:54
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
Re: IsPopupMenuVisible_()?
Verfasst: 19.02.2015 13:08
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.
Re: IsPopupMenuVisible_()?
Verfasst: 19.02.2015 13:21
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
Re: IsPopupMenuVisible_()?
Verfasst: 19.02.2015 13:27
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.
Re: IsPopupMenuVisible_()?
Verfasst: 20.02.2015 19:05
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?
Re: IsPopupMenuVisible_()?
Verfasst: 20.02.2015 19:42
von RSBasic
Du rufst Popup() auf, um eine weitere Schleife zu starten. Warum hast du zwei Schleifen?
Re: IsPopupMenuVisible_()?
Verfasst: 20.02.2015 20:01
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.
Re: IsPopupMenuVisible_()?
Verfasst: 20.02.2015 20:24
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
Re: IsPopupMenuVisible_()?
Verfasst: 20.02.2015 20:30
von Rudi
Es ist zur Laufzeit nur eine WaitWindowEvent() - Schleife in Gebrauch!