SelFont

SelFont

Postby Manuel Valdenebro » Sun Nov 23, 2008 5:47 am

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?.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby Antonio Linares » Mon Nov 24, 2008 8:57 am

Manuel,

Este ejemplo funciona bien:
Code: Select all  Expand view
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41406
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Manuel Valdenebro » Mon Nov 24, 2008 12:16 pm

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  Expand view

#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

Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby Antonio Linares » Mon Nov 24, 2008 1:27 pm

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/ms534214(VS.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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41406
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Manuel Valdenebro » Mon Nov 24, 2008 3:29 pm

Antonio,

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

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby pymsoft » Mon Nov 24, 2008 4:08 pm

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  Expand view
#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


Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby Manuel Valdenebro » Mon Nov 24, 2008 5:11 pm

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.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby pymsoft » Tue Nov 25, 2008 8:35 am

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
Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby Antonio Linares » Tue Nov 25, 2008 8:44 am

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 :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41406
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby pymsoft » Tue Nov 25, 2008 10:05 am

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  Expand view
#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
Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Postby Manuel Valdenebro » Tue Nov 25, 2008 4:50 pm

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.
Un saludo

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Re: SelFont

Postby Eoeo » Sat Oct 13, 2012 8:17 am

PLease profileNum function where I can found it ?
User avatar
Eoeo
 
Posts: 222
Joined: Mon Jun 04, 2012 12:00 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 40 guests