Frase se ajuste a un ancho

Frase se ajuste a un ancho

Postby jmartial » Fri Jan 30, 2015 7:35 am

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.
Un Saludo,
Joaquín Martínez
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Frase se ajuste a un ancho (Solucionado)

Postby jmartial » Fri Jan 30, 2015 1:01 pm

Buenas,

Ya lo he resuelto creando una función que me hiciera los cálculos y ha funcionado bien.
Un Saludo,
Joaquín Martínez
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Frase se ajuste a un ancho

Postby joseluisysturiz » Fri Jan 30, 2015 11:53 pm

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...
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Frase se ajuste a un ancho

Postby jmartial » Sat Jan 31, 2015 10:21 am

Buenas,

No lo puse porque no pensé que interesara mucho. Ahí lo llevas.

Code: Select all  Expand view  RUN
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
Un Saludo,
Joaquín Martínez
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Frase se ajuste a un ancho

Postby joseluisysturiz » Sat Jan 31, 2015 4:08 pm

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
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Frase se ajuste a un ancho

Postby horacio » Sat Jan 31, 2015 5:14 pm

Fijate si esto es lo que buscas

Code: Select all  Expand view  RUN

#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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Frase se ajuste a un ancho

Postby joseluisysturiz » Sat Jan 31, 2015 7:55 pm

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Frase se ajuste a un ancho

Postby horacio » Sat Jan 31, 2015 9:47 pm

Algo así ???

Image

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Frase se ajuste a un ancho

Postby joseluisysturiz » Sun Feb 01, 2015 2:08 am

Horacio, exactamente es lo que quiero , que sirva para ventanas y dialogos, cual es el truco.? gracias, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Frase se ajuste a un ancho

Postby FranciscoA » Sun Feb 01, 2015 5:23 am

++1
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Frase se ajuste a un ancho

Postby horacio » Sun Feb 01, 2015 1:31 pm

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  RUN

#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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Frase se ajuste a un ancho

Postby joseluisysturiz » Sun Feb 01, 2015 3:38 pm

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Frase se ajuste a un ancho

Postby horacio » Sun Feb 01, 2015 8:08 pm

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
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Frase se ajuste a un ancho

Postby joseluisysturiz » Mon Feb 02, 2015 12:00 am

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Frase se ajuste a un ancho

Postby Maggiro » Thu Oct 06, 2022 7:28 pm

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  RUN

#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ú
User avatar
Maggiro
 
Posts: 84
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 49 guests