Page 1 of 2
Frase se ajuste a un ancho
Posted: Fri Jan 30, 2015 7:35 am
by jmartial
Hola,
Me gustaría saber, si alguien sabe como calcular el tamaño del font a usar, para que dada una frase y un nombre de font, la frase mida un ancho determinado en pixeles.
Mi idea es si es posible autoajustar textos a diferentes resoluciones intentando que ocupen tamaños predefinidos.
Re: Frase se ajuste a un ancho (Solucionado)
Posted: Fri Jan 30, 2015 1:01 pm
by jmartial
Buenas,
Ya lo he resuelto creando una función que me hiciera los cálculos y ha funcionado bien.
Re: Frase se ajuste a un ancho
Posted: Fri Jan 30, 2015 11:53 pm
by joseluisysturiz
Saludos, he intendado hacer lo que dices pero seria el titulo de una ventana MAXIMIZADA o al tamaño que se cambie, se que hay que hacer varias divisiones, podrias compartir la formula haber si me sirve o me da guia para lo que quiero.? gracias, saludos...
Re: Frase se ajuste a un ancho
Posted: Sat Jan 31, 2015 10:21 am
by jmartial
Buenas,
No lo puse porque no pensé que interesara mucho. Ahí lo llevas.
Code: Select all | Expand
Function creaFontAmedida( cNameFont, cText , nWidth, oWnd )
Local oFont , nMax := -100
Local nSize , nHeightFont
DEFAULT cNameFont := "Verdana"
DEFAULT cText := "Prueba font a medida"
DEFAULT nWidth := 10
nHeightFont := -1
Do While .t.
DEFINE FONT oFont NAME cNameFont SIZE 0, nHeightFont
nSize := oWnd:GetWidth( cText, oFont )
if nSize > nWidth
oFont:end()
nHeightFont++
DEFINE FONT oFont NAME cNameFont SIZE 0, nHeightFont
nWidth := oWnd:GetWidth( cText, oFont ) // Devuelve por referencia el ancho real del Texto
exit
else
oFont:end()
nHeightFont--
endif
// Sale por error, hay un desbordamiento
if Abs(nMax)<abs(nHeightFont)
exit
endif
//--------------------------------------
Enddo
return oFont
Re: Frase se ajuste a un ancho
Posted: Sat Jan 31, 2015 4:08 pm
by joseluisysturiz
Saludos, creo que entendi mal lo que hacia tu funcion, pero lamentablemente no es lo que necesito, lo que busco es centrar un texto(titulo) en el ancho de una ventana o dialogo, algo como esto y no que salga siempre a la izquierda y que si se ajusta tamaño de ventana/dialogo, el texto se auto-ajuste al nuevo tamaño, parecido a AL_CENTER en las col de xbrowse, igual gracias por tu atencion, saludos...
[ TITULO VENTANA/DIALOGO ] ---> BORDE DEL TITULO
Re: Frase se ajuste a un ancho
Posted: Sat Jan 31, 2015 5:14 pm
by horacio
Fijate si esto es lo que buscas
Code: Select all | Expand
#include 'fivewin.ch'
#define DT_CENTER 0x0001
#define DT_VCENTER 0x0004
Static oWnd
//----------------------------------------------------------------------------//
Function Main()
Local cTexto := 'texto de prueba'
Define Window oWnd
Activate Window oWnd On Paint Texto( cTexto )
Return 0
//----------------------------------------------------------------------------//
Function Texto( cTitulo )
Local hDc := oWnd : GetDC()
Local aRect := GetClientRect( oWnd : hWnd )
Define Font oFont1 Name "Segoe UI" Size 0, -20 Bold
oFont1 : Activate( hDc )
SetTextColor( hDC, CLR_WHITE )
SetBkColor( hDC, RGB( 43, 87, 154 ) )
DrawTextEx( hDC, cTitulo, { 02, 15, 45, aRect[ 4 ] - 50 }, DT_CENTER + DT_VCENTER )
oFont1 : Deactivate( hDC )
oWnd : ReleaseDc()
Return 0
Saludos
Re: Frase se ajuste a un ancho
Posted: Sat Jan 31, 2015 7:55 pm
by joseluisysturiz
Horacion, gracias por tu respuesta, es y no es lo que busco, es porque hace lo que quiero, centrar TEXTO en la VENTANA, pero quiero que lo haga en la barra donde va el TITLE de la ventana, que tambien contiene el icono y los botones de maximizar, etc...vere si puedo usar lo que enviastes, igual gracias, saludos...

Re: Frase se ajuste a un ancho
Posted: Sat Jan 31, 2015 9:47 pm
by horacio
Algo así ???

Saludos
Re: Frase se ajuste a un ancho
Posted: Sun Feb 01, 2015 2:08 am
by joseluisysturiz
Horacio, exactamente es lo que quiero , que sirva para ventanas y dialogos, cual es el truco.? gracias, saludos...

Re: Frase se ajuste a un ancho
Posted: Sun Feb 01, 2015 5:23 am
by FranciscoA
++1
Re: Frase se ajuste a un ancho
Posted: Sun Feb 01, 2015 1:31 pm
by horacio
Antes que nada te comento que no se puede cambiar el aspecto del caption de los dialogos y ventanas, Windows no lo permite, lo único que queda es hacerlo "a mano". Te posteo el código, es para un dialogo pero es lo mismo para una ventana.
Code: Select all | Expand
#include 'fivewin.ch'
#define DT_CENTER 0x0001
#define DT_VCENTER 0x0004
Function Main()
Local oDlg
Local nRowPos
Local nColPos
Local oCrsHand
Local lDrag := .f.
Local lInit := .t.
Define Dialog oDlg From 100, 100 To 500, 700 Pixel Style nOr( WS_POPUP ) Color 0, CLR_WHITE Transparent
oDlg : bLClicked := { | nRow, nCol | SetCapture( oDlg : hWnd ), nRowPos := nRow, nColPos := nCol, lDrag := .T., oDlg : oCursor := oCrsHand }
oDlg : bMMoved := { | nRow, nCol | If( lDrag, oDlg : Move( oDlg : nTop + nRow - nRowPos,;
oDlg : nLeft + nCol - nColPos,,, .T. ),) }
oDlg : bLButtonUp := { || lDrag := .f., oDlg : oCursor := nil, ReleaseCapture() }
Activate Dialog oDlg Centered On Paint CabeceraDialogo( oDlg, "Altas alumnos" ) Valid ( .t. )
Return 0
//----------------------------------------------------------------------------//
Function CabeceraDialogo( oDlg, cTitulo )
Local oSay
Local oBmp
Local oFont1
Local hBitmap
Local hDc := oDlg : GetDC()
Local hPen := CreatePen( PS_SOLID, 1, RGB( 43, 87, 154 ) )
Local aRect := GetClientRect( oDlg : hWnd )
Local hBrush := CreateSolidBrush( RGB( 43, 87, 154 ) )
Local hOldPen := SelectObject( hDc, hPen )
Local hOldBrush := SelectObject( hDc, hBrush )
Default cTitulo := ''
Define Font oFont1 Name "Segoe UI" Size 0, -20 Bold
Rectangle( hDC, aRect[ 1 ],;
aRect[ 2 ],;
35,;
aRect[ 4 ] )
Rectangle( hDC, aRect[ 1 ],;
0,;
aRect[ 3 ],;
5 )
Rectangle( hDC, aRect[ 1 ],;
aRect[ 4 ] - 5,;
aRect[ 3 ],;
aRect[ 4 ] )
Rectangle( hDC, aRect[ 4 ] - 5,;
aRect[ 2 ],;
aRect[ 3 ] - 5,;
aRect[ 4 ] )
hBitmap := LoadBitmap( GetResources(), 'cerrar' )
DrawBitmap( hDc, hBitmap, 8, aRect[ 4 ] - 45, 37, 20 )
oFont1 : Activate( hDc )
SetTextColor( hDC, CLR_WHITE )
SetBkColor( hDC, RGB( 43, 87, 154 ) )
DrawTextEx( hDC, cTitulo, { 02, 15, 45, aRect[ 4 ] - 50 }, DT_CENTER + DT_VCENTER )
SelectObject( hDc, hOldPen )
SelectObject( hDc, hOldBrush )
DeleteObject( hPen )
DeleteObject( hBrush )
oFont1 : Deactivate( hDC )
oDlg : ReleaseDc()
oFont1 : End()
Return 0
Saludos
Re: Frase se ajuste a un ancho
Posted: Sun Feb 01, 2015 3:38 pm
by joseluisysturiz
Sencillamente Buenisimo, es lo que busco en el titulo del dialogo, esta agradle visualmente y orginal el diseño de tu dialogo, seria bueno indagar un poco mas y salir de la imagen rutinaria de los dialosgos, eso daria una mejor imagen visual de nuestros sistemas, no se si sera facil y un poco dificil hacer algo como lo que hicistes, pero lo intentare y hare pruebas haber que sale, ahora en relacion al centrado crei que con una formula que calculase el ancho de la barra de la ventana o dlg y sabiendo el largo del texto, se pudiese suma SPACE() al texto y asi centrarse, se que existe pero he buscado en google y nada, es tecnica y formula que usan los diseñadores para centrar texto o imagenes...en resumen...GRACIAS y ahora probare en mis sistemas lo de centrar el TITLE, seria una buena opcion como parametro original de la clase y asi salir de la rutina visual...saludos...

Re: Frase se ajuste a un ancho
Posted: Sun Feb 01, 2015 8:08 pm
by horacio
Comencé un proyecto nuevo y decidí utilizar una ribbon con estilo 2013 y me di cuenta que los dialogos ordinarios no quedaban bien por eso me puse a trabajar para cambiarles el aspecto. Toda la magia está en el evento Paint y realmente no me fue difícil ya que FW tiene primitivas gráficas para todo. Pero claro, es más trabajo.
Saludos
Re: Frase se ajuste a un ancho
Posted: Mon Feb 02, 2015 12:00 am
by joseluisysturiz
horacio wrote:Comencé un proyecto nuevo y decidí utilizar una ribbon con estilo 2013 y me di cuenta que los dialogos ordinarios no quedaban bien por eso me puse a trabajar para cambiarles el aspecto. Toda la magia está en el evento Paint y realmente no me fue difícil ya que FW tiene primitivas gráficas para todo. Pero claro, es más trabajo.
Saludos
Que bueno, lo que me di cuenta es que no es que pones el titulo en la barra de sistema por llamarla de alguna manera, es decir, donde va el TITLE, sino que cambias el style para que desaparezca la barra y luego creas un rectangulo que emula la barra y alli centras el titulo, buen truco visual, pero me gusta como queda solo que para mover el dialogo o la ventana o para redimenzionarlo, da un efecto tembloroso por el forzamiento, pero de mi parte fue un buen trabajo. La formula para lo de centrar es TAMAÑO DE LA VENTANA O DIALOGO(aunque deberia ser de la barra) menos(-) el tamaño del texto dividido(/) entre 2...asi es la formula para centrar de diseño, crfeo que asi podria calcular la cantidad de SPACE() para anteponer al texto, vere que tal funciona y aviso, gracias, saludos...

Re: Frase se ajuste a un ancho
Posted: Thu Oct 06, 2022 7:28 pm
by Maggiro
Buenas Tardes José:
Buen Tema, centrar el título en Ventana o Dialogo ...
Estuve leyendo el post anterior donde pusiste ...
(oDlg:nWidth-LEN(cTitle))/2
lo cual no te resultaba debido a que el nWidth se calcula en pixeles y el LEN se calcula en columnas
Prueba Asi:
Code: Select all | Expand
#include "FiveWin.ch"
MEMVAR VePru,Titulo
FUNCTION Main()
Titulo='Probando un Titulo Centrado'
DEFINE WINDOW VePru FROM 0,0 TO 35,100 TITLE Titulo
ACTIVATE WINDOW VePru ON INIT Centro()
RETU nil
FUNCTION Centro()
LOCAL espacios
espacios=(((VePru:nWidth)/8)-(LEN(Titulo))/2)
VePru:cTITLE := SPACE( espacios ) + Titulo
RETU nil
Saludos
Julio César Gómez Cortéz
Jultzem Estudio
Lima Perú