Página 1 de 2

win_prn Centralizar texto

Enviado: 19 Nov 2015 13:17
por asimoes
Prezados,

Alguém tem algum exemplo usando win_prn para impressão de texto centralizado a esquerda e direita?

win_prn Centralizar texto

Enviado: 19 Nov 2015 14:04
por Jairo Maia
:textOut( <cString>], [<lNewLine>], [<lUpdatePosX>], [<nTexAlign>] )

Onde nTexAlign tem os seguintes valores:

0 = (padrão) alinhamento a esquerda
1 = alinhamento a direita
2 = alinhamento centralizado

win_prn Centralizar texto

Enviado: 19 Nov 2015 15:25
por asimoes
Olá Jairo,

Eu estou direcionando a impressão para uma impressora pdf (CutePdf Writer)

Eu tentei isso:

oPrn:SetPrc(8,0)
oPrn:Textout("ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS",.t.,.t.,1) //direita (imagem abaixo)

Quando alinhado a esquerda (com 0) aparece normal abaixo do logo, quando alinhado ao centro, não mostra nada.


aparece isso:
Screen Shot 11-19-15 at 03.22 PM.PNG

win_prn Centralizar texto

Enviado: 19 Nov 2015 16:06
por asimoes
Jairo,

Eu consegui, alinhar a direita e centralizar desta forma:

nColC:=(oPrn:MaxCol() - Len("ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS")) /2 * oPrn:CharWidth
nColR:=(oPrn:MaxCol() - Len("ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS")) * oPrn:CharWidth

oPrn:SetPrc(8,0)

oPrn:SetPos( nColc )
oPrn:Textout("ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS",.t.)
oPrn:SetPos( nColr )
oPrn:Textout("ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS",.t.)
Screen Shot 11-19-15 at 04.15 PM.PNG

win_prn Centralizar texto

Enviado: 19 Nov 2015 16:32
por asimoes

Código: Selecionar todos

 aVetor:={}
   
   aAdd(aVetor,{"ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS","C"})
   aAdd(aVetor,{"DA PREVIDÊNCIA SOCIAL NO ESTADO DO RIO DE JANEIRO","C"})
   aAdd(aVetor,{"Data: "+Padl(hb_dtoc(Date(),"DD/MM/YYYY"),10),"R"})
   aAdd(aVetor,{"Hora: "+Padl(Time(),10),"R"})
   aAdd(aVetor,{"Pág : "+Padl(StrZero(nPag,4),10),"R"})
   
   oPrn:SetPrc(8,0)
   
   For i:=1 To Len(aVetor)
      If aVetor[i,2] = "C"
         nAlign:=(oPrn:MaxCol() - Len(aVetor[i,1])) /2 * oPrn:CharWidth
      Else
         nAlign:=(oPrn:MaxCol() - Len(aVetor[i,1])) * oPrn:CharWidth
      Endif
      oPrn:SetPos( nAlign )
      oPrn:Textout(aVetor[i,1],.t.)
   Next
O resultado ficou assim:
Screen Shot 11-19-15 at 04.31 PM.PNG

win_prn Centralizar texto

Enviado: 19 Nov 2015 18:58
por asimoes
Minha função de testes para impressão de cabeçalhos está ficando assim:

Código: Selecionar todos

STATIC PROCEDURE PrintCabec( oPrn, cBitFile, nPag )

   LOCAL oBMP, nLinha:=210, nColuna:=130, nColFixed, nHandleFile, nWidth, nHeight 

   hb_Default(@nPag, 1)

   nHandleFile:=hwg_Fi_load( cBitFile )
 
   nWidth:=hwg_Fi_getwidth( nHandleFile )
   
   nHeight:=hwg_Fi_getheight( nHandleFile )
   
   aVetor:={}
   
   aAdd(aVetor,{"ASSOCIAÇÃO DOS APOSENTADOS E PENSIONSTAS","C"})
   aAdd(aVetor,{"DA PREVIDÊNCIA SOCIAL NO ESTADO DO RIO DE JANEIRO","C"})
   aAdd(aVetor,{"Data: "+Padl(hb_dtoc(Date(),"DD/MM/YYYY"),10),"R"})
   aAdd(aVetor,{"Hora: "+Padl(Time(),10),"R"})
   aAdd(aVetor,{"Pág : "+Padl(StrZero(nPag,4),10),"R"})
   aAdd(aVetor,{"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012","L"})
   aAdd(aVetor,{"0        10        20        30        40        50        60        70        80        90       100       110       120         132","L"})
   aAdd(aVetor,{Replicate("-",132),"L"})
   oPrn:SetPrc(3,0)
   
   For i:=1 To Len(aVetor)
      Switch aVetor[i,2]
      Case "C"
         nAlign:=(oPrn:MaxCol() - Len(aVetor[i,1])) /2 * oPrn:CharWidth
         Exit
      Case "R" 
         nAlign:=(oPrn:MaxCol() - Len(aVetor[i,1])) * oPrn:CharWidth
         Exit
      Case "L"
         nAlign:=3 * oPrn:CharWidth
         Exit
      EndSwitch
      oPrn:SetPos( nAlign )
      oPrn:Textout(aVetor[i,1],.t.)
   Next
  
   IF ! Empty( cBitFile )
      IF hb_vfExists( cBitFile )
         oBMP := win_BMP():New()
         IF oBmp:loadFile( cBitFile )
            oBmp:Draw( oPrn, { nColuna, nLinha, nWidth, nHeight } )
            /* Note: Can also use this method to print bitmap */
            //oBmp:Rect := { nColuna, nLinha, nWidth, nHeight }
            //oPrn:DrawBitmap( oBmp )
         ENDIF
         oBMP:Destroy()
      ENDIF
   ENDIF

   //oPrn:SetPrc( oPrn:PRow() + 1, 0 ) //Se for necessário pular uma linha
   
RETURN
Screen Shot 11-19-15 at 06.53 PM.PNG

win_prn Centralizar texto

Enviado: 19 Nov 2015 23:24
por Jairo Maia
Olá Alexandre,

Realmente. Fiz alguns testes aqui e o parâmetro 2 (centralizar) não funciona mesmo. E verificando meus relatórios (usando fonte padrão) vi que uso também a função PadC() para centralizar a numeração da página. Algo como:

Código: Selecionar todos

#include "WinGdi.ch"

Function Main()

 nPagina := 1
 
 oPrinter := Win_Prn():new( GetDefaultPrinter() )
 oPrinter:FormType  := DMPAPER_A4
 oPrinter:Create()
 oPrinter:StartDoc()
 oPrinter:NewLine()
 
 oPrinter:SetPrc( oPrinter:MaxRow()-1, 1 )
 oPrinter:TextOut( Replicate( "-", oPrinter:MaxCol() ), .t. )
 oPrinter:TextOut( PadC( "Pagina " + Hb_NToS( nPagina ), oPrinter:MaxCol() ) )

 oPrinter:EndDoc()
 oPrinter:Destroy()

Return Nil

win_prn Centralizar texto

Enviado: 21 Nov 2015 14:41
por Toledo
Amigos, vejam este exemplo:

Código: Selecionar todos

#include "hbwin.ch"

Function Main()

 oPrinter:=Win_Prn():new( "PDFCreator" )
 oPrinter:Create()
 oPrinter:StartDoc("Teste")

 nAliCen:=hb_BitOr( WIN_TA_BASELINE, WIN_TA_CENTER )
 oPrinter:SetPrc( oPrinter:maxRow()/2, oPrinter:maxCol()/2 )
 oPrinter:TextOut("|---> texto centralizado <---|",,,nAliCen)
 oPrinter:SetPrc( oPrinter:pRow()+2, oPrinter:maxCol()/2 )
 oPrinter:TextOut("|---> outra linha centralizado <---|",,,nAliCen)

 oPrinter:SetPrc( oPrinter:pRow()+3, 5 )
 oPrinter:TextOut("|---> texto esquerda")
 oPrinter:SetPrc( oPrinter:pRow()+2, 5 )
 oPrinter:TextOut("|---> outra linha na esquerda")

 nAliDir:=hb_BitOr( WIN_TA_BOTTOM, WIN_TA_RIGHT )
 oPrinter:SetPrc( oPrinter:pRow()+3, oPrinter:maxCol()-5)
 oPrinter:TextOut("texto direita <---|",,,nAliDir)
 oPrinter:SetPrc( oPrinter:pRow()+2, oPrinter:maxCol()-5)
 oPrinter:TextOut("outra linha na direita <---|",,,nAliDir)

 oPrinter:EndDoc()
 oPrinter:Destroy()

Return Nil
Abraços,

win_prn Centralizar texto

Enviado: 21 Nov 2015 17:10
por asimoes
Toledo e Jairo,

Obrigado pelas dicas.

Temos então 3 soluções para alinhar um texto na página:


aVetor:={"=== TEXTO CENTRALIZADO ===","C"}

oPrn:SetPrc(3, 0)

Minha solução:
nAlign:=(oPrn:MaxCol() - Len(aVetor[1])) /2 * oPrn:CharWidth
oPrn:SetPos( nAlign )
oPrn:Textout(aVetor[1],.T.)

Solução Jairo:

oPrn:TextOut( PadC(aVetor[1], oPrn:MaxCol() ), .T. )

Solução Toledo:

nAlignC:=hb_BitOr( WIN_TA_BASELINE, WIN_TA_CENTER )
oPrn:SetPrc( oPrn:pRow()+1, oPrn:maxCol()/2 )
oPrn:TextOut(aVetor[1],,,nAlignC)

:-Y

win_prn Centralizar texto

Enviado: 21 Nov 2015 17:29
por asimoes
Fiz um teste com as 3 soluções e a solução usando padc() deu uma diferença

Tentando:

oPrn:TextOut( PADC(aVetor[1], oPrn:maxCol()),.T.)

Ou

oPrn:TextOut( PADC(aVetor[1], oPrn:maxCol()+1),.T.)

Ou

oPrn:TextOut( PADC(aVetor[1], oPrn:maxCol()-1),.T.)

Não alinhou

A primeira linha da imagem foi usando padc()

Não alinhou com os outros resultados a imagem abaixo:
Screen Shot 11-21-15 at 05.21 PM.PNG

win_prn Centralizar texto

Enviado: 21 Nov 2015 18:27
por Jairo Maia
Olá Toledo,

Valeu a dica. Mais uma alternativa. Curioso é que tanto nAliCen e nAliDir retornam 30, mas para funcionar tem que usar como você fez.

Alexandre, uma coisa que percebi é que para ficar correto o alinhamento com PadC() usando MaxCol() precisa iniciar na coluna 1. Com seu exemplo está iniciando na coluna 0 (zero).

win_prn Centralizar texto

Enviado: 21 Nov 2015 19:22
por Ruben Dario
? Por casulidad has colocado codiog de barras

Saludos

win_prn Centralizar texto

Enviado: 03 Fev 2016 00:33
por cjp
Colegas, estou testando o exemplo do Toledo, que funcionou perfeitamente, exceto por um detalhe: ao transpor para o meu sistema, ele está imprimindo no centro da página. Quero dizer: não apenas com alinhamento central entre a margem esquerda e a direita, como eu queria, mas também no centro entre o topo e o fim da página, e não estou conseguindo mudar isso.

Estou fazendo assim:

Código: Selecionar todos

#include "hbwin.ch"
oPrn:SetFont('Times New',22, {1,12}, 0,.T.,.F.)
nAliCen:=hb_BitOr( WIN_TA_BASELINE, WIN_TA_TOP )
oPrn:SetPrc( oPrn:maxRow()/2, oPrn:maxCol()/2 )
oPrn:TextOut("Teste - FAPI",,,nAlicen)
Tentei alterar a chamada à maxrow()/2, que imagino que esteja causando o problema, para várias outras formas, mas nunca dá certo.

Como faço para corrigir isso?

win_prn Centralizar texto

Enviado: 03 Fev 2016 07:49
por ANDRIL
cjp escreveu:oPrn:SetPrc( oPrn:maxRow()/2, oPrn:maxCol()/2 )
Mudar maxRow()? Já tentou retirá-la.

Código: Selecionar todos

oPrn:SetPrc( oPrn:0, oPrn:maxCol()/2 )
Até+

win_prn Centralizar texto

Enviado: 03 Fev 2016 10:37
por cjp
Foi o que eu quis dizer: tentei substituir maxrow()/2 por 0, ou por 1, ou por row(). Mas, estranhamente, dá erro na compilação.