Seite 1 von 3

Maus wird nicht angezeigt

Verfasst: 05.11.2008 13:04
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)

Verfasst: 05.11.2008 13:06
von HeX0R
Nein

Verfasst: 05.11.2008 13:09
von THEEX
Quellcode?

Verfasst: 05.11.2008 13:21
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

Verfasst: 05.11.2008 13:35
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

Verfasst: 05.11.2008 13:45
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...

Verfasst: 05.11.2008 13:53
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... :(

Verfasst: 05.11.2008 15:00
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:

Verfasst: 05.11.2008 17:41
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.

Verfasst: 05.11.2008 18:18
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: