Sim, Jairo, sei disso sim.. Só uso Lucida Console.
Poka, nao é bem isso. Esse calculo eu faço de uma outra forma, mas sim, todos tem que chegar no mesmo lugar.
O que queimou meus miolos é que após eu definir os tamanhos de fonte, OS PRÓPRIOS METODOS DA WIN_PRN retornavam valores incoerentes (veja o post de abertura do tópico). O :CharWidth que ele definia não era apropriado para o CPP que eu informei no array de 2 elementos de :SetFont. (Só dá o problema com CPP quebrado, CPP inteiro fica tudo certo.)
PPP=600 (pixels por polegada) dividido pelo CPP que voce define no famigerado array {1,9.43}, dá 63.6. Como o pixel nao pode ser "quebrado", isso, na minha cabeça, teria que gerar OBRIGATORIAMENTE um :CharWidth de 63 ou 64, mas gerava 67.
Resolvi o problema quando descobri que o divisor (primeiro elemento do array) muito baixo aumentava a incoerencia. Divisor 1 é o pior (NUNCA USE {1,CPP}. Esse era o vilão. Aumente o divisor. Quanto maior a fonte, maior tem que ser o divisor senao vai dar errado. Fontes garrafais dá errado completamente se voce usar divisor 1.
Resumindo, nao entendi o porque mas resolvi, informando um array {2000,2000*CPP}. Assim o :CharWidth ficou coerente e tudo deu certo. O :CharWidth é essencial pra suas contas darem certo.
Experimente compilar e rodar o teste abaixo pra voces verem o que estou falando. É muito louco. O divisor 1 estraga tudo. Confira aí.
A proposito, uso HB3.0, nos mais novos nao sei se mudaram isso.
Código: Selecionar todos
*#include "visual2.ch"
#include "common.ch"
#Include "dbinfo.ch"
#include "hbdyn.ch"
REQUEST HB_CodePage_ITISB
REQUEST HB_CodePage_PT860
REQUEST DBFCDX
hb_langSelect( "pt" )
*#require "hbmisc"
*#require "hbfoxpro"
func main
#include "hbgtinfo.ch"
#include "inkey.ch"
#include "directry.ch"
*Set( _SET_CODEPAGE, "ITISB" )
Set( _SET_CODEPAGE, "PT850" )
SET( _SET_EVENTMASK, INKEY_ALL - INKEY_MOVE )
*SET( _SET_EVENTMASK, INKEY_ALL )
rddsetdefault([DBFCDX])
hb_gtinfo( HB_GTI_ICONFILE , [rei.ico] )
hb_gtInfo( HB_GTI_FONTNAME , "Lucida Console" )
hb_gtinfo( HB_GTI_FONTSIZE , 24 )
hb_gtinfo( HB_GTI_FONTWIDTH, 36 )
para impressora
* Se nao informou a impressora no parametro pega a primeira da lista
if impressora=NIL
a=Getprinters()
impressora=a[1]
endif
oJob = win_prn():New(impressora)
oJob:Create()
oJob:Landscape:= .F.
oJob:SetPrintQuality(-1)
oJob:Copies:= 1
oJob:FormType:= 9 // A4
*clear
CPP=0
accept [CPP desejado : ] to CPP
CPP=val(strtran(CPP,[,],[.]))
PPP = oJob:PixelsPerInchX
melhor=round(PPP/CPP,0)
? [Pixels por Polegada (PPP) = ]+str(PPP,5,0)
? [Melhor valor para :CharWidth (PPP / CPP) = ]+str(melhor,4,0)
for divisor=1 to 10
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
next
for divisor=20 to 100 step 10
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
next
for divisor=200 to 1000 step 100
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
next
divisor=1500
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
divisor=2000
oJob:SetFont([Lucida Console], 12, {divisor,divisor*CPP})
? [Divisor = ]+str(divisor,4,0)+[ / :CharWidth = ]+str(oJob:CharWidth,4,0)
? []
quit