Roland Reimann
2014-12-05 08:05:23 UTC
Hallo,
ich habe folgendes Problem mit dem gemischten Drucken diverser Inhalte
auf einer Seite, also innerhalb eines BeginDoc und EndDoc.
Zunächst wird Text (TextOut) und Graphik (MoveTo, LineTo) auf die
PrinterCanvas gedruckt.
Dann werden formatierte RichEdit-Inhalte dazu gedruckt. Dies passiert
mit der unten angehängten Funktion. Diese Funktion schaltet auf einen
anderen MapMode (auf MM_Text, vorher MM_HIMETRIC), druckt den
RichEdit-Text mit EM_FORMATRANGE und schaltet danach wieder auf den
ursprünglichen MapMode zurück.
Bis hierhin funktioniert alles einwandfrei.
Wird nach dem Drucken eines RichEdit-Textes aber wieder normaler Text
gedruckt (mit TextOut), dann kann ich die Schriftgröße des mit TextOut
gedruckten Textes nicht mehr verändern. Das Verändern von
Printer.Canvas.Font.Height hat keinen Effekt mehr.
Was muss nach dem Drucken des RichEdits rückinitialisiert werden,
damit die Schriftgröße für TextOut wieder verändert werden kann?
Das zwischenzeitliche Verändern des MapMode funktioniert übrigens
einwandfrei. Dies ist durch MoveTo LineTo im ursprünglichen
MapMode-Koordinatensystem verifiziert.
Ich bin für jeden Hinweis dankbar.
(System: XE4, Win7)
Gruß
Roland
Funktion zum Drucken eines RichEdit-Textes:
// Quelle: http://flocke.vssd.de/prog/tips/pascal/prtred/
// Leicht modifiziert
function PrintRichEditIntoRect(RichEditHandle : HWND;
PageRect : TRect;
RectScaling : Integer;
StartPos : Integer;
EndPos : Integer;
var bisYMM : integer): Integer;
var
Range: TFormatRange;
mm, lpx, lpy, pox, poy: Integer;
begin
// Druck bis mm initialisieren :
bisYmm := 0;
// Handle zuweisen :
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;
// Es wird kurzzeitig auf MM_Text geschaltet um später wieder auf
den
// Ursprünglichen MapMode zurück :
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);
if RectScaling < 0 then
begin
end
else
begin
bisYMM := round(((Range.rc.Bottom*lpy/144000) + poy) *
RectScaling / lpy);
end;
finally
SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
SetMapMode(Printer.Handle, mm);
end;
end;
ich habe folgendes Problem mit dem gemischten Drucken diverser Inhalte
auf einer Seite, also innerhalb eines BeginDoc und EndDoc.
Zunächst wird Text (TextOut) und Graphik (MoveTo, LineTo) auf die
PrinterCanvas gedruckt.
Dann werden formatierte RichEdit-Inhalte dazu gedruckt. Dies passiert
mit der unten angehängten Funktion. Diese Funktion schaltet auf einen
anderen MapMode (auf MM_Text, vorher MM_HIMETRIC), druckt den
RichEdit-Text mit EM_FORMATRANGE und schaltet danach wieder auf den
ursprünglichen MapMode zurück.
Bis hierhin funktioniert alles einwandfrei.
Wird nach dem Drucken eines RichEdit-Textes aber wieder normaler Text
gedruckt (mit TextOut), dann kann ich die Schriftgröße des mit TextOut
gedruckten Textes nicht mehr verändern. Das Verändern von
Printer.Canvas.Font.Height hat keinen Effekt mehr.
Was muss nach dem Drucken des RichEdits rückinitialisiert werden,
damit die Schriftgröße für TextOut wieder verändert werden kann?
Das zwischenzeitliche Verändern des MapMode funktioniert übrigens
einwandfrei. Dies ist durch MoveTo LineTo im ursprünglichen
MapMode-Koordinatensystem verifiziert.
Ich bin für jeden Hinweis dankbar.
(System: XE4, Win7)
Gruß
Roland
Funktion zum Drucken eines RichEdit-Textes:
// Quelle: http://flocke.vssd.de/prog/tips/pascal/prtred/
// Leicht modifiziert
function PrintRichEditIntoRect(RichEditHandle : HWND;
PageRect : TRect;
RectScaling : Integer;
StartPos : Integer;
EndPos : Integer;
var bisYMM : integer): Integer;
var
Range: TFormatRange;
mm, lpx, lpy, pox, poy: Integer;
begin
// Druck bis mm initialisieren :
bisYmm := 0;
// Handle zuweisen :
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;
// Es wird kurzzeitig auf MM_Text geschaltet um später wieder auf
den
// Ursprünglichen MapMode zurück :
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);
if RectScaling < 0 then
begin
end
else
begin
bisYMM := round(((Range.rc.Bottom*lpy/144000) + poy) *
RectScaling / lpy);
end;
finally
SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
SetMapMode(Printer.Handle, mm);
end;
end;