Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
Delphi 10.2 Tokyo Professional
|
Re: Inhalt mehrerer Richedit auf eine Seite drucken
4. Aug 2006, 13:28
Oder nimm die folgende Routine.
Delphi-Quellcode:
{ Druckt den Inhalt des angegebenen RichEdit-Fensters ab der Zeichenposition
"FromPos" in das angegebene Rechteck. Liefert die Zeichenposition des ersten
nicht mehr gedruckten Zeichens zurück.
}
const
PageRect_Twips = 144000;
PageRect_MM = 2540;
PageRect_Printer = 0;
function PrintRichEditIntoRect(RichEditHandle: HWND; const PageRect: TRect;
Scaling: Integer = PageRect_Printer; FromPos: Integer = 0): Integer;
var
Range: TFormatRange;
MM: Integer;
pho, lpx: TPoint;
begin
Range.hdc := Printer.Handle;
Range.hdcTarget := Range.hdc;
lpx.x := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSX);
lpx.y := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSY);
// In Druckerkoordinaten umwandeln falls nötig
if Scaling <> PageRect_Printer then
begin
Range.rc.Left := MulDiv(PageRect.Left, lpx.x, Scaling);
Range.rc.Top := MulDiv(PageRect.Top, lpx.y, Scaling);
Range.rc.Right := MulDiv(PageRect.Right, lpx.x, Scaling);
Range.rc.Bottom := MulDiv(PageRect.Bottom, lpx.y, Scaling);
// Druckoffset anpassen
pho.x := GetDeviceCaps(Range.hdc, PHYSICALOFFSETX);
pho.y := GetDeviceCaps(Range.hdc, PHYSICALOFFSETY);
OffsetRect(Range.rc, -pho.x, -pho.y);
end
else
Range.rc := PageRect;
// In Twips umwandeln
Range.rc.Left := MulDiv(Range.rc.Left, 144000, lpx.x);
Range.rc.Top := MulDiv(Range.rc.Top, 144000, lpx.y);
Range.rc.Right := MulDiv(Range.rc.Right, 144000, lpx.x);
Range.rc.Bottom := MulDiv(Range.rc.Bottom, 144000, lpx.y);
Range.rcPage := Range.rc;
Range.chrg.cpMin := FromPos;
Range.chrg.cpMax := -1;
MM := SetMapMode(Printer.Handle, MM_TEXT);
try
SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
Result := SendMessage(RichEditHandle, EM_FORMATRANGE, 1, Integer(@Range));
finally
SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
SetMapMode(Printer.Handle, MM);
end;
end;
Beispielcode:
Delphi-Quellcode:
procedure TForm1.Print1Click(Sender: TObject);
var
h: THandle;
rc: TRect;
pp: Integer;
begin
h := RichEdit1.Handle;
Printer.BeginDoc;
try
pp := 0;
rc := Rect(10, 10, 100, 100);
pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);
rc := Rect(110, 110, 200, 200);
pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);
rc := Rect(10, 110, 100, 200);
pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);
rc := Rect(110, 10, 200, 100);
pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);
Printer.EndDoc;
except
Printer.Abort;
raise;
end;
MessageDlg('Ausdruck erfolgte bis Zeichen ' + IntToStr(pp),
mtInformation, [mbOk], 0);
end;
|