Impressao - criando e usando com a impressora as fontes Draft 10cpi, Draft 12cpi e Draft 17cpi

Top  Previous  Next

// criando e usando com a impressora as fontes Draft 10cpi, Draft 12cpi e Draft 17cpi

// FIQUEI QUASE 2 ANOS TENTANDO PARA FAZER ISSO!!! - AGORA NAO É SÓ O WORD QUE FAZ

// Ass. Flávio Junior

// Dê preferencia para o método usando METAFILE, mas mantive o método bitmap

// para ver como funciona caso realmente seja necessario usa-lo

 

unit DraftFontUnit;

 

interface

 

uses Forms, Classes, Controls, StdCtrls, Windows, Graphics, ARotinasUnit, Printers;

 

type

  TDraftFontForm = class(TForm)

    ImprimirComBitMapBtn: TButton;

    B66Btn: TButton;

    B88Btn: TButton;

    ImprimirComMetaFileBtn: TButton;

    Button2: TButton;

    Button4: TButton;

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure ImprimirComBitMapBtnClick(Sender: TObject);

    procedure ImprimirComMetaFileBtnClick(Sender: TObject);

  end;

 

var

  DraftFontForm: TDraftFontForm;

  // usados para criação das fontes:

  LogFont  : tagLOGFONTA;

  FontHSize: Integer;

  // variaveis do tipo TFont

  F10CPP , F17CPP , F12CPP , F20CPP       : TFont;

  F10CPPB, F17CPPB, F12CPPB, F20CPPB, FExp: TFont;

 

const

  Texto10 = '10cpp/6lpp  Teste para com 10 cpp e 6  LINHAS POR POLEGADAS, ESTE E MODO NORM=80';

  Texto12 = '12cpp/6lpp  Teste para com 12 cpp  e  6 linhas POR POLEGADAS, ESTE E MODO UM POUCO MENOR QUE =96';

  Texto17 = '17cpp/6lpp  Teste para com 17 cpp e 6 linhas por polegadas, este E MODO COMPRIMIDO DE IMPRESSÃO ESTA LINHA SERA IMPRESSA APENAS 1 VEZ=137';

  Texto20 = '20cpp/6lpp  Teste para com 20 cpp e 6 linhas por polegadas, este e modo super COMPRIMIDO DE IMPRESSÃO, ESTA LINHA SERA IMPRESSA APENAS UMA VEZ+COMPLEMENTO = 160';

 

implementation

 

{$R *.dfm}

 

procedure TDraftFontForm.FormCreate(Sender: TObject);

begin

  // carrega alguns parametros necessários que serão comuns as fontes

  FontHSize := 98;

  LogFont.lfHeight         := FontHSize;           LogFont.lfEscapement     := 0;

  LogFont.lfOrientation    := 0;                   LogFont.lfItalic         := 0;

  LogFont.lfUnderline      := 0;                   LogFont.lfStrikeOut      := 0;

  LogFont.lfWeight         := FW_NORMAL;           LogFont.lfCharSet        := DEFAULT_CHARSET;

  LogFont.lfOutPrecision   := OUT_DEFAULT_PRECIS;  LogFont.lfClipPrecision  := CLIP_DEFAULT_PRECIS;

  LogFont.lfQuality        := DRAFT_QUALITY;       LogFont.lfPitchAndFamily := FIXED_PITCH;

  LogFont.lfFaceName       := 'InternalFont';

 

  // cria as fontes internas

  F10CPP := TFont.Create;  F12CPP := TFont.Create;  F17CPP := TFont.Create;  F20CPP := TFont.Create;

  F10CPPB:= TFont.Create;  F12CPPB:= TFont.Create;  F17CPPB:= TFont.Create;  F20CPPB:= TFont.Create;

  FExp   := TFont.Create;

 

  // fontes normais

  LogFont.lfWidth  := 57;    F10CPP.Handle    := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 47;    F12CPP.Handle    := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 33;    F17CPP.Handle    := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 28;    F20cpp.Handle    := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 68;    FExp.Handle      := CreateFontIndirect(LogFont);

 

  // fontes bold.

  LogFont.lfWeight := FW_BOLD;

  LogFont.lfWidth  := 59;   F10cppB.Handle   := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 49;   F12CPPB.Handle   := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 34;   F17CPPB.Handle   := CreateFontIndirect(LogFont);

  LogFont.lfWidth  := 29;   F20cppB.Handle   := CreateFontIndirect(LogFont);

end;

 

procedure TDraftFontForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  // libera fontes da memoria

  F10CPP.Free;  F12CPP.Free;  F17CPP.Free;  F20CPP.Free;  F10CPPB.Free;  FExp.Free;

end;

 

// criando impressão via bitmap (muito mais lento)

procedure TDraftFontForm.ImprimirComBitMapBtnClick(Sender: TObject);

var

  OldBkMode, I, Y, H, PY, Max: Integer;

  Bit: TBitmap;

begin

  Bit                    := TBitmap.Create;

  Bit.Monochrome         := True;                                     // monocromatico senão fica zolhentos megabaites

  Bit.Canvas.Font        := F10CPP;                                   // fonte padrão

  Bit.Width              := Bit.Canvas.TextWidth(RepeteStr('W',81));  // largura que precisaremos do bitmap

  Bit.Height             := Printer.PageHeight;

  Bit.Canvas.Brush.Color := clWhite;

  OldBkMode              := SetBkMode(Handle, TRANSPARENT);           // modo transparente no canvas

  PY                     := 1;

 

  // tem 3 botões na tela, (tag = 1,66,88) tag = 1 é só para imprimir as fontes diferentes (tag = 1)

  if TComponent(Sender).Tag = 1 then

  begin

    Y := 100;

    Bit.Canvas.Font := F10CPP;   Bit.Canvas.TextOut(1, PY, Texto10);          Inc(PY, Y);

    Bit.Canvas.Font := F10CPPB;  Bit.Canvas.TextOut(1, PY, Texto10);          Inc(PY, Y);

    Bit.Canvas.Font := F12CPP;   Bit.Canvas.TextOut(1, PY, Texto12);          Inc(PY, Y);

    Bit.Canvas.Font := F12CPPB;  Bit.Canvas.TextOut(1, PY, Texto12);          Inc(PY, Y);

    Bit.Canvas.Font := F17CPP;   Bit.Canvas.TextOut(1, PY, Texto17);          Inc(PY, Y);

    Bit.Canvas.Font := F17CPPB;  Bit.Canvas.TextOut(1, PY, Texto17);          Inc(PY, Y);

    Bit.Canvas.Font := F20CPP;   Bit.Canvas.TextOut(1, PY, Texto20);          Inc(PY, Y);

    Bit.Canvas.Font := F20CPPB;  Bit.Canvas.TextOut(1, PY, Texto20);          Inc(PY, Y);

    Bit.Canvas.Font := FExp;     Bit.Canvas.TextOut(1, PY, 'EXPANDIDO NORMAL');

  end

  else // outros 2 botões

  begin

    if TComponent(Sender).Tag = 66 then  // tag = 66 é um teste de 6LPP

    begin

      H   := Bit.Canvas.TextHeight('ÇÁ') + 4;

      Max := 63;

    end

    else                                 // tag = 88 é um teste de 6LPP

    begin

      H   := Bit.Canvas.TextHeight('ÇÁ') - 22;

      Max := 83;

    end;

    // preenche a folha com bobissas

    for I := 1 to Max do

    begin

      Bit.Canvas.TextOut(1, PY, StrZero(I, 2) + '_ÇÁ_1,2_' + RepeteStr(' 234567890'7));

      Inc(PY, H);

    end;

  end;

 

  // imprime

  Printer.BeginDoc;

  Printer.Canvas.Draw(1,1,Bit);

  Printer.EndDoc;

 

  SetBkMode(Handle, OldBkMode);

  Bit.Free;

end;

 

// criando impressão via metafile (infinitamente + rapido e menor)

procedure TDraftFontForm.ImprimirComMetaFileBtnClick(Sender: TObject);

var

  Meta    : TMetafile;

  MFCanvas: TMetaFileCanvas;

  I, Y, H, PY, Max: Integer;

begin

  Meta          := TMetafile.Create;       // cria o MetaFile

  Meta.Width    := Printer.PageWidth;      // seta os tamanhos

  Meta.Height   := Printer.PageHeight;

  MFCanvas      := TMetafileCanvas.Create(Meta, 0);  // cria um "canvas" que será usado para "desenhar" cada folha

  MFCanvas.Font := F10CPP;

  PY            := 1;

 

  // tem 3 botões na tela, (tag = 1,66,88) tag = 1 é só para imprimir as fontes diferentes (tag = 1)

  if TComponent(Sender).Tag = 1 then

  begin

    Y := 100;

    MFCanvas.Font := F10CPP;   MFCanvas.TextOut(1, PY, Texto10);          Inc(PY, Y);

    MFCanvas.Font := F10CPPB;  MFCanvas.TextOut(1, PY, Texto10);          Inc(PY, Y);

    MFCanvas.Font := F12CPP;   MFCanvas.TextOut(1, PY, Texto12);          Inc(PY, Y);

    MFCanvas.Font := F12CPPB;  MFCanvas.TextOut(1, PY, Texto12);          Inc(PY, Y);

    MFCanvas.Font := F17CPP;   MFCanvas.TextOut(1, PY, Texto17);          Inc(PY, Y);

    MFCanvas.Font := F17CPPB;  MFCanvas.TextOut(1, PY, Texto17);          Inc(PY, Y);

    MFCanvas.Font := F20CPP;   MFCanvas.TextOut(1, PY, Texto20);          Inc(PY, Y);

    MFCanvas.Font := F20CPPB;  MFCanvas.TextOut(1, PY, Texto20);          Inc(PY, Y);

    MFCanvas.Font := FExp;     MFCanvas.TextOut(1, PY, 'EXPANDIDO NORMAL');

  end

  else  // outros 2 botões

  begin

    if TComponent(Sender).Tag = 66 then

    begin

      H   := MFCanvas.TextHeight('ÇÁ')  +4;    // tag = 66 é um teste de 6LPP        A = +4,  Cartao =  -2

      Max := 66;

    end

    else

    begin

      H   := MFCanvas.TextHeight('ÇÁ') - 22;  // tag = 88 é um teste de 6LPP        A4 = 22,  Carta  =  26

      Max := 88;

    end;

    // preenche a folha com bobissas

    for I := 1 to Max do

    begin

      MFCanvas.TextOut(1, PY, StrZero(I, 2) + '_ÇÁ_1,2_' + RepeteStr(' 234567890'7));

      Inc(PY, H);

    end;

  end;

 

  MFCanvas.Free;

  // sava em arquivo para poder ser "consultado' (nao necessário)

  Meta.SaveToFile('c:\teste.wmf');

 

  // imprime

  Printer.BeginDoc;

  Printer.Canvas.Draw(1,1,Meta);

  Printer.EndDoc;

 

  Meta.Free;

end;

 

end.