ResizeGadget nur vertikal

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bax
Beiträge: 20
Registriert: 16.08.2005 21:45
Wohnort: Erlensee

ResizeGadget nur vertikal

Beitrag 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.
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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

-.-"
Benutzeravatar
Bax
Beiträge: 20
Registriert: 16.08.2005 21:45
Wohnort: Erlensee

Beitrag 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?
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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.
-.-"
Benutzeravatar
Bax
Beiträge: 20
Registriert: 16.08.2005 21:45
Wohnort: Erlensee

Beitrag 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!
hanshampel
Beiträge: 36
Registriert: 11.09.2004 18:18
Wohnort: Hohenkirchen
Kontaktdaten:

Beitrag 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
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

> kann das jemand bestätigen oder erklären?
Du hast vergessen den Fensterrand zu addieren (die 8 Pixel).
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Seit irgendeiner 4.x Version geht das übrigens über den Befehl WindowBounds(), sogar OS übergreifend (angeblich).
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

HeX0R hat geschrieben:Seit irgendeiner 4.x Version geht das übrigens über den Befehl WindowBounds(), sogar OS übergreifend (angeblich).
seit 4.3
Win11 x64 | PB 6.20
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

> WindowBounds()

Die Funktion ist wirklich gut, wollte schon lange sowas :allright:.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten