Page 1 of 1

SelFont

Posted: Sun Nov 23, 2008 5:47 am
by Manuel Valdenebro
Vengo usando el método SelFont para que el usuario seleccione y personalice, los Fonts que desea usar en una aplicación. El método funciona perfectamente, pero cuando Windows abre la ventana para elegir el Font, respeta algunos de los parámetros actuales del Font (el tipo de letra -p.e. MS San Serif-, negrita, etc) pero el tamaño del fuente, activa el inmediatamente anterior existente en la tabla . Es decir, si el Font actual tiene un tamaño de 14, activa el 12, si el actual es 12, activa el 10, etc.

No veo (a diferencia de ChooseFont) que SelFont lleve parámetro alguno. ¿Habría alguna forma que en la pantalla que llama SelFont, respetara todos los parámetros del Font activo?.

Posted: Mon Nov 24, 2008 8:57 am
by Antonio Linares
Manuel,

Este ejemplo funciona bien:

Code: Select all

#include "FiveWin.ch"

function Main()

   local oWnd, oBtn

   DEFINE WINDOW oWnd

   @ 2, 2 BUTTON oBtn PROMPT "Test" SIZE 80, 25 ACTION oBtn:SelFont()

   ACTIVATE WINDOW oWnd

return nil

Posted: Mon Nov 24, 2008 12:16 pm
by Manuel Valdenebro
Antonio Linares wrote:Este ejemplo funciona bien:
Antonio,

En base al ejemplo que me has enviado, he realizado algunas modificaciones para que veas el problema. He definido tres fonts y asignado a cada uno de los botones. Cuando pulsas el botón, Selfont()
asigna perfectamente el tipo de letra y negrita, pero no el tamaño.
En el primer caso, el tamaño es 18 y señala 14.
En el segundo, de 16 a 12 y en el tercero de 12 a 9. Ese es el problema.
Algo debe de estar mal. Te acompaño el código:

Code: Select all


#include "FiveWin.ch" 

function Main() 
local oWnd, oBtn1, oBtn2,oBtn3,oFon1, oFon2, oFon3


DEFINE WINDOW oWnd 

DEFINE FONT oFon1  NAME "Arial" SIZE 0, -18 BOLD
DEFINE FONT oFon2  NAME "MS Sans Serif" SIZE 0, -16 BOLD
DEFINE FONT oFon3  NAME "Courier New" SIZE 0, -12 BOLD


   @ 2, 2 BUTTON oBtn1 ;
          PROMPT "Font 18" ;
          SIZE 120, 45 ;
          ACTION oBtn1:SelFont() ;
          FONT oFon1

   @ 2,32 BUTTON oBtn2 ;
          PROMPT "Font 16" ;
          SIZE 120, 45 ;
          ACTION oBtn2:SelFont() ;
          FONT oFon2

   @ 2,62 BUTTON oBtn3 ;
          PROMPT "Font 12" ;
          SIZE 120, 45 ;
          ACTION oBtn3:SelFont() ;
          FONT oFon3
    
   ACTIVATE WINDOW oWnd 

return nil 


Posted: Mon Nov 24, 2008 1:27 pm
by Antonio Linares
Manuel,

La diferencia que indicas viene de los parámetros que usa CreateFont(). Mira lo que comenta el API de Windows:

http://msdn.microsoft.com/en-us/library ... S.85).aspx

nHeight
[in] Specifies the height, in logical units, of the font's character cell or character

...

< 0 The font mapper transforms this value into device units and matches its absolute value against the character height of the available fonts.

...

For the MM_TEXT mapping mode, you can use the following formula to specify a height for a font with a specified point size:

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

Resumiendo: el valor que se indica como "Height" es transformado de unidades lógicas a unidades de dispositivo, de ahi que al mostrar ChooseFont() los valores no coincidan.

habria que ver si usando esa formula podemos corregirlo nosotros para que los valores coincidan.

Posted: Mon Nov 24, 2008 3:29 pm
by Manuel Valdenebro
Antonio,

¿y eso como se come?. Porque SetFont() no admite ningun parámetro. ¿Cambiando previamente el valor de nHeight en el objeto oBtn?

Posted: Mon Nov 24, 2008 4:08 pm
by pymsoft
No se si entendi bien lo que quieres hacer, pero yo para los fonts usados en el browse hago asi: (espero te sirva como idea)





Code: Select all

#define FW_NORMAL          400
#define FW_BOLD            700

********
FUNCTION SelezionaFontBrowses()
********
LOCAL aFont, aPreviousFont, nRGB, oNewFont, oFont
LOCAL cFaceName := "", nHeight, nWidth, nEscapement, nOrientation, nWeight, lItalic, lUnderLine, lStrikeOut, nCharSet, nOutPrecision, nClipPrecision, nQuality, nPitchAndFamily

  oFont := FontBrowses()


   aFont := ChooseFont( { oFont:nInpHeight, oFont:nInpWidth, oFont:nEscapement,;
                          oFont:nOrientation, oFont:nWeight, oFont:lItalic,;
                          oFont:lUnderLine, oFont:lStrikeOut, oFont:nCharSet,;
                          oFont:nOutPrecision, oFont:nClipPrecision,;
                          oFont:nQuality, oFont:nPitchFamily, oFont:cFaceName },;
                          @nRGB )

   IF !Empty( aFont[ LF_FACENAME ] )

    oFont:end()


      oV:oFontBrowses := TFont():New( aFont[ LF_FACENAME ],, aFont[ LF_HEIGHT ], .f.,;
                           ! ( aFont[ LF_WEIGHT ] == FW_NORMAL ),;
                           aFont[ LF_ESCAPEMENT ], aFont[ LF_ORIENTATION ],;
                           aFont[ LF_WEIGHT ], aFont[ LF_ITALIC ],;
                           aFont[ LF_UNDERLINE ], aFont[ LF_STRIKEOUT ],;
                           aFont[ LF_CHARSET ], aFont[ LF_OUTPRECISION ],;
                           aFont[ LF_CLIPPRECISION ], aFont[ LF_QUALITY ],,;
                           aFont[ LF_PITCHANDFAMILY ] )


    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_Height",  aFont[ LF_HEIGHT ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_Width",  aFont[ 2 ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_nScapement",  aFont[ LF_ESCAPEMENT ] )

    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_nOrientation",  aFont[ LF_ORIENTATION ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_Weight",  aFont[ LF_WEIGHT ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_ITALIC",  aFont[ LF_ITALIC ] )

    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_UNDERLINE",  aFont[ LF_UNDERLINE ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_STRIKEOUT",  aFont[ LF_STRIKEOUT ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_nCharSet",  aFont[ LF_CHARSET ] )

    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_OUTPRECISION",  aFont[ LF_OUTPRECISION ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_CLIPPRECISION",  aFont[ LF_CLIPPRECISION ] )

    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_QUALITY",  aFont[ LF_QUALITY ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_PITCHANDFAMILY",  aFont[ LF_PITCHANDFAMILY ] )
    SetProfile( oV:cIniStaz, "InfoBrowses", "Font_FACENAME",  aFont[ LF_FACENAME ] ) 

  ENDIF

RETURN NIL
*
** SelezionaFontBrowses


********
FUNCTION FontBrowses()
********
LOCAL cFaceName := "", nHeight, nWidth, nEscapement, nOrientation, nWeight, lItalic, lUnderLine, lStrikeOut, nCharSet, nOutPrecision, nClipPrecision, nQuality, nPitchAndFamily
LOCAL oFont

  cFaceName := ProfileString( oV:cIniStaz, "InfoBrowses", "Font_FACENAME",  "" )

  IF EMPTY( cFaceName )
    oFont := RetMainWnd():oFont
  ELSE
    nHeight := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_HEIGHT",  -19 )
    nWidth  := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_Width",  0 )
    nEscapement := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_nScapement",  0 )

    nOrientation := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_nOrientation",  0 )
    nWeight := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_Weight",  400 )
    lItalic := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_ITALIC",  0 ) = 1

    lUnderLine := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_UNDERLINE",  0 ) = 1
    lStrikeOut := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_STRIKEOUT",  0 ) = 1
    nCharSet   := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_nCharSet",  0 )

    nOutPrecision := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_OUTPRECISION",  1 )
    nClipPrecision := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_CLIPPRECISION",  2 )

    nQuality := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_QUALITY",  1 )
    nPitchAndFamily := ProfileNum( oV:cIniStaz, "InfoBrowses", "Font_PITCHANDFAMILY",  34 )

    oFont := TFont():New( cFaceName,, nHeight, .f.,;
                         ! ( nWeight == FW_NORMAL ),;
                           nEscapement, nOrientation,;
                           nWeight, lItalic,;
                           lUnderLine, lStrikeOut,;
                           nCharSet, nOutPrecision,;
                           nClipPrecision, nQuality,,;
                           nPitchAndFamily )
  ENDIF

RETURN oFont
*
** eof FontBrowses



Posted: Mon Nov 24, 2008 5:11 pm
by Manuel Valdenebro
Gracias Pedro por contestar.

No es para un xBrowse. Se trata en una aplicación de que el usuario pueda elegir las fuentes (tipo, tamaño y colores) tanto de la pantalla como de impresión. Tengo diferentes botones, donde al pulsar te sale la pantalla del SelFont, donde el usuario puede elegir lo que le guste: Tipo de letra, tamaño, negrita, cursiva y color. Esta información la almacenó despues en la BD y en adelante el programa funcionara con estos fonts. Todo funciona correcto, salvo el tema que he comentado, que cuando por segunda vez se pulsa el botón, hay un error en la función SelFont, y no se activa el tamaño correcto (puedes observarlo en el código anterior).

Antonio ha dado con el problema, pero yo no sé como resolverlo.

Posted: Tue Nov 25, 2008 8:35 am
by pymsoft
Manuel,


Bueno, lo que tu necesitas es lo mismo que hago yo. Selecciono la font, salvo todos los datos en un .ini y cuando llamo de nuevo la seleccion de la font, le mando los parametros como estan escritos, (o sea, queda seleccionada por default la ultima font que seleccioné).
Mira bien la funcion que te mandé, manda como parametros todos los datos de la font y luego de seleccionada los salva en un archivo .ini


Saludos

Posted: Tue Nov 25, 2008 8:44 am
by Antonio Linares
Manuel,

> ¿y eso como se come?

Inicialmente se trata de usar un valor al crear el font que se convertiría en el valor deseado al mostrar ChooseFont()

Si usando esa fórmula que te he indicado consiguiésemos una conversión correcta, entonces podríamos modificar la clase TFont para que lo hiciese automaticamente, aunque no se decirte si se podrá hacer ó no.

Pero podemos intentarlo :-)

Posted: Tue Nov 25, 2008 10:05 am
by pymsoft
Manuel,


me quedó la duda e hice la prueba con tu codigo, efectivamente está el problema, y yo tambien lo tengo :?

Aqui una posible solucion:

Code: Select all

#define FW_NORMAL          400
#define FW_BOLD            700

function SelezionaFont()
local oWnd, oBtn1, oBtn2,oBtn3,oFon1, oFon2, oFon3
local oFont, nRGB, aFont


DEFINE WINDOW oWnd

DEFINE FONT oFon1  NAME "Arial" SIZE 0, -18 BOLD
DEFINE FONT oFon2  NAME "MS Sans Serif" SIZE 0, -16 BOLD
DEFINE FONT oFon3  NAME "Courier New" SIZE 0, -12 BOLD


   @ 2, 2 BUTTON oBtn1 ;
          PROMPT "Font 18" ;
          SIZE 120, 45 ;
          ACTION ( oFont := oBtn1:oFont,;
                   msginfo( STR( oFont:nInpHeight ) + CRLF + STR( oFont:nInpWidth ) + CRLF + STR( oFont:nWeight ) ),; 
                   aFont := ChooseFont( { ABS( oFont:nInpHeight ) * 1.34 , oFont:nInpWidth, oFont:nEscapement,;
                          oFont:nOrientation, oFont:nWeight, oFont:lItalic,;
                          oFont:lUnderLine, oFont:lStrikeOut, oFont:nCharSet,;
                          oFont:nOutPrecision, oFont:nClipPrecision,;
                          oFont:nQuality, oFont:nPitchFamily, oFont:cFaceName },;
                          @nRGB ) ,;
                    oFont:end()   ,;
                    oFont := TFont():New( aFont[ LF_FACENAME ],, aFont[ LF_HEIGHT ] / 1.34, .f.,;
                           ! ( aFont[ LF_WEIGHT ] == FW_NORMAL ),;
                           aFont[ LF_ESCAPEMENT ], aFont[ LF_ORIENTATION ],;
                           aFont[ LF_WEIGHT ], aFont[ LF_ITALIC ],;
                           aFont[ LF_UNDERLINE ], aFont[ LF_STRIKEOUT ],;
                           aFont[ LF_CHARSET ], aFont[ LF_OUTPRECISION ],;
                           aFont[ LF_CLIPPRECISION ], aFont[ LF_QUALITY ],,;
                           aFont[ LF_PITCHANDFAMILY ] )  ,;
                    oBtn1:SetFont( oFont ) );
          FONT oFon1

   @ 2,32 BUTTON oBtn2 ;
          PROMPT "Font 16" ;
          SIZE 120, 45 ;
          ACTION oBtn2:SelFont() ;
          FONT oFon2

   @ 2,62 BUTTON oBtn3 ;
          PROMPT "Font 12" ;
          SIZE 120, 45 ;
          ACTION oBtn3:SelFont() ;
          FONT oFon3
   
   ACTIVATE WINDOW oWnd

return nil 

Saludos

Posted: Tue Nov 25, 2008 4:50 pm
by Manuel Valdenebro
pymsoft wrote:Aqui una posible solucion
Pedro, excelente.

Aunque habría que hacer unos pequeños retoques, porque cuando selecciona el tamaño 22, sale despues el 21 y si pulsas CANCELAR todo se "estropicia".

Pero en el ejemplo que he enviado anteriormente, hay una cosa curiosa. La primera vez que se pulsa el botón FONT 18, sale mal, pero a partir de entonces, cuando se pulsa, sale siempre BIEN. Algo debe pasar.

¿Antonio, no podriamos hacer un truquito aqui, para que el botón se comportará como lo hace a partir de la segunda pulsación?

El ponerte a modificar la clase TFONT tiene mucha tarea, aunque ahí es donde está el error y la solución definitiva.

Re: SelFont

Posted: Sat Oct 13, 2012 8:17 am
by Eoeo
PLease profileNum function where I can found it ?