Seite 1 von 2

Vollbild und Taskswitch

Verfasst: 28.12.2009 13:41
von Hyper
Hallo Gefährten,

unten ist der Quelltext aus der Hilfe zu KeyboardInkey(). Wenn das Programm läuft und ich wechsle mit ALT+TAB zu einer anderen Anwendung und wieder zurück, stürzt das Programm immer ab.
Fehlermeldung Debugger: Zeile 17 (If StartDrawing(ScreenOutput())):
The specified output is NULL (0 value).
Meine Frage: Wie muss man ein PB-Vollbildprogramm machen, damit man den Task normal switchen kann?

Außerdem sieht man das Programm auch nicht als Task im Taskmanager (nur unter Prozesse).

Code: Alles auswählen

If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Repeat
      FlipBuffers()
      ClearScreen(RGB(0, 0, 0))
      
      ExamineKeyboard()
      FullText$ + KeyboardInkey()  ; fügt das nächste Zeichen zum aktuellen Text (sofern vorhanden) hinzu
      
      ; Wenn wir die 'Backspace'-Taste drücken, löschen wir das letzte Zeichen
      ;
      If KeyboardReleased(#PB_Key_Back)  
        FullText$ = Left(FullText$, Len(FullText$)-1)
      EndIf

      ; Ergebnis darstellen
      ;
      If StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(128, 255, 0))
        DrawText(20, 20, "Gib einfach etwas Text ein...:")
        DrawText(20, 40, FullText$)
        StopDrawing()
      EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 14:06
von Shadow-Gamer
1. Guck dir mal IsScreenActive an

2. Gib deinem OpenScreen mal einen anderen Namen

Greeeeetts

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 14:28
von Hyper
Hallo Shadow-Gamer,

danke!

Thema Programmname im Taskmanager ist erledigt.

Ich habe jetzt nach Repeat eingefügt:

Code: Alles auswählen

    If IsScreenActive() = #False
      Continue
    EndIf
Komme jetzt aber nicht mehr zurück zum Bild!? Da muss es doch ein Pattern geben...

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 16:02
von kswb73
Am einfachsten geht es wenn du deine ganzen Renderteil ohne FlipBuffers() mit If IsScreenActive() ... EndIf einklammerst:

Code: Alles auswählen

 If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Repeat
      FlipBuffers()
      If IsScreenActive()
      ClearScreen(RGB(0, 0, 0))
     
      ExamineKeyboard()
      FullText$ + KeyboardInkey()  ; fügt das nächste Zeichen zum aktuellen Text (sofern vorhanden) hinzu
     
      ; Wenn wir die 'Backspace'-Taste drücken, löschen wir das letzte Zeichen
      ;
      If KeyboardReleased(#PB_Key_Back) 
        FullText$ = Left(FullText$, Len(FullText$)-1)
      EndIf

      ; Ergebnis darstellen
      ;
      If StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(128, 255, 0))
        DrawText(20, 20, "Gib einfach etwas Text ein...:")
        DrawText(20, 40, FullText$)
        StopDrawing()
      EndIf
    EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf 
Du solltest dir generell angewöhnen IsScreenActive() zu verwenden, da du sonst eben dein Vollbild nicht minimieren kannst, wenn du 2ddrawing verwendst.

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 16:10
von Hyper
Hallo kswb73,

das ist ok, Danke, aber ich komme nach einem Task-Wechsel nicht zurück, um im Vollbild-Programm weiterzumachen...

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 16:34
von hörmi
Hier mal ein Vorschlag von mir:

Code: Alles auswählen

If InitSprite() And InitKeyboard() And OpenScreen(800,600,16,"")
    Repeat
      If IsScreenActive()
      FlipBuffers()
      ClearScreen(RGB(0, 0, 0))
     
      ExamineKeyboard()
      FullText$ + KeyboardInkey()  ; fügt das nächste Zeichen zum aktuellen Text (sofern vorhanden) hinzu
     
      ; Wenn wir die 'Backspace'-Taste drücken, löschen wir das letzte Zeichen
      ;
      If KeyboardReleased(#PB_Key_Back) 
        FullText$ = Left(FullText$, Len(FullText$)-1)
      EndIf

      ; Ergebnis darstellen
      ;
      If StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(128, 255, 0))
        DrawText(20, 20, "Gib einfach etwas Text ein...:")
        DrawText(20, 40, FullText$)
        StopDrawing()
      EndIf
    Else
    
    CloseScreen()
    OpenWindow(0,0,0,0,0,"Screen",#PB_Window_Minimize)
    
    Repeat
      Event=WaitWindowEvent()
    Until Event=#PB_Event_ActivateWindow
    CloseWindow(0)
    OpenScreen(800,600,16,"")
    
    EndIf
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 16:46
von Hyper
Hallo hörmi,

vielen Dank, so klappt es!
Weiß nur noch nicht richtig warum... So müssten dann ja alle Anwendungen gestrickt sein, welche es gestatten aus dem Vollbildmodus in andere Programme umzuschalten...

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 17:00
von Kaeru Gaman
also, ich finde den Vorschlag von Hörmi äußerst konterproduktiv.
wenn man einen screen zu macht und später wieder auf, muss man sämtliche sprites neu laden.
damit wird jeder Nutzen von Alt-Tab komplett negiert, da kann man gleich ausmachen und neu starten.

viele Fullscreen-Anwendungen heutzutage sind keine echten Fullscreens sondern maximierte WindowedScreens.
mit einem WindowdScreen ist das focus-handling einfacher.
http://www.purebasic.fr/german/viewtopic.php?t=11280


was das aktuelle Problem hier betrifft, es besteht möglicher Weise zur Zeit noch ein Bug betreffs IsScreenActive.
http://www.purebasic.fr/english/viewtop ... =3&t=40439
http://www.purebasic.fr/english/viewtop ... 13&t=40344

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 17:16
von Hyper
Hallo Kaeru Gaman,

super, da wird mir jetzt einiges klarer! Offenbar haben andere an dem Thema ebenfalls schon geknobelt...

Re: Vollbild und Taskswitch

Verfasst: 28.12.2009 17:21
von hörmi
@Kaeru Gaman: hatte ich vergessen, dass die sprites alle neu geladen werden müssen
aber mal nur so als frage wie machen die fullscreens das dann wenn sie eine andere auflösung verwenden?