Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
Delphi 12 Athens
|
Re: RichEdit drucken
31. Aug 2009, 15:33
Nochmal, schau Dir auf der Seite mal den ersten pinken Kasten an, da steht die Funktion samt einiger Konstantendeklarationen drin. Das muss natürlich auch in Deinen Code.
Zitat:
Delphi-Quellcode:
uses
Windows, RichEdit;
const
PageRect_Twips = 144000; // 100 * twips/inch
PageRect_Points = 7200; // 100 * pt/inch
PageRect_MM = 2540; // 100 * mm/inch
PageRect_Printer = 0;
function PrintRichEditIntoRect(RichEditHandle: HWND; const PageRect: TRect;
RectScaling: Integer = PageRect_Printer; StartPos: Integer = 0;
EndPos: Integer = -1): Integer;
var
Range: TFormatRange;
mm, lpx, lpy, pox, poy: Integer;
begin
Range.hdc := Printer.Handle;
Range.hdcTarget := Range.hdc;
// Get printer resolution
lpx := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSX);
lpy := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSY);
// Convert to device coordinates
if RectScaling <> PageRect_Printer then
begin
// Get physical printing offset
pox := GetDeviceCaps(Range.hdc, PHYSICALOFFSETX);
poy := GetDeviceCaps(Range.hdc, PHYSICALOFFSETY);
if RectScaling < 0 then
begin
Range.rc.Left := MulDiv(PageRect.Left, lpx, -RectScaling) - pox;
Range.rc.Top := MulDiv(PageRect.Top, lpy, -RectScaling) - poy;
Range.rc.Right := GetDeviceCaps(Range.hdc, PHYSICALWIDTH) -
MulDiv(PageRect.Right, lpx, -RectScaling);
Range.rc.Bottom := GetDeviceCaps(Range.hdc, PHYSICALHEIGHT) -
MulDiv(PageRect.Bottom, lpy, -RectScaling);
end
else
begin
Range.rc.Left := MulDiv(PageRect.Left, lpx, RectScaling) - pox;
Range.rc.Top := MulDiv(PageRect.Top, lpy, RectScaling) - poy;
Range.rc.Right := MulDiv(PageRect.Right, lpx, RectScaling) - pox;
Range.rc.Bottom := MulDiv(PageRect.Bottom, lpy, RectScaling) - poy;
end;
end
else
Range.rc := PageRect;
// Convert to twips
Range.rc.Left := MulDiv(Range.rc.Left, 144000, lpx);
Range.rc.Top := MulDiv(Range.rc.Top, 144000, lpy);
Range.rc.Right := MulDiv(Range.rc.Right, 144000, lpx);
Range.rc.Bottom := MulDiv(Range.rc.Bottom, 144000, lpy);
Range.rcPage := Range.rc;
Range.chrg.cpMin := StartPos;
Range.chrg.cpMax := EndPos;
mm := SetMapMode(Printer.Handle, MM_TEXT);
try
SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
Result := SendMessage(RichEditHandle, EM_FORMATRANGE, 1, Integer(@Range));
if Result < 0 then
Result := SendMessage(RichEditHandle, WM_GETTEXTLENGTH, 0, 0);
finally
SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
SetMapMode(Printer.Handle, mm);
end;
end;
Detlef "Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
|