Page 1 of 1

¿Como cambiar tamaño de un dialogo en tiempo de ejecucion?

Posted: Fri Apr 13, 2007 12:12 pm
by alfonso
Hola,

Tengo de finido un Browse y cuatro botones en un dialogo y necesito expandirlo para ajustar a la resolucion de la pantalla y por supuesto mover los botones dentro del nuevo tamaño de la pantalla.

¿ Alguien sabe como hacerlo?

Gracias por adelantado,

Alfonso

Posted: Fri Apr 13, 2007 11:08 pm
by Antonio Linares
Alfonso,

Puedes variar el tamaño con:

oDialog:nWidth = ...
oDialog:nHeight = ...

igual para los botones y el browse. Y las posiciones de los botones con:

oButton:nTop = ...
oButton:nLeft = ...

Posted: Mon Apr 16, 2007 3:44 pm
by alfonso
Hola Antonio,

Gracias por la respuesta pero me queda un problema en el tintero.

Estoy generando los dialogos con Resource Workshop y cuando redimensiono un dialogo los textos (literales) no se dimensionan.

¿ Hay alguna forma de hacer que tomen el nuevo tamaño junto con los controles del dialogo?

Gracias por adelantado,

Redimensionar Ventanas, diálogos y controles.

Posted: Mon Apr 16, 2007 5:41 pm
by FiveWiDi
Prueba con esta función en la cláusula INIT del ACTIVATE del diálogo:

*****************************************
#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 = 0
// ScrResolution( @nWidth, @nHeight )
//ElseIf nWhatSize = 1

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 )

/*
If oWnd:ClassName() = "TMDICHILD"
nWidth := oWnd:oWnd:nRight - oWnd:oWnd:nLeft - 10
nHeight := oWnd:oWnd:nBottom - oWnd:oWnd:nTop - 0
ElseIf oWnd:oWnd:ClassName() = "TMDICHILD"
nWidth := oWnd:oWnd:oWnd:nRight - oWnd:oWnd:oWnd:nLeft - 10
nHeight := oWnd:oWnd:oWnd:nBottom - oWnd:oWnd:oWnd:nTop - 0
Else
ScrResolution( @nWidth, @nHeight )
EndIf

//ScrResolution( @nWidth, @nHeight )
*/

Endif


//ScrResolution( @nWidth, @nHeight )

/*
Traza( 1, "nOriWidth=", nOriWidth )
Traza( 1, "nOriHeight=", nOriHeight )

Traza( 1, "nWidth=", nWidth )
Traza( 1, "nHeight=", nHeight )
*/

//Traza( 1, "oWnd:ClassName()=", oWnd:ClassName() )

//If nOriWidth != nWidth // .or.
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

//oWnd:CoorsUpdate()

If lRepaint
oWnd:Hide()
EndIf

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

//Traza( 1, "Aumentando tamaño." )

If oWnd:ClassName() == "kalimeroquetequiero"

ElseIf oWnd:ClassName() $ "/TJ02LISMN/TLISTBOX/"
/* Traza( 1, "oWnd:nTop=", oWnd:nTop )
Traza( 1, "oWnd:nLeft=", oWnd:nLeft )
Traza( 1, "oWnd:nWidth=", oWnd:nWidth )
Traza( 1, "oWnd:nHeight=", oWnd:nHeight )
*/
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"
// Traza( 1, "ValType(oWnd:aDialogs)=", ValType(oWnd:aDialogs) )
If ValType( oWnd:aDialogs ) = "A"
For nContador := 1 To Len( oWnd:aDialogs )
AutResiz( lAutoresize, nWhatSize, oWnd:aDialogs[nContador], nResolution, .F. )
EndFor
EndIf
Else
// Traza( 1, "ValType(oWnd:aControls)=", ValType(oWnd:aControls) )
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

//Traza( 1, "Disminuyendo tamaño." )

If oWnd:ClassName() == "kalimeroquetequiero"

ElseIf oWnd:ClassName() $ "/TJ02LISMN/TLISTBOX/"

/* Traza( 1, "oWnd:nTop=", oWnd:nTop )
Traza( 1, "oWnd:nLeft=", oWnd:nLeft )
Traza( 1, "oWnd:nWidth=", oWnd:nWidth )
Traza( 1, "oWnd:nHeight=", oWnd:nHeight )
*/

//Traza( 1, "oWnd:nRight=", oWnd:nRight )
//Traza( 1, "oWnd:nBottom=", oWnd:nBottom )

oWnd:Move( oWnd:nTop * nFactorHeight , ;
oWnd:nLeft * nFactorWitdh, ;
oWnd:nWidth * nFactorWitdh, ;
oWnd:nHeight , ;
.F. )
//oWnd:SetSize( oWnd:nWidth * nFactorWitdh, oWnd:nHeight * nFactorHeight, .T. )
/* Traza( 1, "oWnd:nTop=", oWnd:nTop )
Traza( 1, "oWnd:nLeft=", oWnd:nLeft )
Traza( 1, "oWnd:nWidth=", oWnd:nWidth )
Traza( 1, "oWnd:nHeight=", oWnd:nHeight )
*/

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.

Posted: Tue Apr 17, 2007 9:20 am
by alfonso
Garcias por tu respuesta.
Pero todavia tengo algún problema con los dialogos, los literales o textos fijos en el dialogo no son dimensionados y la visualizacion en pantalla de estos textos desfiguran la visualizacion.
¿Como se pueden tratar los textos fijos o literales en un dialogo para que pueda redimensionarlos?
Gracias por adelantado,
Jose Alfonso