Seite 1 von 1

OpenWindowScreen auf Continergadget - Geht das mit Linux und

Verfasst: 07.07.2011 00:33
von GPI
Mac?

Problem: Ich möchte ein Windowed-Screen haben und das Fenster soll größenveränderbar sein. Mein Problem ist, das der Screen sein Seitenverhältnis beibehalten soll, so das bspw. ein Kreis immer noch ein Kreis ist. - notfalls soll der Screen halt einen Rand haben (wie bspw. Kinofilme in Fernsehen).

Die unelegante Methode ist, den Screen zu schließen und einen neuen zu eröffnen. Dabei muss ich aber bspw. alle Sprites neu laden - das will ich vermeiden.

Unter Windows kann ich das einfach lösen, indem ich den Screen nicht in ein Fenster, sondern in ein Containergadget öffne. Für Windows ist es ja das ein und das selbe. Nur, läuft das dann auch Mac und Linux?

hier ein Beispielcode:

Code: Alles auswählen

#screenw=320
#screenh=200
#win_main=0

#gadget_screen=1

Procedure ResizeContainer()
  menuheight=MenuHeight()
  w= WindowWidth(#win_main)
  h= WindowHeight(#win_main) - MenuHeight
  
  If Int(#ScreenW * h/#ScreenH) <= w
    sw=Int(#ScreenW * h/#ScreenH)
    sh=h
  Else
    sw=w
    sh=Int(#ScreenH * w/#ScreenW)
  EndIf
  sx=Int(w-sw)/2
  sy=Int(h-sh)/2+MenuHeight()
  
  ResizeGadget(#gadget_screen,sx,sy,sw,sh)
EndProcedure

  

If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
  
  
  
  If OpenWindow(#win_main, 0, 0, 320, 200, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
    ;CreateStatusBar(0, WindowID(0))
    ;  AddStatusBarField(320)
    ContainerGadget(1, 0, 0, 320, 200 ,#PB_Container_BorderLess ) 

    ;StatusBarText(0, 0, "Automatically zoomed screen area when changing window size...")
    
    If OpenWindowedScreen(GadgetID(1), 0, 0, 320, 200, 1, 0, 00)
  
      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 = WindowEvent():Delay(0)
          If event=#PB_Event_SizeWindow
            ResizeContainer()
          ElseIf 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 

Re: OpenWindowScreen auf Continergadget - Geht das mit Linux

Verfasst: 07.07.2011 00:56
von NicTheQuick
Also unter Linux läuft dein Code. Blauer Hintergrund und zwei schwarze Boxen. Wenn ich das Fenster resize, rückt der Container allerdings nach unten. Vermutlich, weil du da irgendwas mit der Menühöhe rumrechnest. Aber er passt sich sonst immer richtig an. Der blaue Screen im Container behält allerdings seine Größe. Also auf Autostretch wird nicht reagiert.

Re: OpenWindowScreen auf Continergadget - Geht das mit Linux

Verfasst: 07.07.2011 01:29
von GPI
hmmm.... kannst du das mal unter windows laufen lassen und vergleichen (wine oder so?) - unter windows verändert sich der blaue screen je nach fenstergröße. Er wird halt seitenverhältnisgerecht vergrößert und stößt immer an den Fensterrand an - nur oben halt nicht, da ist platz für das Menü ;)

Re: OpenWindowScreen auf Continergadget - Geht das mit Linux

Verfasst: 07.07.2011 01:56
von NicTheQuick
Windows mit installiertem PB habe ich gerade nicht da und bin jetzt auch zu faul das einzurichten. Muss gerade Mathe machen. :wink:

Re: OpenWindowScreen auf Continergadget - Geht das mit Linux

Verfasst: 07.07.2011 10:35
von GPI