Seite 1 von 2

WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 01:31
von Kaeru Gaman
so, ich hab mal etwas rumprobiert, und mir ein bissel von ts, Kiffi und TomS helfen lassen ( http://www.purebasic.fr/german/viewtopi ... =6&t=21903 )
und ne kleine Demo gecoded, wie man ein Fenster mit WindowedScreen Maximieren und Wiederherstellen kann.
die Herausforderung dabei war, im Fenstermodus die Titelleiste zu haben und im Maximierten Zustand verschwinden zu lassen.
wenn man jetzt zusätzlich zum Maximieren noch die Auflösung des Desktop ändert, hat man einen "halb"-echten Fullscreen zum hin- und her-schalten.

Code: Alles auswählen

#Window = 0

EnableExplicit

Global Dim Border.i(1)

Dim Schlange.POINT (31)

Dim StatusText.s(2)
StatusText(0) = "Fenster"
StatusText(1) = "Maximiert"

Global.l Win_Width, Win_Height
Global.l Win_X, Win_Y
Global.l Desk_Width, Desk_Height

Global.d Fact_X, Fact_Y

Define.l Scrn_Width, Scrn_Height
Define.l WMX, WMY, MX, MY
Define.l BorderFlag = 0
Define.l EXIT, Event
Define.l Counter, n, t

ExamineDesktops()
  Desk_Width  = DesktopWidth(0)
  Desk_Height = DesktopHeight(0)

InitSprite()
InitKeyboard()

Procedure ChangeSize( Flag.l )
  Select Flag
    Case 0 
      SetWindowLongPtr_(WindowID(#Window), #GWL_STYLE, Border(Flag))
      SetWindowState( #Window, #PB_Window_Normal )
      ResizeWindow( #Window, Win_X, Win_Y, Win_Width, Win_Height )
    Case 1
      Win_X = WindowX(#Window)
      Win_Y = WindowY(#Window)
      SetWindowLongPtr_(WindowID(#Window), #GWL_STYLE, Border(Flag))
      SetWindowState( #Window, #PB_Window_Maximize )
      ExamineDesktops()
        Desk_Width  = DesktopWidth(0)
        Desk_Height = DesktopHeight(0)
  EndSelect
EndProcedure

Border(0) = #WS_CLIPSIBLINGS | #WS_VISIBLE | #WS_CAPTION | #WS_SYSMENU
Border(1) = #WS_CLIPSIBLINGS | #WS_VISIBLE | #WS_POPUP

Scrn_Width  = 1024
Scrn_Height =  768
Win_Width   = 1024
Win_Height  =  768

Fact_X = Desk_Width  / Scrn_Width
Fact_Y = Desk_Height / Scrn_Height

OpenWindow( #Window, 0,#PB_Ignore, Win_Width, Win_Height, "WindowedScreen Maximize Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
  Win_X = WindowX(#Window)
  Win_Y = WindowY(#Window)

OpenWindowedScreen( WindowID(#Window), 0,0, Scrn_Width,Scrn_Height, #True, 0, 0 )

For n=0 To 32
  Counter +1
  Schlange(0)\x = 512 + 256 * Sin( Counter / 20 )
  Schlange(0)\y = 384 + 192 * Cos( Counter / 15 )
  For t = 31 To 1 Step -1
    Schlange(t) = Schlange(t-1)
  Next
Next

Repeat
  Repeat
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow
      EXIT = 1
    EndIf
  Until Event = #Null

  WMX = WindowMouseX(0)
  WMY = WindowMouseY(0)
  If BorderFlag = 1
    MX = WMX / Fact_X
    MY = WMY / Fact_Y
  Else
    MX = WMX
    MY = WMY
  EndIf

  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_F11) And BorderFlag <> 0
    BorderFlag = 0
    ChangeSize( BorderFlag )
  EndIf
  If KeyboardPushed(#PB_Key_F12) And BorderFlag <> 1
    BorderFlag = 1
    ChangeSize( BorderFlag )
  EndIf
  If KeyboardPushed( #PB_Key_Escape )
    EXIT = 1
  EndIf

  Counter +1
  If Counter > 100000 * #PI
    Counter = 0
  EndIf

  ClearScreen( $201008 )
  StartDrawing(ScreenOutput())

    Schlange(0)\x = 512 + 256 * Sin( Counter / 20 )
    Schlange(0)\y = 384 + 192 * Cos( Counter / 15 )
    For t = 31 To 1 Step -1
      Schlange(t) = Schlange(t-1)
      Circle( Schlange(t)\x, Schlange(t)\y, 2*t, RGB( 0, 255 - 8*t, 255 - 8*t ) )
    Next

    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText( 1,  1, "[F11] Wiederherstellen    [F12] Maximieren    [ESC] Beenden", $0FF0FF )
    DrawText( 1, 25, "Status: " + StatusText( BorderFlag ), $0FF0FF )
    DrawText( 1, 49, "Position: " + Str(MX) + ", " + Str(MY), $0FF0FF )
  StopDrawing()
  FlipBuffers()
Until EXIT

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 13:08
von RSBasic
Achso jetzt versteh ich das Ganze, was das überhaupt bringen soll.

Der Code und die Idee ist :allright:

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 13:10
von Kaeru Gaman
Achso jetzt versteh ich das Ganze, was das überhaupt bringen soll.
:?: wieso, wie hattest du es denn vorher aufgefasst?

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 13:31
von c4s
Was ich an Programmen die dieses machen absolut nicht leiden ist, dass die Icons auf dem Desktop anders angeordnet.
Irgendwie denkt Windows wohl, man hätte die Desktop-Auflösung geändert.

Aber ansonsten danke - Ich habe mich schön öfters gewundert wie Spiele diesen "unechten" Vollbildmodus hinbekommen.

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 13:34
von RSBasic
Du wolltest in dem anderen Thread nur, dass der Fensterrahmen ausgeblendet und wieder eingeblendet wird.
Von "Vollbild" habe ich im Thread nicht gelesen/gesehen.
Ich muss zugeben, ich hab nicht alle Beiträge in dem Thread gelesen, daher dachte/wusste ich nur, dass du nur den Rahmen ein- und ausblenden möchtest, nur halt ohne Grund.
Aber jetzt erst sehe ich, dass es jetzt Sinn macht, da du ja bei einem Vollbild ja kein Fensterrahmen mehr brauchst und deshalb diesen ausblendest. :wink:

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 14:22
von Kaeru Gaman
c4s hat geschrieben:Was ich an Programmen die dieses machen absolut nicht leiden ist, dass die Icons auf dem Desktop anders angeordnet.
öhm... das liegt dann aber an einem unfähigen Programmierer.

wenn man die ChangeDisplaySettings Funktion mit dem Flag #CDS_FULLSCREEN aufruft,
werden die Symbole auf dem Desktop nicht angerührt.

und selbstverständlich werden meine Programme das berücksichtigen.


@Ray:
achso... yo genau, dafür war dieser thread. mit ein bissel Hilfe gings einfach leichter von der Hand,
auch wenn ich im Endeffekt nicht drum herum kam, mir sämtliche #WS_ Konstanten debuggen zu lassen und die Bits zu vergleichen.

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 19:05
von c4s
Komisch ich hatte jetzt ein bisschen mit #CDS_FULLSCREEN als BorderFlag rumprobiert, da dieser Code bei mir die Icons verschoben hatte. Es tat sich dann aber nichts mehr (kein maximieren). Als ich den Flag dann wieder entfernte, funktionierte das Maximieren plötzlich ohne meine Icons zu verschieben.
Seltsam, seltsam.

Edit:
Oh mir ist gerade aufgefallen, dass die Flags ja gar nicht direkt übergeben werden sondern aus dem Array kommen.

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 19:14
von Kaeru Gaman
c4s hat geschrieben:Komisch ich hatte jetzt ein bisschen mit #CDS_FULLSCREEN als BorderFlag rumprobiert
hü? ... als Border Flag?

#CDS_FULLSCREEN ist ein Flag für ChangeDisplaySettings

Code: Alles auswählen

; Mode: #CDS_TEST oder #CDS_FULLSCREEN
Procedure.i Change_Desktop(Width.l, Height.l, Mode.l)
  Protected dmScreenSettings.DEVMODE
  Protected Check 
  dmScreenSettings\dmSize = SizeOf(dmScreenSettings)
  dmScreenSettings\dmPelsWidth = Width
  dmScreenSettings\dmPelsHeight = Height
  dmScreenSettings\dmFields = #DM_PELSWIDTH | #DM_PELSHEIGHT
  Check = ChangeDisplaySettings_(@dmScreenSettings, Mode)
  ProcedureReturn Check
EndProcedure
ich hab jetzt aber grad das problem, dass es garnicht funktioniert, dynamisch die Auflösung zu ändern, weil das den Screen kaputt macht.

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 20:08
von c4s
Achso ich dachte du beziehst dich auf deinen Code, da genau mit dem die Icons bei mir verschoben wurden.

Was ist dann damit:
das liegt dann aber an einem unfähigen Programmierer.
Bist du ein unfähiger Programmierer? ;)

Re: WindowedScreen Maximieren und zurück

Verfasst: 20.02.2010 20:13
von Kaeru Gaman
also, du sagtest heut mittag
Was ich an Programmen die dieses machen absolut nicht leiden ist, dass die Icons auf dem Desktop anders angeordnet.
... wobei ich annahm, das bezieht sich auf Programme, die die Auflösung umschalten udn dabei die Icons verschieben.

wenn man nämlich ChangeDisplaySettings benutzt OHNE das FULLSCREEN Flag, dann werden tatsächlich die Icons neu angeordnet.
das Fullscreen Flag ist ausdrücklich dazu da, um das neu Anordnen der Icons zu verhindern.


bei meinem Code den ich hier veröffentlicht habe, ist es überhaupt nicht möglich, dass die Icons verschoben werden, weil die Auflösung überhaupt nicht geändert wird.
wenn das bei dir doch passiert, hast du irgendwas ganz seltsames an deinem system.

klingt komisch, ist aber so.
ich maximiere lediglich ein Fenster, sonst nix.
das kann unmöglich eine Auswirkung auf die Icons haben.

und eben um sechse sagtest du ja auch
c4s hat geschrieben:Als ich den Flag dann wieder entfernte, funktionierte das Maximieren plötzlich ohne meine Icons zu verschieben.
also, es hat von Anfang an nicht an meinem Code gelegen, das war nur ein zufälliges zeitliches Zusammentreffen mit einem anderen Effekt der deine Icons verbuxelt hat.