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 :allright:

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