Seite 1 von 2

ResizeGadget nur vertikal

Verfasst: 04.01.2007 23:15
von Bax
Hi,

für ein Spiel habe ich ein recht großes Spielfeld (geringe Breite aber recht hoch). So passt es bei kleineren Bildschirmauflösungen nicht vollständig auf den Bildschirm. Damit man trotzdem eine Übersicht hat, gibt es ein ScrollAreaGadget, was auch gut funktioniert - So weit so gut.

Nun würde ich gerne noch zwecks besserer Übersicht beim Arbeiten, Chatten nebenbei das Fenster 'resizable' (mit #PB_Window_SizeGadget) machen.

Allerdings so, dass nur die Höhe - nicht die Breite verändert werden kann.
Wie kann man so etwas umsetzen?

PS: Über die Suchfunktion bin ich nicht fündig geworden.

Verfasst: 04.01.2007 23:52
von Green Snake
Hab hier mal diesen Code geschrieben. (Hoffe ist richtig so)
Kommt darauf an, wie du dein Spiel gestaltet hast, aber wäre es nicht besser, wenn du das Scrolling intern in einem Screen regeln würdest?

Code: Alles auswählen



Procedure CB(hWnd.l,Message.l,wParam.l,lParam)
  Protected *MinMax.MINMAXINFO
  
  
  Select Message
    
    Case #WM_GETMINMAXINFO
      *MinMax = lParam
      *MinMax\ptMaxTrackSize\x = 400
    
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

OpenWindow(0,100,100,400,400,"",#PB_Window_SystemMenu | #PB_Window_SizeGadget)
SetWindowCallback(@CB())

Repeat
  
Until WaitWindowEvent() = #PB_Event_CloseWindow


Verfasst: 05.01.2007 13:32
von Bax
Hi Green Snake,

das war genau das was ich gesucht habe :D. Danke.

Scrolling hab ich an sich schon drin, also so, dass man mit einem ScrollAreaGadget das Feld verschieben kann.

Wahrscheinlich hast du das gemeint. Hier auch noch mal der Code (dürften keine Fragen mehr offen bleiben :wink:).

Habs noch ein bisschen angepasst:

Code: Alles auswählen

; Dummy-Bild
CreateImage(0, 279, 781)
  StartDrawing(ImageOutput(0))
    For i=1 To 77
      Line(10, i*10, 259, 0, $FFFFFF)
    Next
  StopDrawing()


; zwei verschiedene 'Fensterzustaende'
Procedure CB_1(hWnd.l,Message.l,wParam.l,lParam)
  Protected *MinMax.MINMAXINFO
 
  Select Message

    Case #WM_GETMINMAXINFO
      *MinMax = lParam
      *MinMax\ptMinTrackSize\x = 304
      *MinMax\ptMaxTrackSize\x = 304
      *MinMax\ptMinTrackSize\y = 100
      *MinMax\ptMaxTrackSize\y = 815
      
  EndSelect
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure CB_2(hWnd.l,Message.l,wParam.l,lParam)
  Protected *MinMax.MINMAXINFO
 
  Select Message

    Case #WM_GETMINMAXINFO
      *MinMax = lParam
      *MinMax\ptMinTrackSize\x = 287
      *MinMax\ptMaxTrackSize\x = 287
      *MinMax\ptMinTrackSize\y = 100
      *MinMax\ptMaxTrackSize\y = 815
      
  EndSelect
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


; Fenster mit Gadgets
OpenWindow(0, 0, 0, 296, 500, "Spieloberflaeche", #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget)
  CreateGadgetList(WindowID(0))
    ScrollAreaGadget(0, 0, 0, 296, WindowHeight(0), 279, 781, 1, #PB_ScrollArea_BorderLess)
    ImageGadget(1, 0, 0, 279, 781, ImageID(0))

  SetWindowCallback(@CB_1())


; Event-Schleife
resize = -1

Repeat
  Select WaitWindowEvent()
  
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_SizeWindow
      If (resize = 1)
        ResizeGadget(0, #PB_Ignore, #PB_Ignore, #PB_Ignore, 819)
        SetWindowCallback(@CB_2())
        ResizeWindow(0, #PB_Ignore, #PB_Ignore, 281, #PB_Ignore)
        resize + 1
      EndIf
      If (resize <= 0)
        resize + 1
      EndIf
      
    Case #WM_LBUTTONUP
      If (resize)
        ResizeGadget(0, #PB_Ignore, #PB_Ignore, #PB_Ignore, WindowHeight(0))
        If (WindowHeight(0) = 781)
          SetWindowCallback(@CB_2())
          ResizeWindow(0, #PB_Ignore, #PB_Ignore, 281, #PB_Ignore)
        Else
          SetWindowCallback(@CB_1())
          ResizeWindow(0, #PB_Ignore, #PB_Ignore, 296, #PB_Ignore)
        EndIf
        resize = 0
      EndIf
      
  EndSelect
ForEver
Funktioniert einwandfrei.
Nur das 'Resizen' ist etwas umständlich, aber wenn man das so macht:

Code: Alles auswählen

...
  Case #PB_Event_SizeWindow
    ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0))
    ...
...
Hat man das Problem, dass wenn die Fenstergröße verändert wird die Gadgets beim Anpassen flackern.

Oder kann man das mit einer eleganteren Lösung (als im Code oben) verhindern?

Verfasst: 05.01.2007 13:47
von Green Snake
>>Wahrscheinlich hast du das gemeint.
Nein.

Ich meinte, dass du das gesammte Scrolling in einem Windowed - Screen regelst, und das ScrollAreaGadget weg lässt.

Da hast du auch den Vorteil, dass es nicht flackert.

Verfasst: 05.01.2007 15:21
von Bax
Hi Green Snake,

das mit dem Scrollen hätte ich so noch geregelt, aber wenn später die Spielmechanik dazukommt, wird es ja auch komplizierter.
Dann ist ein WindowedScreen eindeutig übersichtlicher / einfacher zu handhaben.

Was für mich dagegen gesprochen hat, ist die etwas höhere Systemauslastung. - Habe das eben mal getestet ist gar nicht so viel. Auch den Bildschirm mit der Maus zu verlassen und wieder zu betreten klappt gut. Scrollen geht auch einfach.

Von daher werde ich erstmal eine Version mit WindowedScreen machen, und später vielleicht noch eine zweite Variante ohne Screen.

thx for help!

Verfasst: 11.01.2009 22:21
von hanshampel
wir haben hier ein problem: beim verschieben und resizen wird das fenster einmalig um ein paar pixel in der breite verkleinert, obwohl wir den selben wert (400) verwenden. mit 8 pixel dazu funktioniert es ohne sprung. kann das jemand bestätigen oder erklären?
(..Windows 2000)

Code: Alles auswählen

Procedure CB(hWnd.l,Message.l,wParam.l,lParam)
  Protected *MinMax.MINMAXINFO
 
 
  Select Message
   
    Case #WM_GETMINMAXINFO
      *MinMax = lParam
      *MinMax\ptMaxTrackSize\x = 400 ; +8
      *MinMax\ptMinTrackSize\x = 400 ; +8
  EndSelect
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

OpenWindow(0,100,100,400,400,"",#PB_Window_SystemMenu | #PB_Window_SizeGadget)
SetWindowCallback(@CB())

Repeat
 
Until WaitWindowEvent() = #PB_Event_CloseWindow

Verfasst: 12.01.2009 17:10
von Fluid Byte
> kann das jemand bestätigen oder erklären?
Du hast vergessen den Fensterrand zu addieren (die 8 Pixel).

Verfasst: 12.01.2009 23:35
von HeX0R
Seit irgendeiner 4.x Version geht das übrigens über den Befehl WindowBounds(), sogar OS übergreifend (angeblich).

Verfasst: 13.01.2009 17:28
von Andesdaf
HeX0R hat geschrieben:Seit irgendeiner 4.x Version geht das übrigens über den Befehl WindowBounds(), sogar OS übergreifend (angeblich).
seit 4.3

Verfasst: 13.01.2009 17:29
von cxAlex
> WindowBounds()

Die Funktion ist wirklich gut, wollte schon lange sowas :allright:.