Seite 1 von 1

WindowedScreen und seltsames Mausverhalten

Verfasst: 04.03.2010 12:29
von Christian
Hallo,

ich fuchse mich gerade etwas in die Grafik-Befehle von PureBasic hinein und bin nun schon zu Beginn auf ein seltsames Verhalten gestoßen, welches ich nicht deuten kann. Vielleicht kann mir ja einer von euch etwas "Starthilfe" geben. Beim Anlegen großer "Windowed Screens", welche (fast) den gesamten Desktop einnehmen, zeigt meine Maus ein seltsames Verhalten. Sobald ich die Maus über das obere Drittel des Screen-Fensters bewege, verschwindet diese. Fahre ich aus diesem Bereich des Fenster heraus, in das zweite Drittel des Fensters, so taucht sie wieder auf. Bisher habe ich keinen Fehler im Quellcode gefunden und kann mir dieses seltsame und extrem störende Verhalten nicht erklären.

Hier einmal der Code, den ich zum Testen verwendet habe und bei dem dieser Fehler (auf meinem Rechner) auftaucht:

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    End
EndIf

If InitSprite3D() = 0
    MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
    End
EndIf



; - Desktop untersuchen
ExamineDesktops()

; - Fenster öffnen
hWnd = OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0) - 30, "Sprite3D", #PB_Window_BorderLess)

; - einen Screen im Fenster öffnen
If hWnd <> 0 And OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)

  ; - Hauptschleife 
  Repeat

    ; - normale Fenster-Ereignisse abfragen
    Repeat

      ; - letztes Ereignis
      Event = WindowEvent()
      
      ; - wenn letztes Ereignis ...
      Select Event 

        ; - wenn Taste losgelassen
        Case #WM_KEYUP

          ; - wenn ESCAPE gedrückt wurde
          If EventwParam() = #VK_ESCAPE
              
              ; - Statusvariable setzen: Programm beenden
              TerminateProgram = #True
              
          EndIf

        
        Case #PB_Event_CloseWindow
          End 

      EndSelect

    Until (Event = 0 Or TerminateProgram = #True)





    ; - Buffer vertauschen und auf dem Hintergrund-Buffer zeichnen
    FlipBuffers()

    ; - Screen leeren, d.h. mit schwarz überzeichnen
    ClearScreen(RGB(0, 0, 0))

    ; - eine Millisekunde warten
    Delay(1)

  Until TerminateProgram = #True

EndIf

End 
Kann einer von euch darin einen Fehler entdecken? Oder tritt der oben beschriebene Darstellungsfehler bei euch überhaupt auch auf?

Vielen Dank schoneinmal!

Grüße,
Christian

Re: WindowedScreen und seltsames Mausverhalten

Verfasst: 04.03.2010 12:34
von Lord
Außer der Tatsache, daß statt WaitWindowEvent() WindowEvent
verwendet wurde, so daß der Rechner kaum ansprechbar ist,
passiert da bei mir nichts außergewöhnliches.
Da verschwindet nichts.

Re: WindowedScreen und seltsames Mausverhalten

Verfasst: 04.03.2010 12:42
von Christian
WaitWindowEvent kann ich hier ja nur schlecht verwenden, da sonst die Grafik-Befehle alle samt nicht ausgeführt würden, solange kein Ereignis auftritt. Es muss hier also WindowEvent() sein.
Wie meinst du das, dass der Rechner kaum ansprechbar ist? Verursacht obiger Code eine zu hohe CPU-Auslastung bei dir? Könnte daran liegen, dass ich ein Delay() vergessen habe. Ich füge es oben mal ein ...

Dass der andere Fehler bei dir nicht auftritt ist schonmal seltsam. Dann liegt es vermutlich an meinem Rechner ... allerdings verstehe ich nicht warum. Was für ein Betriebssystem nutzt du?

Re: WindowedScreen und seltsames Mausverhalten

Verfasst: 04.03.2010 14:27
von Kaeru Gaman
bei mir treten keine Anomalien auf.

ich habe mir trotzdem mal die Freiheit genommen, ein paar Falten auszubügeln:

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    End
EndIf

If InitSprite3D() = 0
    MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
    End
EndIf

; - Desktop untersuchen
ExamineDesktops()

; - Fenster öffnen
hWnd = OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "Sprite3D", #PB_Window_BorderLess | #PB_Window_Maximize )

; - einen Screen im Fenster öffnen
If hWnd <> 0 And OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)

  ; - Hauptschleife
  Repeat
    ; - normale Fenster-Ereignisse abfragen
    Repeat
      Event = WaitWindowEvent(10)
      Select Event
        Case #PB_Event_CloseWindow
          TerminateProgram = #True
      EndSelect
    Until (Event = 0 Or TerminateProgram = #True)

    ExamineKeyboard()

    If KeyboardPushed( #PB_Key_Escape )
      TerminateProgram = #True
    EndIf


    ; - Screen leeren, d.h. mit schwarz überzeichnen
    ClearScreen(RGB(0, 0, 0))

    ; - Buffer vertauschen und auf dem Hintergrund-Buffer zeichnen
    FlipBuffers()

  Until TerminateProgram = #True

EndIf

End
1. WaitWindowEvent mit TimeOut statt WindowEvent und Delay
2. Tastaturabfrage über DX-Lib, wenn du schon InitKeyboard benutzt
3. Erst löschen, dann zeichnen, dann flippen.

und als Beispiel mal die Taskleiste weggenommen.

Re: WindowedScreen und seltsames Mausverhalten

Verfasst: 04.03.2010 15:40
von Christian
OK, dann liegt es wohl an meiner Hardware. Die Nutzung von WaitWindowEvent und einem größeren Timeout hat schonmal den Effekt gebracht, dass die Maus im oberen Fenster-Drittel nicht mehr verschwindet, sondern nur noch flackert. Werde mal noch ein wenig herumprobieren ...

Dann danke ich euch erstmal für's testen und Kaeru Gaman für die hilfreichen Tipps!

Grüße,
Christian