Page 1 of 1

AutResiz()

Posted: Tue Nov 28, 2006 9:19 am
by FiveWiDi
Código fuente de la función que utilizo para dimensionar mis ventanas/diálogos/controles.

Seguramente se puede perfeccionar mucho pero a mi me vale.

/* ******************** */
#Include "FiveWin.ch"

/*
Los parámetros recibidos son:

lAutoresize: permite prescindir de la funcionalidad de esta función; permitiendo
de esta manera que la aplicación pueda tener un flag que
permita/deniegue el autoredimensionado de las pantallas. 03/03/2006.
nWhatSize: permite forzar el redimensionamiento a unos valores concretos;
permitiendo de esta manera que la aplicación pueda tener un valor
al cual redimensionar las pantallas. 03/03/2006.
oWnd: Objeto/ventana/diálogo/control a ser redimensionado.
nResolution: Número que identifica que resolución tenía la pantalla en la cual
se diseñó el objeto.
Este valor puede ser negativo, hecho que se interpretará como que
la ventana ya ha estado redimensionada previamente y se pretende
redimensionarla a su valor original. Esta característica es útil
para provocar que un control (o ventana/dialogo) concreto se le
devuelva su tamaño original según su valor de diseño. 03/03/2006
lRepaint: Indicador de si debe repintarse el objeto una vez redimensionado.

Esta función permitirá que una aplicación desarrolada en un PC con una resolución
de pantalla de por ejemplo 1024 x 768 (nResolution valdría en este caso 3), se vea
redimensionada proporcionalmente en un PC con una resolución diferente, ya sea mayor
o menor.

A falta de perfeccionar el código, se comprueba solamente la variación de la anchura
de la resolución de la pantalla para aplicar la variación del tamaño, aunque cuando
ello se realiza se hace tanto en la anchura como en la altura.
Ahora se comprueba la altura. 09/12/2005.

Esta función está orientada a ser utilizada en el evento ON INIT del ACTIVATE
de las WINDOW y DIALOG con un valor fijo de lRepaint a .T. o sin él.
Además también puede utilizarse directamente sobre un control definido posteriormente
a la ACTIVACIÓN de su contenedor ya sea éste WINDOW o DIALOG, con la salvedad que
lRepaint debe valer .T. para forzar su repintado.

Ejemplos de uso:

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
Se redimensiona toda la ventana oWnd y sus controles.

ACTIVATE oWnd ON INIT AutoResiz( .T., 0, oWnd, 3 )

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
Se redimensiona todo el dialogo oDlg y sus controles. Además se fuerza que el control
oMyMulGet se redimensione como si la resolución de pantalla fuera del tipo 2.

ACTIVATE oDlg ON INIT AutoResiz( .T., 0, oWnd, 3 )

AutResiz( .T., 2, oMyMulGet, 0)


-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
Se redimensiona el control oTabs.
@ 185.50,8.00 TABS oTabs OF oWnd ITEMS "Tab1","Tab2","Venga a ordenarrrrr!!" ;
PIXEL COLORS CLR_BLUE,CLR_HCYAN SIZE 288.00,9.00 MESSAGE "Mensaje del Tabs"

AutoResiz( .T., 0, oTabs, 3, .T. )

-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
*/

FUNCTION AutResiz( lAutoresize, nWhatSize, oWnd, nResolution, lRepaint )

// Resolución de la pantalla en el momento de definir los controles.
Local nOriWidth, nOriHeight

// Lo normal sería que fuera la resolución actual de la pantalla (nWhatSize=0).
// Se permite forzar esta resolución mediante el valor de nWhatSize=1,2,3,4,5,6,7,....
Local nWidth, nHeight

// Son la relación entre la resolución de pantalla y la resolución de diseño.
Local nFactorWitdh, nFactorHeight

Local nContador

DEFAULT lRepaint := .T.

nOriWidth := 0
nOriHeight := 0
nWidth := 0
nHeight := 0
nContador := 0

If ABS(nResolution) = 1
nOriWidth := 640
nOriHeight := 480
ElseIf ABS(nResolution) = 2
nOriWidth := 800
nOriHeight := 600
ElseIf ABS(nResolution) = 3
nOriWidth := 1024
nOriHeight := 768
ElseIf ABS(nResolution) = 4
nOriWidth := 1152
nOriHeight := 864
ElseIf ABS(nResolution) = 5
nOriWidth := 1280
nOriHeight := 800
ElseIf ABS(nResolution) = 6
nOriWidth := 1280
nOriHeight := 1024
ElseIf ABS(nResolution) = 7
nOriWidth := 1600
nOriHeight := 1200
ElseIf ABS(nResolution) = 8
nOriWidth := 768
nOriHeight := 1024
Else
ScrResolution( @nOriWidth, @nOriHeight )
Endif


If nWhatSize = 1
nWidth := 640
nHeight := 480
ElseIf nWhatSize = 2
nWidth := 800
nHeight := 600
ElseIf nWhatSize = 3
nWidth := 1024
nHeight := 768
ElseIf nWhatSize = 4
nWidth := 1152
nHeight := 864
ElseIf nWhatSize = 5
nWidth := 1280
nHeight := 800
ElseIf nWhatSize = 6
nWidth := 1280
nHeight := 1024
ElseIf nWhatSize = 7
nWidth := 1600
nHeight := 1200
ElseIf nWhatSize = 8
nWidth := 768
nHeight := 1024
Else

ScrResolution( @nWidth, @nHeight )

Endif


If lAutoresize .and. nOriHeight != nHeight

/* Este será el caso habitual, en el cual se pretende redimensionar
los controles a la resolución de la pantalla en la cual se estan
viendo. 01/03/2006 */

If nResolution > 0

nFactorWitdh := nWidth / nOriWidth
nFactorHeight := nHeight / nOriHeight

/* Este será el caso en el cual se pretende deshacer el redimensionamiento
de los controles realizado previamente. */

ElseIf nResolution < 0

nFactorWitdh := nOriWidth / nWidth
nFactorHeight := nOriHeight / nHeight

EndIf

If lRepaint
oWnd:Hide()
EndIf

//If nFactorWitdh > 1 // .or.
If nFactorHeight > 1


If oWnd:ClassName() == "kalimeroquetequiero"

ElseIf oWnd:ClassName() $ "/TJ02LISMN/TLISTBOX/"
oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight , ;
.F. )
Else

oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight * nFactorHeight , ;
.F. )
EndIf
EndIf

If oWnd:ClassName() == "TFOLDER"
If ValType( oWnd:aDialogs ) = "A"
For nContador := 1 To Len( oWnd:aDialogs )
AutResiz( lAutoresize, nWhatSize, oWnd:aDialogs[nContador], nResolution, .F. )
EndFor
EndIf
Else
If ValType( oWnd:aControls ) = "A"
For nContador := 1 To Len( oWnd:aControls )
AutResiz( lAutoresize, nWhatSize, oWnd:aControls[nContador], nResolution, .F. )
EndFor
EndIf
EndIf

//If nFactorWitdh < 1 // .or.
If nFactorHeight < 1

If oWnd:ClassName() == "kalimeroquetequiero"

ElseIf oWnd:ClassName() $ "/TJ02LISMN/TLISTBOX/"
oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight , ;
.F. )

Else

oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight * nFactorHeight , ;
.F. )
EndIf
EndIf

If lRepaint
oWnd:Show()
EndIf

EndIf

Return Nil
/* ******************** */

Saludos
Carlos G.