Page 1 of 2

Frase se ajuste a un ancho

PostPosted: 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)

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

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

PostPosted: 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 view
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

PostPosted: 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... :shock:

[ TITULO VENTANA/DIALOGO ] ---> BORDE DEL TITULO

Re: Frase se ajuste a un ancho

PostPosted: Sat Jan 31, 2015 5:14 pm
by horacio
Fijate si esto es lo que buscas

Code: Select all  Expand view

#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

PostPosted: 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... :shock:

Re: Frase se ajuste a un ancho

PostPosted: Sat Jan 31, 2015 9:47 pm
by horacio
Algo así ???

Image

Saludos

Re: Frase se ajuste a un ancho

PostPosted: 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... :shock:

Re: Frase se ajuste a un ancho

PostPosted: Sun Feb 01, 2015 5:23 am
by FranciscoA
++1

Re: Frase se ajuste a un ancho

PostPosted: 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 view

#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

PostPosted: 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... :shock:

Re: Frase se ajuste a un ancho

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

PostPosted: 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... :shock:

Re: Frase se ajuste a un ancho

PostPosted: 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 view

#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ú