ResizeGadget nur vertikal
ResizeGadget nur vertikal
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.
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.
- Green Snake
- Beiträge: 1394
- Registriert: 22.02.2005 19:08
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?
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
-.-"
Hi Green Snake,
das war genau das was ich gesucht habe
. 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
).
Habs noch ein bisschen angepasst:
Funktioniert einwandfrei.
Nur das 'Resizen' ist etwas umständlich, aber wenn man das so macht:
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?
das war genau das was ich gesucht habe

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

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
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))
...
...
Oder kann man das mit einer eleganteren Lösung (als im Code oben) verhindern?
- Green Snake
- Beiträge: 1394
- Registriert: 22.02.2005 19:08
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!
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!
-
- Beiträge: 36
- Registriert: 11.09.2004 18:18
- Wohnort: Hohenkirchen
- Kontaktdaten:
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)
(..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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
> kann das jemand bestätigen oder erklären?
Du hast vergessen den Fensterrand zu addieren (die 8 Pixel).
Du hast vergessen den Fensterrand zu addieren (die 8 Pixel).
Windows 10 Pro, 64-Bit / Outtakes | Derek
- 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:
Seit irgendeiner 4.x Version geht das übrigens über den Befehl WindowBounds(), sogar OS übergreifend (angeblich).
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
> WindowBounds()
Die Funktion ist wirklich gut, wollte schon lange sowas
.
Die Funktion ist wirklich gut, wollte schon lange sowas

Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86