Seite 1 von 1
#PB_Window_SizeGadget - Seitenverhältnis sperren
Verfasst: 18.06.2015 20:02
von STARGÅTE
Hallo Leute,
kann mir jemand sagen, wie ich das Seitenverhältnis beim vergrößern des Fensters sperren kann, sodass das Fenster immer 2:1 hat egal ob man die Höhe oder die Breite ändert?
Der aktuelle Code funktiniert nur halb, nämlich wenn ich die Breite ändere (und auch nur mit flackern).
Die Höhe kann ich hier garnicht mehr ändern.
Möglicherwise müsste ich selbst die alte Breite/Höhe speichern, um zu prüfen, welche Dimension verändert wird um die andere anzupassen. Aber mann kann ja auch an der Ecke ziehen.
Code: Alles auswählen
Enumeration
#Window
EndEnumeration
Procedure Callback_SizeWindow()
ResizeWindow(#Window, #PB_Ignore, #PB_Ignore, #PB_Ignore, WindowWidth(#Window)*0.5)
EndProcedure
OpenWindow(#Window, 0, 0, 800, 400, "Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
BindEvent(#PB_Event_SizeWindow, @Callback_SizeWindow(), #Window)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: #PB_Window_SizeGadget - Seitenverhältnis sperren
Verfasst: 18.06.2015 21:26
von mk-soft
In der VM geht das leider nicht
Code: Alles auswählen
Enumeration
#Window
EndEnumeration
#WM_SIZING = $214
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Protected result
Protected *pos.rect
result = #PB_ProcessPureBasicEvents
*pos = lParam
Select uMsg
Case #WM_SIZING
Debug "Sizing"
;ResizeWindow(#Window, #PB_Ignore, #PB_Ignore, #PB_Ignore, (*pos\right - *pos\left) *0.5)
result = #True
Case #WM_SIZE
Debug "Size " + Str(wParam)
result = 0
EndSelect
ProcedureReturn result
EndProcedure
OpenWindow(#Window, 0, 0, 800, 400, "Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
SetWindowCallback(@WinCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: #PB_Window_SizeGadget - Seitenverhältnis sperren
Verfasst: 18.06.2015 22:42
von edel
Versuch es mal so:
Code: Alles auswählen
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Protected *rc.rect
Static ARatio1.f = 0
Static ARatio2.f = 0
If uMsg = #WM_SIZING
*rc = lParam
If ARatio1 = 0
ARatio1 = (*rc\right - *rc\left) / (*rc\bottom - *rc\top)
ARatio2 = (*rc\bottom - *rc\top) / (*rc\right - *rc\left)
EndIf
Select wParam
Case #WMSZ_BOTTOM, #WMSZ_TOP
*rc\right = (*rc\bottom - *rc\top) * ARatio1 + *rc\left
Default
*rc\bottom = (*rc\right - *rc\left) * ARatio2 + *rc\top
EndSelect
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(0, 0, 0, 800, 400, "Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
SetWindowCallback(@WinCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: #PB_Window_SizeGadget - Seitenverhältnis sperren
Verfasst: 18.06.2015 22:49
von mk-soft
@edel
Bei mir flackert unter (VM) XP nichts mehr. Da wird sich STARGÅTE freuen

Re: #PB_Window_SizeGadget - Seitenverhältnis sperren
Verfasst: 18.06.2015 23:02
von STARGÅTE
Danke euch beiden.
Das sieht ganz gut aus.
Einizges seltsammes Verhalten gibts jetzt nur noch an den oberen beiden Ecken.
Wenn ich dort ziehe (hoch/runter), wird das Fenster nur verschoben.
Da wParam aber 8 Werte hat, kann ich vermutlich auch die Ecken gesondert abfragen.
Edit: So gefällts mir:
Code: Alles auswählen
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Protected *rc.rect
Protected Length.i
Static ARatio1.f = 0
Static ARatio2.f = 0
If uMsg = #WM_SIZING
*rc = lParam
If ARatio1 = 0
ARatio1 = (*rc\right - *rc\left) / (*rc\bottom - *rc\top)
ARatio2 = (*rc\bottom - *rc\top) / (*rc\right - *rc\left)
EndIf
Select wParam
Case #WMSZ_BOTTOM, #WMSZ_TOP
Length = (*rc\right - *rc\left)
*rc\right + ((*rc\bottom - *rc\top) * ARatio1 - Length)/2
*rc\left - ((*rc\bottom - *rc\top) * ARatio1 - Length)/2
Case #WMSZ_LEFT, #WMSZ_RIGHT
Length = (*rc\bottom - *rc\top)
*rc\bottom + ((*rc\right - *rc\left) * ARatio2 - Length)/2
*rc\top - ((*rc\right - *rc\left) * ARatio2 - Length)/2
Case #WMSZ_BOTTOMLEFT, #WMSZ_BOTTOMRIGHT
*rc\bottom = (*rc\right - *rc\left) * ARatio2 + *rc\top
Case #WMSZ_TOPLEFT, #WMSZ_TOPRIGHT
*rc\top = -(*rc\right - *rc\left) * ARatio2 + *rc\bottom
EndSelect
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(0, 0, 0, 800, 400, "Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
SetWindowCallback(@WinCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver