Seite 1 von 1
linker Mausklick auf Fenster
Verfasst: 19.03.2018 10:18
von ProgOldie
Hallo,
ich möchte eine Debugmeldung ausgeben, wenn ein linker Mausklick irgendwo auf dem Fenster (nicht zwingend auf dem Listicon !) stattgefunden hat.
Code: Alles auswählen
Procedure Start()
Protected Colnr.i,RowNr.i
OpenWindow(0,20,20,300,500,"Testwindow")
ListIconGadget(1,0,1,WindowWidth(0)-5,WindowHeight(0)-5,"Spalte1",50,#PB_ListIcon_GridLines)
For nr=1 To 5
AddGadgetColumn(1,nr,"sp"+Str(nr),50)
Next
For nr= 1 To 10
AddGadgetItem(1,nr,"xyz")
Next
For RowNr=0 To 10
For ColNr=1 To 5
SetGadgetItemText(1,RowNr,"("+Str(RowNr)+","+Str(ColNr)+")",ColNr)
Next
Next
EndProcedure
Define Ev.i,EvType.i,EvWin.i,Zelle.Point
start()
SetActiveGadget(1)
Repeat
Ev=WaitWindowEvent()
EvType=EventType()
EvWin=EventWindow()
If EvWin=0
If Ev=#PB_Event_LeftClick ;linker Mausclick auf Fenster
Debug "Mausklick irgendwo im Fenster"
EndIf
EndIf
Until Ev=#PB_Event_CloseWindow
Warum funktioniert obiger Code nicht?
Re: linker Mausklick auf Fenster
Verfasst: 19.03.2018 10:22
von RSBasic
Du erstellst ein Fenster mit der ID 0, aber du hast folgende Abfrage eingebaut:
ProgOldie hat geschrieben:
Das wird nie wahr sein.
Die Zeile sollte so lauten:
Re: linker Mausklick auf Fenster
Verfasst: 19.03.2018 10:31
von ProgOldie
Ja, das mit 0 und 1 bei der Fensternummer habe ich geändert. Trotzdem funktioniert es nicht. Das sieht man,l wenn man die Höhe des ListiconGadgets verkleinert.
Offenbar läuft die Eventbearbeitung folgendermaßen:
If Ev=#PB_Event_LeftClick trifft nur dann zu, wenn der Klick auf kein(!) aktives Gadget in dem Fenster trifft.
Das merkt man, wenn man das ListiconGadget deaktiviert, dann nämlich wird ein Klick auch auf das deaktivierte Gadget erkannt.
Re: linker Mausklick auf Fenster
Verfasst: 19.03.2018 10:35
von ts-soft
Code: Alles auswählen
Procedure Start()
Protected Colnr.i,RowNr.i
OpenWindow(0,20,20,300,500,"Testwindow")
ListIconGadget(1,0,1,WindowWidth(0)-5,WindowHeight(0)-5,"Spalte1",50,#PB_ListIcon_GridLines)
For nr=1 To 5
AddGadgetColumn(1,nr,"sp"+Str(nr),50)
Next
For nr= 1 To 10
AddGadgetItem(1,nr,"xyz")
Next
For RowNr=0 To 10
For ColNr=1 To 5
SetGadgetItemText(1,RowNr,"("+Str(RowNr)+","+Str(ColNr)+")",ColNr)
Next
Next
EndProcedure
Define Ev.i,EvType.i,EvWin.i,Zelle.Point
start()
SetActiveGadget(1)
Repeat
Ev=WaitWindowEvent()
EvType=EventType()
EvWin=EventWindow()
; If EvWin=0
; If Ev=#PB_Event_LeftClick ;linker Mausclick auf Fenster
; Debug "Mausklick irgendwo im Fenster"
; EndIf
; EndIf
If EvType = #PB_EventType_LeftClick
Debug "Mausklick irgendwo im Fenster"
EndIf
Until Ev=#PB_Event_CloseWindow
Man achte auf das #PB_
EventType_LeftClick
Re: linker Mausklick auf Fenster
Verfasst: 19.03.2018 10:42
von ProgOldie
Ja, danke. In der Tat funktioniert es so.
Ich habe es alternativ zweistufig gemacht:
Code: Alles auswählen
If EvWin=0
If Ev=#PB_Event_Gadget; Mausklick auf das aktive Gadget?
Debug "aufs aktive Gadget"
ElseIf Ev=#PB_Event_LeftClick ;Mausklick nicht aufs aktive Gadget
Debug "außerhalb eines aktiven Gadgets"
EndIf
EndIf
Aber die Lösung von ts-soft ist eleganter.
Re: linker Mausklick auf Fenster
Verfasst: 19.03.2018 10:59
von RSBasic
Da EventType() nicht bei jedem Gadget unterstützt wird, empfehle ich dir, falls du überall den Klick auswerten möchtest, die Callback-Funktion. Damit hast du die volle Kontrolle ohne Einschränkung.
Re: linker Mausklick auf Fenster
Verfasst: 19.03.2018 11:17
von ProgOldie
Die Korrektur von ts-soft ermöglicht folgende Lösung, bei der man die Zelle des Listicongadgets angeben kann, egal ob das Gadget aktiv ist oder nicht. Der Mausklick muss lediglich im aktiven Bereich des Listicongadgets erfolgen, also da, wo eine Spalte oder Zeile definiert wurde. Den verbleibenden Problemfall, dass ein Klick auf eine Spalte rechts vom sichtbaren Bereich erfolgt, kann man wunschweise korrigieren.
Code: Alles auswählen
Procedure Start()
Protected Colnr.i,RowNr.i
OpenWindow(0,20,20,300,500,"Testwindow")
ListIconGadget(1,0,1,200,WindowHeight(0)-50,"Sp0",50,#PB_ListIcon_GridLines)
For nr=1 To 5
AddGadgetColumn(1,nr,"sp"+Str(nr),50)
Next
For nr= 1 To 10
AddGadgetItem(1,nr,"xyz")
Next
For RowNr=0 To 10
For ColNr=1 To 5
SetGadgetItemText(1,RowNr,"("+Str(RowNr)+","+Str(ColNr)+")",ColNr)
Next
Next
EndProcedure
Procedure eval_LeftClick(LIcNr.i,*p.Point)
;von hjBremer
;Ermittlung der Zellenpos. in p\x bzw. p\y (Zählung ab Zeile,Spalte =0)
Protected lvhit.LVHITTESTINFO,LIcID.i,ret.i
GetCursorPos_(*p) ;Mauskoordinaten ermitteln
LIcID=GadgetID(LIcNr)
MapWindowPoints_(0, LIcID, *p, 1) ;0:Schirmkoord. umrechnen in Koord. von LIcGad
lvhit\pt\x = *p\x
lvhit\pt\y = *p\y
SendMessage_(LIcID, #LVM_SUBITEMHITTEST, 0, lvhit)
*p\y = lvhit\iItem ;row ab 0
*p\x = lvhit\iSubItem ;col ab 0
If *p\x>=0 And *p\y>=0 ;Click innerhalb des aktiven LICGadgets
ret=#True
Else ;außerhalb
ret=#False
EndIf
ProcedureReturn ret
EndProcedure
Define Ev.i,EvType.i,EvWin.i,Zelle.Point,EvGad.i
start()
;SetActiveGadget(1)
DisableGadget(1,0) ; Hier zum Testen aktivieren/deaktivieren
Repeat
Ev=WaitWindowEvent()
EvType=EventType()
EvWin=EventWindow()
EvGad=EventGadget()
If EvWin=0
If EvType = #PB_EventType_LeftClick
If eval_LeftClick(1,@Zelle) ; Mausklick auf aktiven Bereich des Listicongadgets
Debug "("+Str(Zelle\y)+","+Str(Zelle\x)+")"
Else
Debug "außerhalb des beschriebenen Bereichs des Listicongadgets"
EndIf
EndIf
EndIf
Until Ev=#PB_Event_CloseWindow