Maus loslassen wird null erkannt

Anfängerfragen zum Programmieren mit PureBasic.
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Maus loslassen wird null erkannt

Beitrag von Re42 »

#WM_LBUTTONUP kann DOCH abgefragt werden, nur nicht in einem bestimmten verschachtelten IF-Endif-Bereich, obwohl die Werte, die weiterverarbeitet werden sollen, genau richtig da ankommen.

Der Abschnitt sieht so aus:

Code: Alles auswählen

If bs <> vs
  If ((wmx > 280 And wmx < 320) Or (wmx > 330 And wmx < 370)) And (wmy > 250 And wmy < 290)
     If event = #WM_LBUTTONUP
       debug event
     EndIf 
  EndIf
EndIf
Wenn ich

Code: Alles auswählen

If event = #WM_LBUTTONUP
  debug event
EndIf
direkt über den obigen Code-Abschnitt schreibe, funkioniert die Abfrage, nur nicht da, wo sie funktionieren soll. Selbsteverständlich wird der betreffende Abschnitt innerhalb der if-endif-Verschachtelung erreicht, aber dann funktioniert das nicht mehr. Wie gesagt, in meinem Parallelprogramm funktioniert dieser Abschnitt einwandfrei. Es werden da zwei Schalter auf einem WindowedScreen abgefragt (jeweils erstellt mit 4 Linien) , aber zur Gesamtsteuerung ist in dem Fall die Abfrage der wieder losgelassenen Maus unerläßlich. Ich arbeite da nur mit der Windows-Maus, weil ich das auch bei WindowedScreens immer so gemacht hatte und das ging ja auch immer.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Maus loslassen wird null erkannt

Beitrag von Mijikai »

Bitte die OS-Events richtig Abfragen (via WinApi bzw. über einen Callback).
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus loslassen wird null erkannt

Beitrag von ccode_new »

Versuch mal:

Code: Alles auswählen

if Event() = #WM_LBUTTONUP
Und, Quatsch?
Oder wurde etwas über Gültigkeitsbereiche von deklarierten Variablen gelernt?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Maus loslassen wird null erkannt

Beitrag von Kiffi »

@Re42: Ohne lauffähigen Code (wie schon mehrfach erbeten) wird das hier nix und die anderen orakeln sich den Wolf.
a²+b²=mc²
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Maus loslassen wird null erkannt

Beitrag von Re42 »

Ich war zwischendurch angerufen worden, Entschuldigung, aber das Gespräch ist jetzt gerade beendet.

Edit: Edit: Zu früh gefreut! Während meines Telefongesprächs war das mit dem If Event() nur scheinbar gelaufen, weil da in Wirklichkeit noch ein zweiter Debugger lief, der genau den Wert geliefert hatte, auf den ich gewartet hatte. Mit If Event() geht da sogar gar nichts. Ich kann hier jetzt nicht den ganzen Code einstellen, aber ich bereite etwas vor. Also bis später.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus loslassen wird null erkannt

Beitrag von ccode_new »

Und?

Ich glaube was ich oben geschrieben habe ist Blödsinn.
(If Event() = ...)

Zähle mal wie viele WindowEvent(), WaitWindowEvent(), Event(), etc. Befehle hast du in der Schleife?
Bei mehr als oder weniger als 1 würde ich mir Gedanken machen.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Maus loslassen wird null erkannt

Beitrag von Re42 »

@ccode_new
Einmal WaitWindowEvent()

Ich habe jetzt mal den relevanten Code-Teil herausgezogen. Der Code ist lauffähig und es werden dort zwei Schalter gezeigt, die beim Draufklicken die Farben wechseln. Ziel der Übung soll sein, daß die Schalter entweder grün oder rot werden, aber niemals beide rot. Im Fall beide grün nehmen dann programmseitig beide Schalter einen Blauton an.

Das Problem: Die Abfrage

Code: Alles auswählen

If event = #WM_LBUTTONUP
   schalt = 2
endif
funktioniert nicht. Wie macht man denn nun die Abfrage richtig?

Hier jetzt mal der Code-Teil:

Code: Alles auswählen

If InitMouse() = 0
  MessageRequester("InitMouse fehlgeschlagen", "")
EndIf  

If InitKeyboard() = 0
;MessageRequester("InitKeyboard fehlgeschlagen", "")
EndIf

 If InitSound() = 0
   MessageRequester("Initsound not possible" , "")
 EndIf
   
If InitSprite() = 0
 MessageRequester("InitSprite fehlgeschlagen", "")
EndIf

If OpenWindow(1,0,0,801,412,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered) = 0
 MessageRequester("OpenWindow fehlgeschlagen", "")
EndIf

If OpenWindowedScreen(WindowID(1),0,0,801,412) = 0
 MessageRequester("OpenWindowedScreen fehlgeschlagen", "")
EndIf
   
 StartDrawing(ScreenOutput())
   Box(280,252,40,40,RGB(100,100,220))
   Box(330,252,40,40,RGB(100,100,220))
   
 Line(330-50,251,42,1,RGB(0,0,0)); oben
 Line(330-50,292,42,1,RGB(0,0,0)); unten
 Line(330-50,251,1,42,RGB(0,0,0)); links
 Line(371-50,251,1,42,RGB(0,0,0)); rechts
 
 Line(380-50,251,42,1,RGB(0,0,0)) 
 Line(380-50,292,42,1,RGB(0,0,0))
 Line(380-50,251,1,42,RGB(0,0,0))
 Line(421-50,251,1,42,RGB(0,0,0))
StopDrawing()
  
  Repeat
    ExamineKeyboard()
     event = WaitWindowEvent()
    
      Select event    
        Case #PB_Event_LeftClick
          klvb = 1
          wmx = WindowMouseX(1)    : ;Debug wmx
          wmy = WindowMouseY(1)    : ;Debug wmy
      EndSelect
      
    
       ;Schalter
       If klvb = 1
         klvb = 0
         If schalt = 0
           If (wmx > 280 And wmx < 320) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             vs = 1
             bs = 0
             StartDrawing(ScreenOutput())
             Box(280,252,40,40,RGB(0,140,0))
             Box(330,252,40,40,RGB(200,0,0))
             StopDrawing()
           EndIf
           
           If (wmx > 330 And wmx < 370) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             vs = 0
             bs = 1
             StartDrawing(ScreenOutput())
             Box(280,252,40,40,RGB(200,0,0))
             Box(330,252,40,40,RGB(0,140,0))
             StopDrawing()
           EndIf
         EndIf  ; If schalt = 0
     
         
           If bs <> vs
             If ((wmx > 280 And wmx < 320) Or (wmx > 330 And wmx < 370)) And (wmy > 250 And wmy < 290)
               If event = #WM_LBUTTONUP
                 schalt = 2
               EndIf 
             EndIf
           EndIf
           
           If bs = vs
             If ((wmx > 280 And wmx < 320) Or (wmx > 330 And wmx < 370)) And (wmy > 250 And wmy < 290)
               If event = #WM_LBUTTONUP
                 schalt = 0
               EndIf 
             EndIf
           EndIf
         
            
         If schalt = 2
           If (wmx > 280 And wmx < 320) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             schalt = 1
             If vs = 1
               vs = 0
               bs = 1
               StartDrawing(ScreenOutput())
               Box(330,252,40,40,RGB(0,140,0)) 
               Box(280,252,40,40,RGB(200,0,0))
               StopDrawing()
             Else 
               vs = 1 
               StartDrawing(ScreenOutput())
               Box(280,252,40,40,RGB(0,140,0))
               StopDrawing()
                 If bs = 1
                   StartDrawing(ScreenOutput())
                     Box(330,252,40,40,RGB(0,140,0))
                   StopDrawing()
                   Delay(75)
                   StartDrawing(ScreenOutput())
                     Box(280,252,40,40,RGB(100,100,220))
                     Box(330,252,40,40,RGB(100,100,220))
                   StopDrawing()
                 EndIf
                 
             EndIf
           EndIf
         
           If (wmx > 330 And wmx < 370) And (wmy > 250 And wmy < 290) And event = #PB_Event_LeftClick
             If bs = 1
               bs = 0
               vs = 1
               StartDrawing(ScreenOutput())
               Box(280,252,40,40,RGB(0,140,0))
               Box(330,252,40,40,RGB(200,0,0))
               StopDrawing()
             Else
               bs = 1
               StartDrawing(ScreenOutput())
               Box(330,252,40,40,RGB(0,140,0))
               StopDrawing()
                 If bs = 1
                   StartDrawing(ScreenOutput())
                     Box(280,252,40,40,RGB(0,140,0))
                   StopDrawing()
                   Delay(75)
                   StartDrawing(ScreenOutput())
                     Box(280,252,40,40,RGB(100,100,220))
                     Box(330,252,40,40,RGB(100,100,220))
                   StopDrawing() 
                 EndIf
                 
             EndIf 
           EndIf 
         EndIf ; if schalt = 2 
       EndIf ; If klvb = 1
   
   FlipBuffers()
 Until event = #PB_Event_CloseWindow     
 

Danke für Info.
Zuletzt geändert von Re42 am 27.12.2020 13:23, insgesamt 2-mal geändert.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus loslassen wird null erkannt

Beitrag von ccode_new »

/:->
Da liegt aber was auf dem Fenster.

Bei Screen-Anwendungen geht das nicht mehr so:
Hier kannst du so etwas benutzen:

Code: Alles auswählen

If GetAsyncKeyState_(#VK_LBUTTON) & 1 ;Async ist wichtig!
  schalt = 2
  Debug schalt
EndIf
Oder du freundest dich mit der PureBasic-Maus-Bibliothek an.* (ExamineMouse() /ReleaseMouse() / MouseButton())
(*Ich aber nicht)
Zuletzt geändert von ccode_new am 26.12.2020 22:22, insgesamt 2-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Maus loslassen wird null erkannt

Beitrag von STARGÅTE »

Ich verstehe gerade nicht wieso du unbedingt #WM_LBUTTONUP nutzen willst.
Das offizielle Event #PB_Event_LeftClick wird genau dann gefeuert, wenn die Maus losgelassen wird (also ein Klick).
Auch #WM_LBUTTONUP wird dann gesendet, aber vor #PB_Event_LeftClick.
Das führt natürlich zu Problemen, wenn du erst danach mit #PB_Event_LeftClick die Mauskoordinaten abfragst (WindowMouseX und WindowMouseY), denn dann haben wmx und wmy noch den "alten" Wert.

Hier die Events die ankommen, wenn die Maus gedrückt wird:
513 ; (#WM_LBUTTONDOWN)
514 ; (#WM_LBUTTONUP)
13112 ; (#PB_Event_LeftClick)
PS: Höre bitte auf PureBasic "zu beleidigen" nur weil du unsere Ratschläge nicht annimmst. (Edit: bezogsich auf ein gelöschen kommentar von Re42)
PSPS: Und höre bitte auf deine Beiträge zu ändern und Sachen zu löschen die Teil der Konversation/Threads waren. (viewtopic.php?p=358580#p358580)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Maus loslassen wird null erkannt

Beitrag von ccode_new »

:o
Halte dich an STARGÅTE.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten