Seite 1 von 2

PopUp Menü

Verfasst: 05.10.2010 18:53
von Darie
Hallo Leute !!!

Ich würde gerne, dass mein Programm beendet wird, falls kein Eintrag in dem PopUp Menü ausgewählt wurde, also wenn man z.B. neben das Menü klickt. Dann verschwindet ja das Popup Menü von alleine. Dieses Ereignis würde ich gerne abfangen. Bin echt am verzweifeln. Bitte helft mir. Danke!
Mein Fenster soll letztendlich auch noch unsichtbar sein, sodass nur das PopUp Menü aufgeht...

Code: Alles auswählen

If OpenWindow(0, 10, 10, 100, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible
If CreatePopupMenu(0)
  MenuItem(1, "Cut")
  MenuItem(2, "Copy")
  MenuItem(3, "Paste")
 EndIf

DisplayPopupMenu(0, WindowID(0))
    

Repeat
  
 Event = WaitWindowEvent()
  
 If Event = #PB_Event_Menu 

  Select EventMenu()      
     Case 1 : Debug "Cut"
     Case 2 : Debug "Copy"
     Case 3 : Debug "Paste"
   EndSelect
   Debug "geklickt" : Quit = 1   
   
 EndIf
 
 
Until Quit = 1 Or Event = #PB_Event_CloseWindow

Re: PopUp Menü

Verfasst: 05.10.2010 18:57
von bobobo
ein

Code: Alles auswählen

Debug Event 
hinter der EventZuweisung könnte Dir auf die Sprünge helfen

Re: PopUp Menü

Verfasst: 05.10.2010 18:57
von ts-soft

Code: Alles auswählen

If OpenWindow(0, 10, 10, 100, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible
If CreatePopupMenu(0)
  MenuItem(1, "Cut")
  MenuItem(2, "Copy")
  MenuItem(3, "Paste")
EndIf

DisplayPopupMenu(0, WindowID(0))
   

Repeat
 
Event = WaitWindowEvent()
 
If Event = #PB_Event_Menu
  Quit = 0
  Select EventMenu()     
     Case 1 : Debug "Cut"
     Case 2 : Debug "Copy"
     Case 3 : Debug "Paste"
     Default :  Quit = 1
   EndSelect
   
EndIf


Until Quit = 1 Or Event = #PB_Event_CloseWindow 

Re: PopUp Menü

Verfasst: 05.10.2010 19:09
von Darie
Dein Code macht leider immer noch nicht, was ich möchte:

Wenn ein Eintrag gewählt wurde, soll etwas ausgeführt werden (debug "copy") und danach das Programm enden. Falls aber, das Menü verschwindet, weil der User woanders hinklickt, soll das Programm ebenso beendet werden. Das mit Default klappt leider nicht, hab ich schon versucht. Wenn ich EventMenu debugge, gibts irgendwie keinen passenden Wert, ders sagt, dass nichts ausgewählt wurde.

Wenn ich Event debugge :

13104 -> FensterHandle, oder ?
15 ?
5 ?
3 ?
13101 Handle vom Menü ?
2 ausgewählter Eintrag, aber was wenn nichts gewählt wurde?

Mir ist auch neu, das debug Event jetzt mehrere Werte ausspuckt. War früher glaub ich nur ein Wert. Sorry, aber ich blick momentan echt nicht mehr durch.

Re: PopUp Menü

Verfasst: 05.10.2010 19:29
von edel
Du hast leider nicht geschrieben welches Betriebssystem du benutzt, aber vielleicht hilft dir eine Loesung fuer Windows

Code: Alles auswählen

#TPM_RETURNCMD = $100

If OpenWindow(0, 10, 10, 100, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible

If CreatePopupMenu(0)
    MenuItem(1, "Cut")
    MenuItem(2, "Copy")
    MenuItem(3, "Paste")
EndIf

Repeat
    
    Event = WaitWindowEvent()
    
    If Event = #WM_RBUTTONUP
        
        GetCursorPos_(@p.point)
        
        Select TrackPopupMenu_(MenuID(0), #TPM_RETURNCMD, p\x, p\y, 0, WindowID(0), 0)
            Case 0 : Debug "Fail"    : Quit = #True 
            Case 1 : Debug "Cut"
            Case 2 : Debug "Copy"
            Case 3 : Debug "Paste"
        EndSelect
        
    EndIf
    
    
Until Quit = 1 Or Event = #PB_Event_CloseWindow

Re: PopUp Menü

Verfasst: 05.10.2010 19:39
von ts-soft
Wenn ich Ihn richtig verstanden habe, eher so:

Code: Alles auswählen

#TPM_RETURNCMD = $100

If OpenWindow(0, 10, 10, 100, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible

If CreatePopupMenu(0)
  MenuItem(1, "Cut")
  MenuItem(2, "Copy")
  MenuItem(3, "Paste")
EndIf

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #WM_RBUTTONUP
    
    GetCursorPos_(@p.point)
    Quit = #True
    Select TrackPopupMenu_(MenuID(0), #TPM_RETURNCMD, p\x, p\y, 0, WindowID(0), 0)
      Case 1 : Debug "Cut"
      Case 2 : Debug "Copy"
      Case 3 : Debug "Paste"
    EndSelect
    
  EndIf
  
  
Until Quit = 1 Or Event = #PB_Event_CloseWindow
Aber so ganz blicke ich da auch nicht durch :mrgreen:

Re: PopUp Menü

Verfasst: 05.10.2010 19:40
von Darie
Danke Edel !!! Jetzt funktionierts !

Code: Alles auswählen

#TPM_RETURNCMD = $100

If OpenWindow(0, 10, 10, 100, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible

If CreatePopupMenu(0)
    MenuItem(1, "Cut")
    MenuItem(2, "Copy")
    MenuItem(3, "Paste")
EndIf

GetCursorPos_(@p.point)

Repeat
   
    Event = WaitWindowEvent()
     
    Select TrackPopupMenu_(MenuID(0), #TPM_RETURNCMD, p\x, p\y, 0, WindowID(0), 0)
     Case 0 : Debug "Fail" : End
     Case 1 : Debug "Cut" 
     Case 2 : Debug "Copy"
     Case 3 : Debug "Paste"
   EndSelect
   Quit = 1
         
Until Quit = 1 Or Event = #PB_Event_CloseWindow

Re: PopUp Menü

Verfasst: 05.10.2010 19:45
von PureLust
Das hier wäre mein kleiner schmutziger Vorschlag gewesen, aber wie ich gesehen habe gibt's hier ja schon 'ne menge bessere Lösungen. :mrgreen:

Code: Alles auswählen

#WinMain          = 0
#PopUp_TimeOut    = 0
PopUp_SelectionOK = #False

If OpenWindow(#WinMain, 10, 10, 140, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible
ButtonGadget(0,10,10,120,30,"Open PopUp")

PopupDisplayed = #False
If CreatePopupMenu(0)
  MenuItem(1, "Cut")
  MenuItem(2, "Copy")
  MenuItem(3, "Paste")
EndIf

Repeat
	Event = WaitWindowEvent()
	
	Select Event
		Case #PB_Event_Gadget
			If EventGadget() = 0
				DisplayPopupMenu(0, WindowID(#WinMain))
				AddWindowTimer(#WinMain,#PopUp_TimeOut,50)
				PopUp_SelectionOK = #False
			EndIf
		Case #PB_Event_Timer
			If Not PopUp_SelectionOK
				Quit = #True
			EndIf
		Case #PB_Event_Menu
			Quit = 0
			Select EventMenu()     
				Case 1 : Debug "Cut"
					PopUp_SelectionOK = #True
				Case 2 : Debug "Copy"
					PopUp_SelectionOK = #True
				Case 3 : Debug "Paste"
					PopUp_SelectionOK = #True
			EndSelect
	EndSelect

Until Quit = 1 Or Event = #PB_Event_CloseWindow
@edel: TrackPopupMenu_(MenuID(0), #TPM_RETURNCMD, p\x, p\y, 0, WindowID(0), 0) ... sehr schicke Sache. :shock:

Re: PopUp Menü

Verfasst: 05.10.2010 19:49
von Rudi
Fehlt da nicht noch die Unsichtbarkeit?

Code: Alles auswählen

 If OpenWindow(0, 10, 10, 100, 100, "PopUp") : Else : End : EndIf ;,#PB_Window_Invisible
  SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(0), 0, 1, #LWA_ALPHA)
...

Re: PopUp Menü

Verfasst: 05.10.2010 19:59
von Darie
Genau, ich hab mich zu früh gefreut, wenn ich das Fenster jetzt noch unsichtbar mache, dann gibts doch kein "Fail" mehr. :(
Ihr fragt euch bestimmt, warum da ganze. Naja, ich möchte gerne für mein Grafiktablett ein Kontextmenü ersetzen, da bei diesem Wacomtreiber das Kontextmenü nur auf einer der Stiftknöpfe gelegt werden kann. Mann kann aber den Knöpfen auf dem Tablet eine Anwendung zuweisen. Deswegen möchte ich, dass dann mein Programm aufgerufen wird, dass lediglich ein Popupmenü öffnet und dann ein Shortcut an ein bestimmtes Fenster gesendet wird... >_<

Gruss
Alexander

@Rudi: Danke Rudi, mit deinen Codezeilen ist mein Vorhaben gerettet.

Mann, programmieren kann echt hart sein :?