#PB_Window_SizeGadget - Seitenverhältnis sperren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

#PB_Window_SizeGadget - Seitenverhältnis sperren

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: #PB_Window_SizeGadget - Seitenverhältnis sperren

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: #PB_Window_SizeGadget - Seitenverhältnis sperren

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: #PB_Window_SizeGadget - Seitenverhältnis sperren

Beitrag von mk-soft »

@edel

Bei mir flackert unter (VM) XP nichts mehr. Da wird sich STARGÅTE freuen :allright:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: #PB_Window_SizeGadget - Seitenverhältnis sperren

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten