SelFont
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
SelFont
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?.
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
Manuel
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Manuel,
Este ejemplo funciona bien:
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
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
Antonio,Antonio Linares wrote:Este ejemplo funciona bien:
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
Un saludo
Manuel
Manuel
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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.
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.
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
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
Pedro Gonzalez
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
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.
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
Manuel
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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
> ¿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
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:
Saludos
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
Pedro Gonzalez
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
Pedro, excelente.pymsoft wrote:Aqui una posible solucion
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
Manuel
Re: SelFont
PLease profileNum function where I can found it ?