Seite 3 von 4
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 22:07
von Re42
Danke, aber Zitat "Das geht so nicht mehr" kann so nicht stimmen, denn genau so geht das ja in meinem ursprünglichen Code, das ist ja das Verrückte. Wie kann das in einem Code gehen und im anderen nicht?
Ich weiß, daß die Maus erst dann den Event erzeugt, wenn man die wieder losläßt, aber trotzdem ist da ein Riesenunterschied zwischen
#PB_Event_LeflClick und #WM_LBUTTONUP
An den Programmstellen, wo "schalt = 2" oder "schalt = 0" steht, ist #PB_Event_LeflClick unbrauchbar, denn in dem Fall darf der Mausklick nur in Programmzeile 79 ausgewertet werden, und nicht zugleich auch weiter oben, der Mauszeiger ist ja dann immernoch auf demselben Schalter! Wenn man an den besagten Stellen #PB_Event_LeflClick statt #WM_LBUTTONUP einsetzt, funktioniert das also nicht mit den Schalterwechseln. Mit #WM_LBUTTONUP funktioniert es, aber eben nur in meinem ersten Code, den ich ändern will.
Beleidigt habe ich PureBasic nirgendwo, oder stimmt es etwa nicht, daß PureBasic bis zum heutigen Tag keinen eigenen Befehl für #WM_LBUTTONUP anbietet? Auch ich finde aber ansonsten PureBasic wirklich super gut gelungen.
Ratschläge nicht annehmen? Wo soll ich das lernen? Dazu müßte ich erstmal genau die richtige Fachliteratur finden.
Eventuell gelingt mir ja eine völlig neue Steuerung für die Schalter, oder ich muß mich eben damit abfinden, daß ich jetzt nur noch umschalten kann zwischen grün-rot, und rot-grün. Danke nochmals an alle.
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 22:15
von DarkDragon
Wenn du InitMouse aufrufst und einen Screen verwendest, solltest du auch die Mouse Befehle verwenden:
https://www.purebasic.com/documentation ... index.html
https://www.purebasic.com/documentation ... utton.html
Einfach die Änderungen beobachten:
Code: Alles auswählen
ExamineMouse()
LastButtonState = ButtonState
ButtonState = MouseButton(...)
If LastButtonState <> 0 And ButtonState = 0
; Released
EndIf
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 22:30
von Re42
Danke, davon weiß ich und das könnte ich auch mal ausprobieren, aber soviel ich weiß, hat man dann die Arbeit, erstmal einen eigenen Mauszeiger erzeugen zu müssen. Bleibt aber im Hinterkopf.
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 22:39
von ccode_new
Code: Alles auswählen
If GetAsyncKeyState_(#VK_LBUTTON) & 1
Debug "linke Maustaste gedrückt."
EndIf
If Not GetAsyncKeyState_(#VK_LBUTTON) & 1
Debug "linke Maustaste losgelassen"
EndIf
Das & 1 kann auch weg gelassen werden und dient hier nur für Überprüfungen auf 0 oder 1.
Außerdem ist GetAsyncKeyState_() gängige Praxis.
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 23:29
von Mijikai
Re42 hat geschrieben:...
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.
...
Hier mal etwas Code:
Code: Alles auswählen
;Schalter AN = GRÜN
;Schalter AUS = ROT
;Beide Schalter AN = (beide) BLAU
;Beide Schalter AUS = NICHT ERLAUBT -> vertausche AN/AUS
EnableExplicit
Structure BUTTON
x.f
y.f
w.f
h.f
ox.f
oy.f
state.b[2]
color.l[4]
EndStructure
Macro InitButton(_btn_,_x_,_y_,_w_,_h_,_s_,_c1_,_c2_,_c3_)
_btn_\x = _x_
_btn_\y = _y_
_btn_\w = _w_
_btn_\h = _h_
_btn_\ox = _x_ + _w_
_btn_\oy = _y_ + _h_
_btn_\state[0] = _s_
_btn_\color[0] = _c1_
_btn_\color[1] = _c2_
_btn_\color[2] = _c2_
_btn_\color[3] = _c3_
EndMacro
Macro DrawButton(_btn_,_key_,_x_,_y_)
_btn_\state[1] = 0
If _key_
If _x_ > _btn_\x And _x_ < _btn_\ox And _y_ > _btn_\y And _y_ < _btn_\oy
_btn_\state[0] ! 1
_btn_\state[1] = 1
EndIf
EndIf
DrawingMode(#PB_2DDrawing_Default)
Box(_btn_\x,_btn_\y,_btn_\w,_btn_\h,_btn_\color[_btn_\state[0]])
DrawingMode(#PB_2DDrawing_Outlined)
Box(_btn_\x,_btn_\y,_btn_\w,_btn_\h,$666666)
EndMacro
Macro UpdateButtons(_btn1_,_btn2_)
If _btn1_\state[0] + _btn2_\state[0] = 2
_btn1_\color[1] = _btn1_\color[3]
_btn2_\color[1] = _btn1_\color[3]
Else
If _btn1_\state[0] + _btn2_\state[0] = 0
If _btn1_\state[1]
_btn2_\state[0] ! 1
Else
_btn1_\state[0] ! 1
EndIf
Else
_btn1_\color[1] = _btn1_\color[2]
_btn2_\color[1] = _btn1_\color[2]
EndIf
EndIf
EndMacro
Procedure.i Main()
Protected Dim btn.BUTTON(1)
Protected up.i
Protected mx.i
Protected my.i
If InitSprite()
If OpenWindow(0,0,0,600,400,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
If OpenWindowedScreen(WindowID(0),0,0,600,400)
SetFrameRate(60)
InitButton(btn(0),100,100,100,30,#False,$333388,$338833,$883333)
InitButton(btn(1),100,200,100,30,#True,$333388,$338833,$883333)
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_LeftClick
up = 1
Case #PB_Event_CloseWindow
Break 2
Case #Null
Break
EndSelect
ForEver
mx = WindowMouseX(0)
my = WindowMouseY(0)
ClearScreen($0)
If StartDrawing(ScreenOutput())
DrawButton(btn(0),up,mx,my)
DrawButton(btn(1),up,mx,my)
UpdateButtons(btn(0),btn(1))
StopDrawing()
EndIf
FlipBuffers()
up = 0
ForEver
EndIf
CloseWindow(0)
EndIf
EndIf
ProcedureReturn
EndProcedure
Main()
End
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 23:33
von HeX0R
ccode_new hat geschrieben:Code: Alles auswählen
If GetAsyncKeyState_(#VK_LBUTTON) & 1
Debug "linke Maustaste gedrückt."
EndIf
If Not GetAsyncKeyState_(#VK_LBUTTON) & 1
Debug "linke Maustaste losgelassen"
EndIf
& $8000 wäre eigentlich richtig, um den aktuellen Status zu ermitteln.
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 23:46
von STARGÅTE
Das hier wird meine letzte Antwort sein, weil ich das Gefühl habe, dass der Thread im Sande verläuft.
Um den Thread mal (aus meiner Sicht) auf die Ursprungsfrage zusammenzufassen:
Re42 hat geschrieben:Der Debugger liefert nur nach Endif einen Wert (13112), also wird die Abfrage „Maus loslassen“ erst gar nicht erkannt.
13112 ist das Event #PB_Event_LeftClick und bedeutet das die Maus losgelassen wurde.
Re42 hat geschrieben:Beleidigt habe ich PureBasic nirgendwo, oder stimmt es etwa nicht, daß PureBasic bis zum heutigen Tag keinen eigenen Befehl für #WM_LBUTTONUP anbietet?
Das Event #WM_LBUTTONUP wird (under Windows) gesendet wenn die Maus losgelassen wird. Das gleiche (OS-übergreifende Event) signalisiert #PB_Event_LeftClick.
Re42 hat geschrieben:Ich weiß, daß die Maus erst dann den Event erzeugt, wenn man die wieder losläßt, aber trotzdem ist da ein Riesenunterschied zwischen #PB_Event_LeftClick und #WM_LBUTTONUP
Das ist richtig. #PB_Event_LeflClick ist offiziell als WindowEvent() dokumentiert. #WM_LBUTTONUP wird an dieser Stelle ist nicht offiziell dokumentiert.
Ansonsten hat Mijikai dir am ende ja einen Beispielcode für das "Ziel der Übung" gegeben.
Re: Maus loslassen wird null erkannt
Verfasst: 26.12.2020 23:56
von ccode_new
HeX0R hat geschrieben:& $8000 wäre eigentlich richtig, um den aktuellen Status zu ermitteln.
Warum?
Eigentlich brauch man gar kein & dahinter schreiben.
Es sei denn man benutzt noch ein 16 Bit - Windows mit short int, ansonsten ist es doch automatisch ein int.
Re: Maus loslassen wird null erkannt
Verfasst: 27.12.2020 00:04
von Re42
Danke Mijilai für den Code. Werde ich mir morgen ansehen, heute bin ich zu müde.
@Stargate
Wieso gibt es denn dann auch noch extra #WM_LBUTTONDOWN? Das wertet den Event aus, wenn die Maus gedrückt wurde und #WM_LBUTTONUP wertet den Event aus, wenn sie losgelassen wurde. Wie Windows das intern macht, weiß ich nicht. Auf jeden Fall kann #WM_LBUTTONUP nicht mit #PB_Event_LeftClick ersetzt werden, sonst wäre mein Problem ja gelöst. #PB_Event_LeftClick wertet aus, daß die Maus gedrückt wurde und nicht auch noch das Gegenteil.
Re: Maus loslassen wird null erkannt
Verfasst: 27.12.2020 08:57
von DarkDragon
ccode_new hat geschrieben:HeX0R hat geschrieben:& $8000 wäre eigentlich richtig, um den aktuellen Status zu ermitteln.
Warum?
Eigentlich brauch man gar kein & dahinter schreiben.
Es sei denn man benutzt noch ein 16 Bit - Windows mit short int, ansonsten ist es doch automatisch ein int.
https://docs.microsoft.com/en-us/window ... nckeystate
If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState
GetKeyState ist vllt. auch gut, denn bei GetAsyncKeyState sind es roh abfragen:
GetAsyncKeyState(VK_LBUTTON) always returns the state of the left physical mouse button, regardless of whether it is mapped to the left or right logical mouse button. You can determine the system's current mapping of physical mouse buttons to logical mouse buttons by calling GetSystemMetrics(SM_SWAPBUTTON).