1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
implementation
{$R *.dfm}
uses printers,ComCtrls, RichEdit,Types;
function PrintRTFToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
ARichEdit : TRichEdit; var ARect : TRect;RenderIt:boolean) : Longint;
var Range : TFormatRange;
begin
//Précaution
SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, 0);
if not RenderIt then
begin
SetRect(ARect,0,0,ARichEdit.Width,ARichEdit.Height);
end;
FillChar(Range, SizeOf(TFormatRange), 0);
Range.hdc := ACanvas.handle;
Range.hdcTarget := ACanvas.Handle;
Range.rc.left := ARect.Left * 1440 div ACanvas.font.PixelsPerInch;
Range.rc.top := Arect.Top * 1440 div ACanvas.font.PixelsPerInch;
Range.rc.right := ARect.Right * 1440 div ACanvas.font.PixelsPerInch;
Range.rc.Bottom := ARect.Bottom * 1440 div ACanvas.font.PixelsPerInch;
Range.chrg.cpMax := ToChar;
Range.chrg.cpMin := FromChar;
if RenderIt
then Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range))
else begin
Range.chrg.cpMax := ARichedit.GetTextLen;
Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, Longint(@Range));
ARect:=Range.rc;
ARect.Bottom := Range.rc.Bottom * Screen.PixelsPerInch div 1440;
end;
SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
end;
function PrintTextToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
Text : TStrings; var ARect : TRect;RenderIt:boolean) : Longint;
var ARichEdit:TRichEdit;
AHandle:HWND;
RelRect:TRect;
begin
ARichEdit:=TRichEdit.Create(nil);
try
finally
ARichEdit.Visible := False;
ARichEdit.Parent := Application.MainForm;
ARichEdit.Width:=round((ARect.Right-ARect.Left)*ARichEdit.Font.PixelsPerInch/ACanvas.Font.PixelsPerInch);
ARichEdit.Height:=round((ARect.Bottom-ARect.Top)*ARichEdit.Font.PixelsPerInch/ACanvas.Font.PixelsPerInch);
ARichEdit.Lines:=Text;
result:=PrintRTFToCanvas(ACanvas,FromChar,ToChar,ARichEdit,ARect,RenderIt);
ARichEdit.Free;
end;
end;
procedure TFMemo.BprintClick(Sender: TObject);
var RectGauche, RectDroite,CurrentRect:TRect;
i,x,y:integer;
FaireGauche:boolean;
FromChar, ToChar : integer;
marge:integer;
begin
printer.Orientation:=poLandscape;
marge:=round(printer.PageWidth/50);
RectGauche:=Rect(marge,marge,(printer.PageWidth div 2)-marge,(printer.PageHeight)-marge);
RectDroite:=Rect((printer.PageWidth div 2)+marge,marge,printer.PageWidth-marge,printer.PageHeight-marge);
FaireGauche:=true;
printer.BeginDoc;
printer.Canvas.Brush.Style:=bsClear;
Printer.Canvas.Brush.Color := clBlack;
i:=0;
FromChar:=0;
while FromChar<Length(memo1.Lines.Text) do
begin
if FaireGauche then CurrentRect:=RectGauche else CurrentRect:=RectDroite;
Tochar:=-1;
ToChar:=PrintTextToCanvas(printer.Canvas,FromChar,ToChar,memo1.Lines,CurrentRect,True);
Printer.Canvas.FrameRect(CurrentRect);
FromChar:=ToChar;
if odd(i) then printer.NewPage;
FaireGauche:=not FaireGauche;
inc(i);
end;
printer.EndDoc;
end;
end. |
Partager