Obrigado Gilberto pelas dicas e desculpe não ter retornado antes. De fato sirviram-me em grande parte mas tive bastante trabalho para entender tudo como funciona.
1. Tive sempre o pensamento que tudo que era xHarbour não servia para Harbour. Existem poucas diferenças, nada que não possa ser adaptado de um para o outro. Uma delas neste meu caso é o uso do "WIN32PRN" do xHarbour que substiuí por WIN_PRN para funcionar com Harbour. Essa explicação tem de bastante no fórum.
2. Discordei com a utilização da função TextOut() através de linha e coluna (como no @ lin,col say do Clipper) ora porque eu disse que a minha necessidade estava em fazer em forma gráfica. Claro que fazer a impressão em modo gráfico, não é aconselhável em impressoras matricias, mais ainda pela imprecisão de posição do papel durante a troca de folha soltas (nem sempre é no mesmo lugar), por isso eu ja possuo impressão de etiqueta em formulário contínuo para etiquetas, onde a remalinas ajuda muito no tracionamento e fixação do papel. Daí sim é aconselhável o uso da impressão não gráfica. Mas como agora praticamente as impressoras USBs de jato de tinta e laser estão a um preço mais acessíveis e os formulário de etiquetas não se adequam a impressão não gráfica, isto é, porque o espaçamento de uma etiqueta a outra tem que ser corrigido constantemente e isso ja causou muito problema para meus clientes. Por isso decidí fazer duas formas de impressão, conforme a impressora. Então em lugar do TextOut() coloquei o TextOut
At() no qual posso informar em pixels o que me dá maior precisão no posicionamento de cada etiqueta. Que constem outras funções para impressão como:
Código: Selecionar todos
oPrinter:textAtFont([<nPosX>] , ;
[<nPosY>] , ;
<cString> , ;
[<cFontName>] , ;
[<nPointSize>] , ;
[<nFontWidth>] , ;
[<nFontWeight>], ;
[<lUnderLine>] , ;
[<lItalic>] , ;
[<lNewLine>] , ;
[<lUpdatePosX>], ;
[<nTextColor>] , ;
[<nTextAlign>] ) --> lSuccess
oPrinter:textOutAt([<nPosX>] , ;
[<nPosY>] , ;
<cString> , ;
[<lNewLine>] , ;
[<lUpdatePosX>], ;
[<nTextAlign>] ) --> lSuccess
3. Você fala de diferentes resoluções entre uma impressora e outra, mas mesmo assim não creio que isso interfira na precisão do posicionamento de cada etiqueta. Pois acredito que quando se trata em definir o tamanho da fonte de acordo o PointSize do SetFont() deva ser para todas as impressoras o mesmo. É dizer um caracter de tamanho 8cpp é igual para todas. Vou ainda fazer testes em jato tinta e laser para constatar essa questão.
4. No seu código exemplo, faltou o essencial: SetFont() e eu me batí muito, pois tinha visto um exemplo de um colega e que estava errado e ainda eu tinha colocado antes do "oPrinter:Create()" daí nunca mudava o tamanho e eu ficava fustrado, até que hoje de manhã percebí o meu erro.
5. Outra coisa que sempre me deixou em dúvidas, é como fazer a compilação para que fique registrado fiz assim:
HBMK2 -lhbwin -lxhb etq1.prg
Eu gosto de relatar a minha experiência, pois é assim que podemos contribuir para esclarecer futuras dúvidas de outros colegas. E por isso estou passando o meu primeiro exemplo de impressão:
Código: Selecionar todos
#include "hbcompat.ch"
#define FORM_A4 9
Function Main()
cprinter := GetDefaultPrinter()
oprinter:= win_prn():new(cprinter)
oPrinter:Landscape:= .F.
oPrinter:FormType := FORM_A4
oPrinter:Copies := 1
oPrinter:CharSet(255)
oPrinter:Create()
oPrinter:startDoc()
// sintaxe: oPrinter:setFont(cFontName, nPointSize, nFontWidth, nFontWeight, lUnderline, lItalic, nCharSet)
oPrinter:SetFont('Times New Roman', 06, 0 , , , ,255)
oPrinter:TextOutAt( 30.00, 66.00, 'ABCDEFGHIJKLMNOPQR')
oPrinter:SetFont('Courier New', 18, 0 , , , ,255)
oPrinter:TextOutAt( 30.00, 106.00, '12345')
oPrinter:SetFont('Arial Narrow', 06, 0 , , , ,255)
oPrinter:TextOutAt( 30.00, 116.00, 'ABCDEFGHIJKLMNOPQRST')
oprinter:enddoc()
oprinter:destroy()
return nil
Vou ainda melhor este código, com certeza. Um dos pequenos desafios é centralizar o texto, mas não farei com PADC() é dizer não farei pela quantidade de caracteres, farei pelo tamnho em pixels que ocoupa uma determinada string com cada fonte utilizada. Só para efeito de aprendizado, pois fazendo pelo tamanho de string nem sempre fica perfeita a centralização, principalmente com fonte proporcionais não de tamanho fixo como a Courrier e Courrier New.