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:

Code: Alles auswählen

If EvWin=1
Das wird nie wahr sein.
Die Zeile sollte so lauten:

Code: Alles auswählen

If EvWin=0

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