Maus wird nicht angezeigt

Anfängerfragen zum Programmieren mit PureBasic.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Maus wird nicht angezeigt

Beitrag von Dare Devil »

Hallo.
Ich hab ein Problem. Zu Beginn meines Programms ist alles ok. Aber sobald ich ein Windowed Screen oeffne und mit MouseButton() ueberpruefe ob der User mit der linken Maustaste gedrueckt hat verschwindet der Mauszeiger ... das Programm laeuft trotzdem weiter und es laeuft auch alles problemslos wie es laufen sollte... nur den Mauszeiger sieht man nicht mehr (auch wenn ich nachher das Windowed Screen schliesse) - fuer den Rest des Programmes... muss ich immer mit ALT+F4 beenden :mrgreen:

Liegt das vllt an meiner Maus? (nutze eine USB-Maus von Microsoft)
Bild + Bild

Bild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Nein
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Quellcode?
Eine Art Query-Planner soll die Ausführung von Map/Reduce-Funktionen in Hadoop stark beschleunigen.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Hab es zwar geschafft mit der API-Funktion ShowCursor den Mauszeiger wieder anzuzeigen ... aber merkwuerdig ist, dass der Mauszeiger auf einmal im Screen "eingesperrt ist ... auch nachdem ich den Screen wieder schliesse bleibt die maus eingesperrt bis zum Programmende...

Hier die Mainloop

Code: Alles auswählen

Repeat
  Repeat
    EventID = WindowEvent()
  
    If EventID = #PB_Event_CloseWindow
     CloseScreen()
     CloseWindow(neuesf)
     ProcedureReturn 0
    EndIf
    If xposv <> Val(GetGadgetText(xpos)) Or yposv <> Val(GetGadgetText(ypos)) Or breitev <> Val(GetGadgetText(breite)) Or hoehev <> Val(GetGadgetText(hoehe))
      SetGadgetText(xpos, Str(xposv))
      SetGadgetText(ypos, Str(yposv))
      SetGadgetText(breite, Str(breitev))
      SetGadgetText(hoehe, Str(hoehev))
    EndIf
  Until EventID = 0
  
  ExamineMouse()
  If MouseButton(#PB_MouseButton_Left)
    If mt = 0
      xposv = MouseX()
      yposv = MouseY()
      mt = 1
    EndIf
    

      StartDrawing(ScreenOutput())
      DrawImage(ImageID(scrs), 0, 0, width, height)
      LineXY(xposv, yposv, MouseX(), MouseY(), RGB(210, 0, 0))
      StopDrawing()
      
      breitev = MouseX() - xposv
      hoehev = MouseY() - yposv
      
      FlipBuffers()
  ElseIf MouseButton(#PB_MouseButton_Left) = 0
    mt = 0
    StartDrawing(ScreenOutput())
    DrawImage(ImageID(scrs), 0, 0, width, height)
    StopDrawing()
  EndIf
  
  Delay(1)
  ShowCursor_(1)

ForEver
Bild + Bild

Bild
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Ist ja auch nicht sauber programmiert :mrgreen:

Du kannst doch nicht erst den Screen schließen und dann noch mal ExamineMouse() benutzen.

Haste das Programm schon mal im DebugModus laufen lassen?

Versuch mal einfach die Tastatur abzufragen mit ExamineKeyboard und auf die Escape-Taste zu reagieren.

Und wenn irgendeine Abbrechtaste gedrückt wurde, gehste aus der Schleife raus, machst die nicht Forever, sondern Until Quit

Und nach Until machste dann alles zu. Und sollte Escape oder das [X] gedrückt worden sein, machste Quit=1

So verhinderst du, dass nur halbe Sachen geschlossen werden.

>>>>>>>>>>>>>>>>>>

Außerdem ist dein FlipBuffers() nicht am Ende und du hast ShowCursor() innerhalb der Schleife.

Du zeichnest nach FlipBuffers() auf den Screen.

Und du mischst scheinbar wahllos Gadgets mit Screen-Befehlen.

Du kannst ja auch WindowMouseX() oder DesktopMouseX() nehmen und auf einem ImageGadget() zeichnen. Eigentlich brauchste keinen Screen.

Und statt Images könntest auch Sprites benutzen, wenn du schon einen Screen aufmachen möchtest. :?

Die Linie scheint eh gleich wieder in dem Image übermalt zu werden, also könnte sie höchstens mal flackern :D
Kinder an die Macht http://scratch.mit.edu/
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Xaby hat geschrieben:Ist ja auch nicht sauber programmiert :mrgreen:

Du kannst doch nicht erst den Screen schließen und dann noch mal ExamineMouse() benutzen.
tu ich doch nicht gar nicht...
Xaby hat geschrieben:Versuch mal einfach die Tastatur abzufragen mit ExamineKeyboard und auf die Escape-Taste zu reagieren.

Und wenn irgendeine Abbrechtaste gedrückt wurde, gehste aus der Schleife raus, machst die nicht Forever, sondern Until Quit
hoert sich so an wie "naja, wenns mit der Maus ned geht, nehmen wir halt die Tastatur is doch egal" :mrgreen:

Die Maus ist wichtig fuer mein Programm, da kann ich nicht drauf verzichten...
Bild + Bild

Bild
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Xaby hat geschrieben:Du kannst ja auch WindowMouseX() oder DesktopMouseX() nehmen und auf einem ImageGadget() zeichnen. Eigentlich brauchste keinen Screen.
Und wie mach ich dann ne Linie auf das Bild? Das geht eben nur mit Screen /:->
Xaby hat geschrieben:Und statt Images könntest auch Sprites benutzen, wenn du schon einen Screen aufmachen möchtest. :?
Ja aber was bringt mir ein Sprite? Fuer meine Zwecke tut es doch ein Image auch... :roll:
Xaby hat geschrieben:Die Linie scheint eh gleich wieder in dem Image übermalt zu werden, also könnte sie höchstens mal flackern :D
flackern is aber nicht toll... :(
Bild + Bild

Bild
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Dare Devil hat geschrieben:
Xaby hat geschrieben: Ist ja auch nicht sauber programmiert Mr. Green

Du kannst doch nicht erst den Screen schließen und dann noch mal ExamineMouse() benutzen.
tu ich doch nicht gar nicht...
Wenn das Ereignis: #PB_Event_CloseWindow
eintritt, dann schließt du CloseScreen() und dann das Fenster()

(wir ignorieren mal das ProcedureReturn)

Und danach kommt ExamineMouse()


Mach nicht so viel und packe es nicht in eine Prozedur.
Öffne erstmal einen Screen, der sich sauber mit Escape schließt.

Wenn das geht, zeichnest ein paar Linien drauf, wenn die da bleiben, kannste deine Maus hinzufügen.

Und mische nicht einfach so GadgetBefehle und ScreenBefehle.

Ist nur ein Tipp. Und ja, wenn es mit der Maus nicht geht, versuche es erstmal mit der Tastatur. Um Fehlerquellen auszuschließen.
Kann doch auch an den Stellen liegen, wo du deinen Screen eröffnet hast oder an anderen Dingen.
DingsTeufel hat geschrieben: a aber was bringt mir ein Sprite? Fuer meine Zwecke tut es doch ein Image auch...
Also ein Screen ist doch nur sinnvoll, wenn man auch Sprites benutzen möchte. Weil ein Screen mit Sprites schnell umgehen kann.

Wenn du nur ein paar Linien auf ein Image zeichnen willst mit der Maus, brauchste keinen Screen eröffnen.

Du kannst die Gadgets() abfragen und herausfinden, ob die Maus geklickt wurde und du kannst auch herausfinden, wo sich die Maus befindet.

Ich meine, wenn du eh in einem Gadget den Text angibst, wo sich deine Maus befindet.

Versuch doch mal nur Befehle für den Screen zu benutzen oder für Gadgets()

beim Mischen können sich sehr schnell Fehler einschleichen.

Ansonsten Suchfunktionbenutzen :mrgreen:

http://www.purebasic.fr/german/viewtopi ... creen+maus
Teufelchen hat geschrieben: Und wie mach ich dann ne Linie auf das Bild? Das geht eben nur mit Screen
StartDrawing(...) was glaubste, wozu die Parameter sind?

ImageOutPut(... Bild ...)

Schau mal in die Hilfe :shock:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hi.

1. die verwendung der Screen-Mouse-Lib beschränkt die Maus auf den Screen. das ist so.
wenn man die Maus wieder ans OS zurückgeben will, muss man ReleaseMouse(#True) ausführen.

2. die In-Screen Mouse versteckt mit Absicht den Mauszeiger,
weil die Meisten Spiele nunmal eigene Grafik auch für den Mauszeiger verwenden.
PB-Help: Kapitel Mouse-Lib hat geschrieben:Diese Library ist optimiert ... speziell zur Benutzung in Spielen. Verwenden Sie die Befehle dieser Library nicht in einer regulären Applikation, realisieren Sie in diesem Fall die Mausabfrage mittels WindowMouseX(), WindowMouseY() und EventType().

für ein Game nimmt man einen Screen.
für eine Application nimmt man normalerweise ein Image.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

@Kaeru Gaman
Ja das weiss ich jetzt auch .. aber wenn man die Maus in einem Windowed Screen verwenden will? (denn ohne Screen hab ich kein DoubleBuffer....) Daran hat Fred leider nicht gedacht... konnte des problem trotzdem loesen, indem ich abfrage wo sich die maus befindet... wenn sie sich im screen befindet dann aktiviere ich ReleaseMouse(0), wenn nicht, dann ReleaseMouse(1)... das klappt soweit... ausser, dass die Maus, immer wenn ich sie vom Screen rausfuehre oder rein, sich etwas verschiebt und es auch eine kurze Verzoegerung gibt ... und das wirkt halt nicht besonders "professionell"...

@Xaby
Wenn das Ereignis: #PB_Event_CloseWindow
eintritt, dann schließt du CloseScreen() und dann das Fenster()

(wir ignorieren mal das ProcedureReturn)

Und danach kommt ExamineMouse()


Ich dachte die Funktion beendet sich automatisch nach ProcedureReturn... :shock:
Bild + Bild

Bild
Antworten