linker Mausklick auf Fenster

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

linker Mausklick auf Fenster

Beitrag 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?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: linker Mausklick auf Fenster

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: linker Mausklick auf Fenster

Beitrag 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.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
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: linker Mausklick auf Fenster

Beitrag 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
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
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: linker Mausklick auf Fenster

Beitrag 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.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: linker Mausklick auf Fenster

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: linker Mausklick auf Fenster

Beitrag 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
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten