OpenWindowedScreen()

Syntax

Ergebnis = OpenWindowedScreen(WindowID, x, y, Breite, Höhe [, AutoStretch, RightOffset, BottomOffset [, FlipModus]])
Beschreibung
Öffnet einen neuen Bildschirm entsprechend den angegebenen Parametern auf dem angegebenen Fenster, welches zuvor mittels OpenWindow() geöffnet werden muss. Vor der Verwendung dieses Befehls muss InitSprite() erfolgreich aufgerufen worden sein.

Der "Windowed Screen" (Bildschirm im Fenster) ist in der Lage, die Hardware-Beschleunigung in der gleichen Art und Weise wie der für Vollbildschirme gedachte Befehl OpenScreen() zu verwenden. Sobald ein solches Fenster geöffnet wurde, müssen die Fenster-Ereignisse mittels WindowEvent() verarbeitet werden, um ein korrektes Verhalten zu haben. Alle Ereignisse müssen verarbeitet werden, bevor die Puffer getauscht werden (siehe die Beispiele unten).

Parameter

WindowID Das für das Erstellen des Bildschirm zu verwendende Fenster. WindowID() kann verwendet werden, um eine gültige WindowID zu erhalten.
x, y Die Position des Bildschirms im angegebenen Fenster, in Pixel.
Breite, Höhe Die Bildschirmauflösung, in Pixel.
AutoStretch (optional) Ist dieser auf #True gesetzt, dann wird die Größe des Bildschirmbereichs automatisch angepasst (und der Inhalt auf die neue Bildschirm-Größe gezoomt), wenn sich die Fenstergröße ändert.
RightOffset, BottomOffset (optional) Definieren den rechten und unteren Rand des Fensters, in Pixel (für eine Statusleiste zum Beispiel).
FlipModus (optional) Legt die beim Vertauschen ("Flippen") der Puffer verwendeten Methoden zur Synchronisation des Bildschirms fest (auch bekannt als 'Vertikal-Blank-Synchronisation'). Dieser kann einen der folgenden Werte annehmen:
   #PB_Screen_NoSynchronization    : Synchronisation ausschalten
   #PB_Screen_WaitSynchronization  : Synchronisation einschalten   (Standard-Wert)
   #PB_Screen_SmartSynchronization : Synchronisation einschalten, mit einer CPU-schonenderen Routine, wenn das Programm
                                     nicht die gesamte CPU-Rechenzeit benötigt (nur bei Vollbildschirm)
Das Warten auf die Bildschirm-Synchronisation ermöglicht einen perfekten Puffer-"Tausch" (Flip ohne "Ausreißer" oder andere sichtbare Artefakte), da der Flip erst nach dem vollständigen Zeichnen des Bildschirms (und wenn sich der "Screen-Spot" außerhalb des sichtbaren Bildschirmbereichs befindet) ausgeführt wird. Dies verknüpft auch die Flip-Frequenz (Häufigkeit des Puffer-Tauschs) mit dem aktuellen Bildschirm-Refresh ("Auffrischung"), z.B. bei einem 60 Hz Bildschirm sind maximal 60 Flips pro Sekunde möglich.

Der geöffnete Bildschirm wird mit 2 Videopuffern erstellt, um das speziell für Spiele entwickelte "Double-Buffering" (Doppelpufferung) zu ermöglichen. Die Puffer können mittels dem FlipBuffers() Befehl manipuliert werden.

Rückgabewert

Ein Wert ungleich Null, wenn der Bildschirm erfolgreich geöffnet wurde, andernfalls Null.

Anmerkungen

Nur ein "Windowed Screen" (also Bildschirm im/auf dem Fenster) kann zur gleichen Zeit geöffnet sein. Die Bildschirm-Dimensionen können nicht größer als das Fenster sein, andernfalls können Artefakte auftreten.

Beispiel: Feste Bildschirmgröße mit Gadgets

  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite environment!", 0)
    End
  EndIf
  
  If OpenWindow(0, 0, 0, 220, 160, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 170, 135, 45, 20, "Quit")

    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf
  
  direction = 2
  Repeat
    ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
    ;
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
  ForEver

Beispiel: Bildschirm mit aktiviertem Auto-Stretch und Bottom-Offset

  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite environment!", 0)
    End
  EndIf
  
  If OpenWindow(0, 0, 0, 420, 200, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
    CreateStatusBar(0, WindowID(0))
      AddStatusBarField(420)
      
    StatusBarText(0, 0, "Automatically zoomed screen area when changing window size...")
    
    If OpenWindowedScreen(WindowID(0), 0, 0, 420, 200, #True, 0, 20)
  
      CreateSprite(0, 50, 50) ; Erstellt ein leeres Sprites, dies wird komplett schwarz sein
        
      Repeat
        ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
        ;
        Repeat
          Event = WaitWindowEvent(10)
          
          If Event = #PB_Event_CloseWindow
            End
          EndIf
        Until Event = 0
        
        FlipBuffers()
        ClearScreen(RGB(0, 0, 200)) ; Ein blauer Hintergrund
        
        DisplaySprite(0, 10, 10)  ; Darstellung unserer schwarzen Box in der linken oberen Ecke
        DisplaySprite(0, 260, 10) ; Darstellung unserer schwarzen Box in der rechten oberen Ecke
      ForEver
      
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
    EndIf
  EndIf


Für ein detaillierteres Beispiel schauen Sie in

Beispiel

WindowedScreen.pb

Siehe auch

OpenScreen()

Unterstützte OS

Alle

<- OpenScreen() - Screen Inhaltsverzeichnis - ScreenDepth() ->